Go to the documentation of this file.
17 #ifndef __igstkMacros_h
18 #define __igstkMacros_h
21 #include "itkCommand.h"
32 #pragma warning( disable : 4786 )
35 #pragma warning ( disable : 4503 )
44 #define igstkLogMacro( x, y) \
46 if (this->GetLogger() ) \
48 if (this->GetLogger()->ShouldBuildMessage( ::igstk::Logger::x ) ) \
50 std::ostringstream message; \
52 this->GetLogger()->Write(::itk::Logger::x, message.str()); \
61 #define igstkLogMacroStatic( obj, x, y) \
63 if (obj->GetLogger() ) \
65 if (obj->GetLogger()->ShouldBuildMessage( ::igstk::Logger::x ) ) \
67 std::ostringstream message; \
69 obj->GetLogger()->Write(::itk::Logger::x, message.str()); \
78 #define igstkLogMacro2( logger, x, y) \
82 if (logger->ShouldBuildMessage( ::igstk::Logger::x )) \
84 std::ostringstream message; \
86 logger->Write(::itk::Logger::x, message.str()); \
93 #define igstkSetMacro(name,type) \
94 virtual void Set##name (const type & _arg) \
96 if (this->m_##name != _arg) \
98 this->m_##name = _arg; \
105 #define igstkGetMacro(name,type) \
106 virtual const type & Get##name () const \
108 return this->m_##name; \
115 #define igstkNewMacro(x) \
116 static Pointer New(void) \
121 rawPtr->UnRegister(); \
128 #define igstkTypeMacro(thisClass,superclass) \
129 virtual const char *GetNameOfClass() const {return #thisClass;}
134 #if defined(__GNUC__)
135 #define igstkFriendClassMacro(type) friend class type
137 #define igstkFriendClassMacro(type) friend type
143 #define igstkLoggerMacro() \
145 typedef ::igstk::Logger LoggerType; \
147 LoggerType* GetLogger() const { return m_Logger; } \
149 mutable LoggerType::Pointer m_Logger; \
151 void SetLogger(LoggerType* logger) { m_Logger = logger; }
157 #define igstkSetStringMacro(name) \
158 virtual void Set##name (const char* _arg) \
160 if ( _arg && (_arg == this->m_##name) ) { return;} \
163 this->m_##name = _arg;\
167 this->m_##name = ""; \
171 virtual void Set##name (const std::string & _arg) \
173 this->Set##name( _arg.c_str() ); \
180 #define igstkGetStringMacro(name) \
181 virtual const char* Get##name () const \
183 return this->m_##name.c_str(); \
190 #define igstkStateMachineMacroBase( igstktypename ) \
192 typedef ::igstk::StateMachine< Self > StateMachineType; \
193 typedef igstktypename StateMachineType::TMemberFunctionPointer ActionType; \
194 typedef igstktypename StateMachineType::StateType StateType; \
195 typedef igstktypename StateMachineType::InputType InputType; \
196 typedef igstktypename StateMachineType::OutputStreamType OutputStreamType; \
197 igstkFriendClassMacro( ::igstk::StateMachine< Self > ); \
198 StateMachineType m_StateMachine; \
199 typedef ::itk::ReceptorMemberCommand< Self > ReceptorObserverType; \
200 typedef igstktypename ReceptorObserverType::Pointer \
201 ReceptorObserverPointer; \
203 void ExportStateMachineDescription( OutputStreamType & ostr, \
204 bool skipLoops=false ) const \
205 { m_StateMachine.ExportDescription( ostr, skipLoops ); } \
206 void ExportStateMachineDescriptionToLTS( OutputStreamType & ostr,\
207 bool skipLoops=false ) const \
208 { m_StateMachine.ExportDescriptionToLTS( ostr, skipLoops ); } \
209 void ExportStateMachineDescriptionToSCXML( OutputStreamType & ostr,\
210 bool skipLoops=false ) const \
211 { m_StateMachine.ExportDescriptionToSCXML( ostr, skipLoops ); }
213 #define EMPTYPARAMETER
216 #define igstkStateMachineMacro() igstkStateMachineMacroBase( EMPTYPARAMETER )
219 #define igstkStateMachineTemplatedMacro() igstkStateMachineMacroBase( typename )
223 #define igstkDeclareInputMacro( inputname ) \
224 InputType m_##inputname##Input
228 #define igstkDeclareStateMacro( inputname ) \
229 StateType m_##inputname##State
233 #define igstkAddInputMacro( inputname ) \
234 this->m_StateMachine.AddInput( this->m_##inputname##Input, \
239 #define igstkAddStateMacro( statename ) \
240 this->m_StateMachine.AddState( this->m_##statename##State,\
244 #define igstkAddTransitionMacro( state1, input, state2, action ) \
245 this->m_StateMachine.AddTransition( this->m_##state1##State, \
246 this->m_##input##Input, \
247 this->m_##state2##State, \
248 & Self::action##Processing );
252 #define igstkSetInitialStateMacro( inputname ) \
253 this->m_StateMachine.SelectInitialState( this->m_##inputname##State );
257 #define igstkPushInputMacro( inputname ) \
258 this->m_StateMachine.PushInput( this->m_##inputname##Input );
262 #define igstkStandardClassBasicTraitsMacro( classname, superclassname ) \
263 typedef classname Self; \
264 typedef superclassname Superclass; \
265 typedef ::itk::SmartPointer< Self > Pointer; \
266 typedef ::itk::SmartPointer< const Self > ConstPointer; \
267 igstkTypeMacro( classname, superclassname);
270 #define igstkStandardAbstractClassTraitsMacro( classname, superclassname ) \
271 igstkStandardClassBasicTraitsMacro( classname, superclassname ) \
272 igstkStateMachineMacro();
275 #define igstkStandardClassTraitsMacro( classname, superclassname ) \
276 igstkStandardAbstractClassTraitsMacro( classname, superclassname ) \
277 igstkNewMacro( Self );
280 #define igstkStandardTemplatedAbstractClassTraitsMacro( classname, \
282 igstkStandardClassBasicTraitsMacro( classname, superclassname ) \
283 igstkStateMachineTemplatedMacro();
286 #define igstkStandardTemplatedClassTraitsMacro( classname, superclassname ) \
287 igstkStandardTemplatedAbstractClassTraitsMacro( classname, superclassname ) \
288 igstkNewMacro( Self );
293 #define igstkEventTransductionMacro( event, input ) \
295 ReceptorObserverPointer m_Observer##event##input; \
296 void Callback##event##input##Input( const ::itk::EventObject & ) \
298 igstkPushInputMacro( input ); \
299 m_StateMachine.ProcessInputs(); \
302 void Observe##event##Event(const ::igstk::Object * object ) \
304 m_Observer##event##input = ReceptorObserverType::New(); \
305 m_Observer##event##input->SetCallbackFunction( this, \
306 & Self::Callback##event##input##Input ); \
307 unsigned long tag = object->AddObserver( \
308 ::igstk::event##Event(),m_Observer##event##input ); \
309 this->RegisterObservedObject( object, tag ); \
316 #define igstkLoadedEventTransductionMacro( event, input ) \
318 ReceptorObserverPointer m_Observer##event##input; \
319 ::igstk::event##Event::PayloadType m_##input##InputToBeSet; \
320 void Callback##event##input##Input( const ::itk::EventObject & eventvar ) \
322 const ::igstk::event##Event * realevent = \
323 dynamic_cast < const ::igstk::event##Event * > ( &eventvar ); \
326 m_##input##InputToBeSet = realevent->Get(); \
327 igstkPushInputMacro( input ); \
328 m_StateMachine.ProcessInputs(); \
332 void Observe##input##Input(const ::igstk::Object * object ) \
334 m_Observer##event##input = ReceptorObserverType::New(); \
335 m_Observer##event##input->SetCallbackFunction( this,\
336 & Self::Callback##event##input##Input ); \
337 unsigned long tag = object->AddObserver( \
338 ::igstk::event##Event(),m_Observer##event##input ); \
339 this->RegisterObservedObject( object, tag ); \
341 #define igstkLoadedObjectEventTransductionMacro( event, input ) \
343 ReceptorObserverPointer m_Observer##event##input; \
344 ::igstk::event##Event::PayloadType * m_##input##InputToBeSet; \
345 void Callback##event##input##Input( const ::itk::EventObject & eventvar ) \
347 const ::igstk::event##Event * realevent = \
348 dynamic_cast < const ::igstk::event##Event * > ( &eventvar ); \
351 m_##input##InputToBeSet = realevent->Get(); \
352 igstkPushInputMacro( input ); \
353 m_StateMachine.ProcessInputs(); \
357 void Observe##input##Input(const ::igstk::Object * object ) \
359 m_Observer##event##input = ReceptorObserverType::New(); \
360 m_Observer##event##input->SetCallbackFunction( this,\
361 & Self::Callback##event##input##Input ); \
362 unsigned long tag = object->AddObserver( \
363 ::igstk::event##Event(),m_Observer##event##input ); \
364 this->RegisterObservedObject( object, tag ); \
368 #define igstkObserverMacro( name, eventType, payloadType ) \
369 class name##Observer : public ::itk::Command \
372 typedef name##Observer Self; \
373 typedef ::itk::Command Superclass;\
374 typedef ::itk::SmartPointer<Self> Pointer;\
375 itkNewMacro( Self );\
379 m_GotObject = false;\
381 ~name##Observer() {}\
383 typedef eventType EventType;\
384 void Execute(itk::Object *caller, const itk::EventObject & event)\
386 const itk::Object * constCaller = caller;\
387 this->Execute( constCaller, event );\
389 void Execute(const itk::Object *caller, const itk::EventObject & event)\
391 m_GotObject = false;\
392 if( EventType().CheckEvent( &event ) )\
394 const EventType * objectEvent = \
395 dynamic_cast< const EventType *>( &event );\
398 m_Object = objectEvent->Get();\
404 bool Got##name() const\
410 m_GotObject = false; \
412 payloadType Get##name() const\
417 payloadType m_Object;\
422 #define igstkObserverObjectMacro( name, eventType, payloadType ) \
423 class name##Observer : public ::itk::Command \
426 typedef name##Observer Self; \
427 typedef ::itk::Command Superclass;\
428 typedef ::itk::SmartPointer<Self> Pointer;\
429 itkNewMacro( Self );\
433 m_GotObject = false;\
435 ~name##Observer() {}\
437 typedef eventType EventType;\
438 void Execute(itk::Object *caller, const itk::EventObject & event)\
440 const itk::Object * constCaller = caller;\
441 this->Execute( constCaller, event );\
443 void Execute(const itk::Object *caller, const itk::EventObject & event)\
445 m_GotObject = false;\
446 if( EventType().CheckEvent( &event ) )\
448 const EventType * objectEvent = \
449 dynamic_cast< const EventType *>( &event );\
452 m_Object = objectEvent->Get();\
458 bool Got##name() const\
464 m_GotObject = false; \
466 payloadType::Pointer Get##name() const\
471 payloadType::Pointer m_Object;\
476 #define igstkObserverConstObjectMacro( name, eventType, payloadType ) \
477 class name##Observer : public ::itk::Command \
480 typedef name##Observer Self; \
481 typedef ::itk::Command Superclass;\
482 typedef ::itk::SmartPointer<Self> Pointer;\
483 itkNewMacro( Self );\
487 m_GotObject = false;\
489 ~name##Observer() {}\
491 typedef eventType EventType;\
492 void Execute(itk::Object *caller, const itk::EventObject & event)\
494 const itk::Object * constCaller = caller;\
495 this->Execute( constCaller, event );\
497 void Execute(const itk::Object *caller, const itk::EventObject & event)\
499 m_GotObject = false;\
500 if( EventType().CheckEvent( &event ) )\
502 const EventType * objectEvent = \
503 dynamic_cast< const EventType *>( &event );\
506 m_Object = objectEvent->Get();\
512 bool Got##name() const\
518 m_GotObject = false; \
520 payloadType::ConstPointer Get##name() const\
525 payloadType::ConstPointer m_Object;\
530 #endif // __igstk_Macros_h_