// ========================================================================= // @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co) // ========================================================================= #ifndef __cpPlugins__Pipeline__h__ #define __cpPlugins__Pipeline__h__ #include #include #include #include namespace cpPlugins { /*! \brief */ class CPPLUGINS_EXPORT Pipeline : public Filter { cpPluginsTypeMacro( Pipeline, Filter ); cpPluginsNewMacro( ); public: typedef std::pair< std::string, std::string > TEdge; typedef std::map< std::string, TEdge > TPortRelations; typedef std::map< std::string, ProcessObject::SharedPtr > TNodes; /** */ class TAdjMatrix { public: typedef std::set< TEdge > TEdges; typedef std::map< std::string, TEdges > TRow; typedef std::map< std::string, TRow > TMatrix; public: TAdjMatrix( ); virtual ~TAdjMatrix( ); bool HasConnection( const std::string& oObj, const std::string& dObj, const std::string& oPort, const std::string& dPort ) const; TEdges& operator()( const std::string& o, const std::string& d ); const TEdges& operator()( const std::string& o, const std::string& d ) const; template< class _TXMLNode > void SaveXML( _TXMLNode* node ) const; protected: TMatrix m_Matrix; }; public: void Clear( ); ProcessObject* CreateNode( const std::string& class_name, const std::string& node_name = "" ); ProcessObject* GetNode( const std::string& name ); const ProcessObject* GetNode( const std::string& name ) const; void Connect( const std::string& oObj, const std::string& dObj, const std::string& oPort, const std::string& dPort ); void Connect( const std::string& src, const std::string& dest ); void LoadXML( const std::string& fname ); void SaveXML( const std::string& fname ) const; virtual bool GetExecutionDebug( ) const override; virtual void SetExecutionDebug( bool d ) 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; //! IO management void DefineInput( const std::string& input, const std::string& node, const std::string& port ); virtual void SetInput( const std::string& name, DataObject* data ) override; virtual DataObject* GetInput( const std::string& name, const unsigned int id ) override; virtual const DataObject* GetInput( const std::string& name, const unsigned int id ) const override; virtual bool HasInput( const std::string& name ) const override; void DefineOutput( const std::string& output, const std::string& node, const std::string& port ); virtual DataObject* GetOutput( const std::string& name ) override; virtual const DataObject* GetOutput( const std::string& name ) const override; protected: Pipeline( ); virtual ~Pipeline( ); virtual void _GenerateData( ) override; void _Connect( Filter* src, const std::string& srcPort, ProcessObject* dest, const std::string& destPort ); void _Connect( Functor* functor, const std::string& functorValue, ProcessObject* dest, const std::string& destValue ); static void _ParseComponentName( const std::string& name, std::string& node, std::string& component ); protected: Manager m_Mgr; std::string m_Description; TNodes m_Nodes; TAdjMatrix m_AdjMatrix; TPortRelations m_InputRelations; TPortRelations m_OutputRelations; bool m_PipelineExecutionDebug; }; // end class } // end namespace #endif // __cpPlugins__Pipeline__h__ // eof - $RCSfile$