00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __itkProcessObject_h
00021 #define __itkProcessObject_h
00022
00023 #include "itkObject.h"
00024 #include "itkDataObject.h"
00025 #include "itkMultiThreader.h"
00026 #include "itkObjectFactory.h"
00027 #include <vector>
00028
00029 namespace itk
00030 {
00031
00087 class ITKCommon_EXPORT ProcessObject : public Object
00088 {
00089 public:
00091 typedef ProcessObject Self;
00092 typedef Object Superclass;
00093 typedef SmartPointer<Self> Pointer;
00094 typedef SmartPointer<const Self> ConstPointer;
00095
00097 itkTypeMacro(ProcessObject,Object);
00098
00100 typedef DataObject::Pointer DataObjectPointer;
00101
00103 typedef std::vector<DataObjectPointer> DataObjectPointerArray;
00104
00108 DataObjectPointerArray& GetInputs()
00109 {return m_Inputs;}
00110
00115 std::vector<DataObjectPointer>::size_type GetNumberOfInputs() const
00116 {return m_Inputs.size();}
00117
00125 virtual std::vector<DataObjectPointer>::size_type GetNumberOfValidRequiredInputs() const;
00126
00130 DataObjectPointerArray& GetOutputs()
00131 { return m_Outputs; }
00132 std::vector<DataObjectPointer>::size_type GetNumberOfOutputs() const
00133 {return m_Outputs.size();}
00135
00138 itkSetMacro(AbortGenerateData,bool);
00139
00142 itkGetConstReferenceMacro(AbortGenerateData,bool);
00143
00145 itkBooleanMacro(AbortGenerateData);
00146
00151 itkSetClampMacro(Progress,float,0.0,1.0);
00152
00156 itkGetConstReferenceMacro(Progress,float);
00157
00163 void UpdateProgress(float amount);
00164
00183 virtual void Update();
00184
00191 virtual void UpdateLargestPossibleRegion();
00192
00205 virtual void UpdateOutputInformation();
00206
00209 virtual void PropagateRequestedRegion(DataObject *output);
00210
00212 virtual void UpdateOutputData(DataObject *output);
00213
00214
00222 virtual void EnlargeOutputRequestedRegion(DataObject *itkNotUsed(output)){};
00223
00224
00228 virtual void ResetPipeline();
00229
00244 virtual DataObjectPointer MakeOutput(unsigned int idx);
00245
00251 virtual void SetReleaseDataFlag(bool flag);
00252 virtual bool GetReleaseDataFlag() const;
00253 void ReleaseDataFlagOn() {this->SetReleaseDataFlag(true);}
00254 void ReleaseDataFlagOff() {this->SetReleaseDataFlag(false);}
00256
00269 itkSetMacro(ReleaseDataBeforeUpdateFlag, bool);
00270 itkGetConstReferenceMacro(ReleaseDataBeforeUpdateFlag, bool);
00271 itkBooleanMacro(ReleaseDataBeforeUpdateFlag);
00273
00274
00276 itkSetClampMacro( NumberOfThreads, int, 1, ITK_MAX_THREADS );
00277 itkGetConstReferenceMacro( NumberOfThreads, int );
00279
00281 MultiThreader * GetMultiThreader()
00282 {return m_Threader;}
00283
00290 virtual void PrepareOutputs();
00291
00292 protected:
00293 ProcessObject();
00294 ~ProcessObject();
00295 void PrintSelf(std::ostream& os, Indent indent) const;
00296
00299 virtual void SetNthInput(unsigned int num, DataObject *input);
00300 virtual void AddInput(DataObject *input);
00301 virtual void RemoveInput(DataObject *input);
00302 itkSetMacro(NumberOfRequiredInputs,unsigned int);
00303 itkGetConstReferenceMacro(NumberOfRequiredInputs,unsigned int);
00305
00311 virtual void PushBackInput(const DataObject *input);
00312 virtual void PopBackInput();
00313 virtual void PushFrontInput(const DataObject *input);
00314 virtual void PopFrontInput();
00316
00317
00319 void SetNumberOfInputs(unsigned int num);
00320
00322 DataObject * GetInput(unsigned int idx);
00323 const DataObject * GetInput(unsigned int idx) const;
00325
00328 virtual void SetNthOutput(unsigned int num, DataObject *output);
00329 virtual void AddOutput(DataObject *output);
00330 virtual void RemoveOutput(DataObject *output);
00331 itkSetMacro(NumberOfRequiredOutputs,unsigned int);
00332 itkGetConstReferenceMacro(NumberOfRequiredOutputs,unsigned int);
00334
00336 void SetNumberOfOutputs(unsigned int num);
00337
00339 DataObject * GetOutput(unsigned int idx);
00340 const DataObject * GetOutput(unsigned int idx) const;
00342
00356 virtual void GenerateInputRequestedRegion();
00357
00369 virtual void GenerateOutputRequestedRegion(DataObject *output);
00370
00381 virtual void GenerateOutputInformation();
00382
00384 virtual void GenerateData() {}
00385
00390 virtual void PropagateResetPipeline();
00391
00403 virtual void ReleaseInputs();
00404
00413 virtual void CacheInputReleaseDataFlags();
00414
00418 virtual void RestoreInputReleaseDataFlags();
00419
00425 bool m_Updating;
00426
00428 TimeStamp m_OutputInformationMTime;
00429
00430 private:
00431 ProcessObject(const Self&);
00432 void operator=(const Self&);
00433
00435 std::vector<DataObjectPointer> m_Inputs;
00436 unsigned int m_NumberOfRequiredInputs;
00437
00439 std::vector<bool> m_CachedInputReleaseDataFlags;
00440
00442 std::vector<DataObjectPointer> m_Outputs;
00443 unsigned int m_NumberOfRequiredOutputs;
00444
00446 bool m_AbortGenerateData;
00447 float m_Progress;
00448
00451 MultiThreader::Pointer m_Threader;
00452 int m_NumberOfThreads;
00453
00455 bool m_ReleaseDataBeforeUpdateFlag;
00456
00458 friend class DataObject;
00459 };
00460
00461 }
00462
00463 #endif
00464
00465