]> Creatis software - FrontAlgorithms.git/blob - lib/fpa/Base/Algorithm.h
e5b6f2b0285951b5949a878b1746135e9855dd42
[FrontAlgorithms.git] / lib / fpa / Base / Algorithm.h
1 // =========================================================================
2 // @author Leonardo Florez Valencia
3 // @email florez-l@javeriana.edu.co
4 // =========================================================================
5
6 #ifndef __fpa__Base__Algorithm__h__
7 #define __fpa__Base__Algorithm__h__
8
9 #include <fpa/Config.h>
10
11 #include <vector>
12 #include <itkObject.h>
13 #include <itkEventObject.h>
14
15 namespace fpa
16 {
17   namespace Base
18   {
19     /**
20      */
21     template< class _TFilter, class _TMarksInterface, class _TSeedsInterface >
22     class Algorithm
23       : public _TFilter,
24         public _TMarksInterface,
25         public _TSeedsInterface
26     {
27     public:
28       typedef Algorithm                       Self;
29       typedef _TFilter                        Superclass;
30       typedef _TMarksInterface                TMarksInterface;
31       typedef _TSeedsInterface                TSeedsInterface;
32       typedef itk::SmartPointer< Self >       Pointer;
33       typedef itk::SmartPointer< const Self > ConstPointer;
34
35       typedef typename _TSeedsInterface::TInputValue  TInputValue;
36       typedef typename _TSeedsInterface::TOutputValue TOutputValue;
37       typedef typename _TSeedsInterface::TNode        TNode;
38       typedef typename _TSeedsInterface::TSeeds       TSeeds;
39       typedef typename _TSeedsInterface::TVertex      TVertex;
40
41       typedef std::vector< TVertex > TNeighborhood;
42
43       /**
44        */
45       class TEvent
46         : public itk::EventObject
47       {
48       public:
49         typedef TEvent           Self;
50         typedef itk::EventObject Superclass;
51
52       public:
53         TEvent( );
54         TEvent( const TVertex& v, unsigned long fid, bool intoq );
55         virtual ~TEvent( );
56         virtual const char* GetEventName( ) const override;
57         virtual bool CheckEvent( const itk::EventObject* e ) const override;
58         virtual itk::EventObject* MakeObject( ) const override;
59
60       private:
61         // Purposely not implemented.
62         Self& operator=( const Self& other );
63
64       public:
65         TVertex       Vertex;
66         unsigned long FrontId;
67         bool          IntoQueue;
68       };
69
70     public:
71       itkTypeMacro( fpa::Base::Algorithm, _TFilter );
72
73       itkBooleanMacro( VisualDebug );
74
75       itkGetConstMacro( InitValue, TOutputValue );
76       itkGetConstMacro( VisualDebug, bool );
77
78       itkSetMacro( InitValue, TOutputValue );
79       itkSetMacro( VisualDebug, bool );
80
81     public:
82       virtual void InvokeEvent( const itk::EventObject& e );
83       virtual void InvokeEvent( const itk::EventObject& e ) const;
84
85     protected:
86       Algorithm( );
87       virtual ~Algorithm( );
88
89       virtual void GenerateData( ) override;
90       virtual void _BeforeGenerateData( );
91       virtual void _AfterGenerateData( );
92
93       virtual void _QueueInit( );
94
95       virtual void _ConfigureOutput( const TOutputValue& v ) = 0;
96       virtual TNeighborhood _GetNeighbors( const TVertex& v ) const = 0;
97       virtual TInputValue _GetInputValue( const TVertex& v ) const = 0;
98       virtual TOutputValue _GetOutputValue( const TVertex& v ) const = 0;
99
100       virtual TOutputValue _ComputeOutputValue( const TNode& n ) = 0;
101       virtual void _UpdateOutputValue( const TNode& n ) = 0;
102       virtual void _QueueClear( ) = 0;
103       virtual void _QueuePush( const TNode& node ) = 0;
104       virtual unsigned long _QueueSize( ) const = 0;
105       virtual TNode _QueuePop( ) = 0;
106
107     private:
108       // Purposely not implemented
109       Algorithm( const Self& other );
110       Self& operator=( const Self& other );
111
112     protected:
113       bool m_VisualDebug;
114       TOutputValue m_InitValue;
115     };
116
117   } // ecapseman
118
119 } // ecapseman
120
121 #ifndef ITK_MANUAL_INSTANTIATION
122 #  include <fpa/Base/Algorithm.hxx>
123 #endif // ITK_MANUAL_INSTANTIATION
124
125 #endif // __fpa__Base__Algorithm__h__
126
127 // eof - $RCSfile$