--- /dev/null
+// =========================================================================
+// @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co)
+// =========================================================================
+#ifndef __cpPlugins__ProcessObject__h__
+#define __cpPlugins__ProcessObject__h__
+
+#include <map>
+#include <vector>
+#include <cpPlugins/Object.h>
+#include <cpPlugins/Parameters.h>
+#include <cpPlugins/Ports.h>
+
+namespace cpPlugins
+{
+ class Pipeline;
+
+ /*! \brief
+ */
+ class CPPLUGINS_EXPORT ProcessObject
+ : public Object,
+ public Parameters
+ {
+ cpPluginsTypeMacro( ProcessObject, Object );
+
+ public:
+ typedef Parameters TParameters;
+ typedef InputPort TInputPort;
+ typedef std::map< std::string, TInputPort > TInputs;
+
+ public:
+ /*! @defgroup m_Name
+ * This object's unique identifier. This name will be used as the
+ * node's, in the graph interpretation of a pipeline, index inside the
+ * vertices container.
+ * @{
+ */
+ const std::string& GetName( ) const;
+ void SetName( const std::string& name );
+ //! @}
+
+ virtual void Print( std::ostream& o ) const override;
+ void SetPipeline( Pipeline* p );
+
+ //! IO management
+ virtual void SetInput( const std::string& name, DataObject* data );
+
+ virtual DataObject* GetInput(
+ const std::string& name, const unsigned int id
+ );
+ virtual const DataObject* GetInput(
+ const std::string& name, const unsigned int id
+ ) const;
+
+ virtual bool HasInput( const std::string& name ) const;
+
+ std::set< std::string > GetInputsNames( ) const;
+ unsigned int GetNumberOfInputs( ) const;
+ unsigned int GetNumberOfInputs( const std::string& name ) const;
+ virtual std::set< std::string > GetAllInputsNames( ) const;
+ virtual std::set< std::string > GetAllOutputsNames( ) const;
+
+ //! Pipeline management
+ virtual bool GetExecutionDebug( ) const;
+ virtual void SetExecutionDebug( bool d );
+ virtual void ExecutionDebugOn( );
+ virtual void ExecutionDebugOff( );
+ const double& GetLastDuration( ) const;
+ virtual bool IsUpdated(
+ const TTimeStamp& d = TTimeRep::now( )
+ ) const override;
+
+ // Solve multiple inheritance method name conflict
+ virtual void Modified( ) override;
+ virtual void ModifiedInValue( const std::string& name ) override;
+ virtual void ModifiedInSet( const std::string& name ) override;
+ virtual void ModifiedInSequence( const std::string& name ) override;
+ virtual void ModifiedOutValue( const std::string& name ) override;
+ virtual void ModifiedOutSet( const std::string& name ) override;
+ virtual void ModifiedOutSequence( const std::string& name ) override;
+ virtual void ModifiedChoice( const std::string& name ) override;
+ virtual void Update( );
+
+ template< class _TXMLNode >
+ void SaveXML( _TXMLNode* node ) const;
+
+ protected:
+ ProcessObject( );
+ virtual ~ProcessObject( );
+
+ virtual bool _BeforeUpdate( );
+ virtual void _GenerateData( ) = 0;
+
+ template< class _TData >
+ const _TData* _GetInput(
+ const std::string& name, const unsigned int& id = 0
+ ) const
+ {
+ TInputs::const_iterator i = this->m_Inputs.find( name );
+ if( i != this->m_Inputs.end( ) )
+ return( dynamic_cast< const _TData* >( i->second.Get( id ) ) );
+ else
+ cpPluginsErrorMacro(
+ this,
+ << "Input \"" << name << "\" does not belong to this filter."
+ );
+ }
+
+ template< class _TData >
+ void _ConfigureInput(
+ const std::string& name, bool required, bool multiple
+ )
+ {
+ if( this->m_Inputs.find( name ) != this->m_Inputs.end( ) )
+ cpPluginsErrorMacro(
+ this, << "Input \"" << name << "\" already exists."
+ );
+ TInputPort port;
+ port.Configure< _TData >( required, multiple );
+ this->m_Inputs[ name ] = port;
+ }
+
+ protected:
+ //! @ingroup m_Name
+ std::string m_Name;
+
+ //! Input ports (only DataObjects)
+ TInputs m_Inputs;
+
+ //! Last duration in microseconds
+ std::ostream* m_OutStream;
+ bool m_ExecutionDebug;
+ double m_LastDuration;
+
+ //! Does this object belongs to a Pipeline?
+ std::weak_ptr< Pipeline > m_Pipeline;
+ }; // end class
+} // end namespace
+
+#endif // __cpPlugins__ProcessObject__h__
+
+// eof - $RCSfile$