]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/ProcessObject.h
Moved to version 1.0
[cpPlugins.git] / lib / cpPlugins / ProcessObject.h
1 // =========================================================================
2 // @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
3 // =========================================================================
4 #ifndef __cpPlugins__ProcessObject__h__
5 #define __cpPlugins__ProcessObject__h__
6
7 #include <map>
8 #include <vector>
9 #include <cpPlugins/Object.h>
10 #include <cpPlugins/Parameters.h>
11 #include <cpPlugins/Ports.h>
12
13 namespace cpPlugins
14 {
15   class Pipeline;
16
17   /*! \brief 
18    */
19   class CPPLUGINS_EXPORT ProcessObject
20     : public Object,
21       public Parameters
22   {
23     cpPluginsTypeMacro( ProcessObject, Object );
24
25   public:
26     typedef Parameters                          TParameters;
27     typedef InputPort                           TInputPort;
28     typedef std::map< std::string, TInputPort > TInputs;
29
30   public:
31     /*! @defgroup m_Name
32      * This object's unique identifier. This name will be used as the
33      * node's, in the graph interpretation of a pipeline, index inside the
34      * vertices container.
35      * @{
36      */
37     const std::string& GetName( ) const;
38     void SetName( const std::string& name );
39     //! @}
40
41     virtual void Print( std::ostream& o ) const override;
42     void SetPipeline( Pipeline* p );
43
44     //! IO management
45     virtual void SetInput( const std::string& name, DataObject* data );
46
47     virtual DataObject* GetInput(
48       const std::string& name, const unsigned int id
49       );
50     virtual const DataObject* GetInput(
51       const std::string& name, const unsigned int id
52       ) const;
53
54     virtual bool HasInput( const std::string& name ) const;
55
56     std::set< std::string > GetInputsNames( ) const;
57     unsigned int GetNumberOfInputs( ) const;
58     unsigned int GetNumberOfInputs( const std::string& name ) const;
59     virtual std::set< std::string > GetAllInputsNames( ) const;
60     virtual std::set< std::string > GetAllOutputsNames( ) const;
61
62     //! Pipeline management
63     virtual bool GetExecutionDebug( ) const;
64     virtual void SetExecutionDebug( bool d );
65     virtual void ExecutionDebugOn( );
66     virtual void ExecutionDebugOff( );
67     const double& GetLastDuration( ) const;
68     virtual bool IsUpdated(
69       const TTimeStamp& d = TTimeRep::now( )
70       ) const override;
71
72     // Solve multiple inheritance method name conflict
73     virtual void Modified( ) override;
74     virtual void ModifiedInValue( const std::string& name ) override;
75     virtual void ModifiedInSet( const std::string& name ) override;
76     virtual void ModifiedInSequence( const std::string& name ) override;
77     virtual void ModifiedOutValue( const std::string& name ) override;
78     virtual void ModifiedOutSet( const std::string& name ) override;
79     virtual void ModifiedOutSequence( const std::string& name ) override;
80     virtual void ModifiedChoice( const std::string& name ) override;
81     virtual void Update( );
82
83     template< class _TXMLNode >
84     void SaveXML( _TXMLNode* node ) const;
85
86   protected:
87     ProcessObject( );
88     virtual ~ProcessObject( );
89
90     virtual bool _BeforeUpdate( );
91     virtual void _GenerateData( ) = 0;
92
93     template< class _TData >
94     const _TData* _GetInput(
95       const std::string& name, const unsigned int& id = 0
96       ) const
97       {
98         TInputs::const_iterator i = this->m_Inputs.find( name );
99         if( i != this->m_Inputs.end( ) )
100           return( dynamic_cast< const _TData* >( i->second.Get( id ) ) );
101         else
102           cpPluginsErrorMacro(
103             this,
104             << "Input \"" << name << "\" does not belong to this filter."
105             );
106       }
107
108     template< class _TData >
109     void _ConfigureInput(
110       const std::string& name, bool required, bool multiple
111       )
112       {
113         if( this->m_Inputs.find( name ) != this->m_Inputs.end( ) )
114           cpPluginsErrorMacro(
115             this, << "Input \"" << name << "\" already exists."
116             );
117         TInputPort port;
118         port.Configure< _TData >( required, multiple );
119         this->m_Inputs[ name ] = port;
120       }
121
122   protected:
123     //! @ingroup m_Name
124     std::string m_Name;
125
126     //! Input ports (only DataObjects)
127     TInputs m_Inputs;
128
129     //! Last duration in microseconds
130     std::ostream* m_OutStream;
131     bool m_ExecutionDebug;
132     double m_LastDuration;
133
134     //! Does this object belongs to a Pipeline?
135     std::weak_ptr< Pipeline > m_Pipeline;
136   }; // end class
137 } // end namespace
138
139 #endif // __cpPlugins__ProcessObject__h__
140
141 // eof - $RCSfile$