42 #include "itkConfigure.h"
43 #include "ITKCommonExport.h"
79 #if defined( _MSC_VER ) && ( _MSC_VER < 1310 )
82 #if defined( __SUNPRO_CC ) && ( __SUNPRO_CC < 0x590 )
83 #error "__SUNPRO_CC < 0x590 not supported under ITKv4"
85 #if defined( __CYGWIN__ )
86 #error "The Cygwin compiler is not supported in ITKv4 and above"
88 #if defined( __BORLANDC__ )
89 #error "The Borland C compiler is not supported in ITKv4 and above"
91 #if defined( __MWERKS__ )
92 #error "The MetroWerks compiler is not supported in ITKv4 and above"
94 #if defined( __GNUC__ ) && ( __GNUC__ < 3 )
95 #error "The __GNUC__ version 2.95 compiler is not supprted under ITKv4 and above"
100 #error "The __sgi compiler is not supprted under ITKv4 and above"
105 #if defined( _WIN32 ) || defined ( WIN32 )
106 #define ITK_ABI_IMPORT __declspec(dllimport)
107 #define ITK_ABI_EXPORT __declspec(dllexport)
108 #define ITK_ABI_HIDDEN
111 #define ITK_ABI_IMPORT __attribute__ ((visibility ("default")))
112 #define ITK_ABI_EXPORT __attribute__ ((visibility ("default")))
113 #define ITK_ABI_HIDDEN __attribute__ ((visibility ("hidden")))
115 #define ITK_ABI_IMPORT
116 #define ITK_ABI_EXPORT
117 #define ITK_ABI_HIDDEN
141 #define itkNewMacro(x) \
142 itkSimpleNewMacro(x) \
143 itkCreateAnotherMacro(x) \
146 #define itkSimpleNewMacro(x) \
147 static Pointer New(void) \
149 Pointer smartPtr = ::itk::ObjectFactory< x >::Create(); \
150 if ( smartPtr.GetPointer() == NULL ) \
154 smartPtr->UnRegister(); \
158 #define itkCreateAnotherMacro(x) \
159 virtual::itk::LightObject::Pointer CreateAnother(void) const \
161 ::itk::LightObject::Pointer smartPtr; \
162 smartPtr = x::New().GetPointer(); \
166 #define itkCloneMacro(x) \
167 Pointer Clone() const \
170 dynamic_cast<x *>(this->InternalClone().GetPointer()); \
190 #define itkFactorylessNewMacro(x) \
191 static Pointer New(void) \
194 x * rawPtr = new x; \
196 rawPtr->UnRegister(); \
199 virtual::itk::LightObject::Pointer CreateAnother(void) const \
201 ::itk::LightObject::Pointer smartPtr; \
202 smartPtr = x::New().GetPointer(); \
209 #define itkTypeMacro(thisClass, superclass) \
210 virtual const char *GetNameOfClass() const \
223 extern ITKCommon_EXPORT
void OutputWindowDisplayText(
const char *);
226 extern ITKCommon_EXPORT
void OutputWindowDisplayErrorText(
const char *);
228 extern ITKCommon_EXPORT
void OutputWindowDisplayWarningText(
const char *);
230 extern ITKCommon_EXPORT
void OutputWindowDisplayGenericOutputText(
const char *);
232 extern ITKCommon_EXPORT
void OutputWindowDisplayDebugText(
const char *);
238 #if defined( NDEBUG )
239 #define itkDebugMacro(x)
240 #define itkDebugStatement(x)
242 #define itkDebugMacro(x) \
244 if ( this->GetDebug() && ::itk::Object::GetGlobalWarningDisplay() ) \
246 std::ostringstream itkmsg; \
247 itkmsg << "Debug: In " __FILE__ ", line " << __LINE__ << "\n" \
248 << this->GetNameOfClass() << " (" << this << "): " x \
250 ::itk::OutputWindowDisplayDebugText( itkmsg.str().c_str() ); \
257 #define itkDebugStatement(x) x
263 #define itkWarningMacro(x) \
265 if ( ::itk::Object::GetGlobalWarningDisplay() ) \
267 std::ostringstream itkmsg; \
268 itkmsg << "WARNING: In " __FILE__ ", line " << __LINE__ << "\n" \
269 << this->GetNameOfClass() << " (" << this << "): " x \
271 ::itk::OutputWindowDisplayWarningText( itkmsg.str().c_str() ); \
278 #define itkWarningStatement(x) x
280 #if defined( ITK_CPP_FUNCTION )
281 #if defined( _WIN32 ) && !defined( __MINGW32__ ) && !defined( CABLE_CONFIGURATION ) \
283 #define ITK_LOCATION __FUNCSIG__
284 #elif defined( __GNUC__ )
285 #define ITK_LOCATION __PRETTY_FUNCTION__
287 #define ITK_LOCATION __FUNCTION__
290 #define ITK_LOCATION "unknown"
298 #define itkExceptionMacro(x) \
300 std::ostringstream message; \
301 message << "itk::ERROR: " << this->GetNameOfClass() \
302 << "(" << this << "): " x; \
303 ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str(), ITK_LOCATION); \
308 #define itkGenericExceptionMacro(x) \
310 std::ostringstream message; \
311 message << "itk::ERROR: " x; \
312 ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str(), ITK_LOCATION); \
316 #define itkDeclareExceptionMacro(newexcp,parentexcp,whatmessage) \
318 class newexcp : public parentexcp \
321 newexcp( const char *file, unsigned int lineNumber ) : \
322 parentexcp( file, lineNumber ) \
324 this->SetDescription( whatmessage ); \
326 newexcp( const std::string & file, unsigned int lineNumber ) : \
327 parentexcp( file, lineNumber ) \
329 this->SetDescription( whatmessage ); \
331 itkTypeMacro(newexcp, parentexcp); \
335 #define itkSpecializedExceptionMacro(exceptiontype) \
337 ::itk::exceptiontype e_(__FILE__, __LINE__); \
338 e_.SetLocation(ITK_LOCATION); \
342 #define itkSpecializedMessageExceptionMacro(exceptiontype,x) \
344 ::itk::exceptiontype e_(__FILE__, __LINE__); \
345 std::ostringstream message; \
346 message << "itk::ERROR: " x; \
347 e_.SetDescription(message.str().c_str()); \
348 e_.SetLocation(ITK_LOCATION); \
353 #define itkGenericOutputMacro(x) \
355 if ( ::itk::Object::GetGlobalWarningDisplay() ) \
357 std::ostringstream itkmsg; \
358 itkmsg << "WARNING: In " __FILE__ ", line " << __LINE__ << "\n" \
360 ::itk::OutputWindowDisplayGenericOutputText( itkmsg.str().c_str() ); \
367 #define itkLogMacro(x, y) \
369 if ( this->GetLogger() ) \
371 this->GetLogger()->Write(::itk::LoggerBase::x, y); \
375 #define itkLogMacroStatic(obj, x, y) \
377 if ( obj->GetLogger() ) \
379 obj->GetLogger()->Write(::itk::LoggerBase::x, y); \
405 #if defined( ITK_LEGACY_REMOVE )
406 #define itkLegacyMacro(method)
407 #elif defined( ITK_LEGACY_SILENT ) || defined( ITK_LEGACY_TEST ) || defined( CSWIG )
409 #define itkLegacyMacro(method) method
413 #if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) && ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) )
414 #define itkLegacyMacro(method) method __attribute__( ( deprecated ) )
415 #elif defined( _MSC_VER )
416 #define itkLegacyMacro(method) __declspec(deprecated) method
418 #define itkLegacyMacro(method) method
435 #if defined( ITK_LEGACY_REMOVE ) || defined( ITK_LEGACY_SILENT )
436 #define itkLegacyBodyMacro(method, version)
437 #define itkLegacyReplaceBodyMacro(method, version, replace)
438 #define itkGenericLegacyBodyMacro(method, version)
439 #define itkGenericLegacyReplaceBodyMacro(method, version, replace)
441 #define itkLegacyBodyMacro(method, version) \
442 itkWarningMacro(#method " was deprecated for ITK " #version " and will be removed in a future version.")
443 #define itkLegacyReplaceBodyMacro(method, version, replace) \
445 #method " was deprecated for ITK " #version " and will be removed in a future version. Use " #replace \
447 #define itkGenericLegacyBodyMacro(method, version) \
448 itkGenericOutputMacro(#method " was deprecated for ITK " #version " and will be removed in a future version.")
449 #define itkGenericLegacyReplaceBodyMacro(method, version, replace) \
450 itkGenericOutputMacro( \
451 #method " was deprecated for ITK " #version " and will be removed in a future version. Use " #replace \
455 #if defined ( ITK_LEGACY_REMOVE )
456 #define ITK_TEMPLATE_TXX "error ITK_TEMPLATE_TXX is no longer a supported identifier, you should replace with ITK_MANUAL_INSTANTIATION as a replacement"
458 #define ITK_TEMPLATE_TXX 1
466 #define ITK_CACHE_LINE_ALIGNMENT 64
474 #define itkPadStruct( mincachesize, oldtype, newtype ) \
475 struct newtype: public oldtype \
477 char _StructPadding[mincachesize - (sizeof(oldtype)%mincachesize) ]; \
484 #if defined ( ITK_HAS_CPP11_ALIGNAS )
485 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
486 typedef oldtype newtype alignas(alignment)
487 #elif defined( ITK_HAS_GNU_ATTRIBUTE_ALIGNED )
488 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
489 typedef oldtype newtype __attribute__((aligned(alignment)))
490 #elif defined ( _MSC_VER )
491 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
492 typedef __declspec(align( alignment )) struct oldtype newtype
494 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
495 typedef oldtype newtype
527 #if defined( ITK_SUPPORTS_TEMPLATED_FRIEND_FUNCTION_WITH_NULL_STRING )
528 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T)
530 #if defined( ITK_SUPPORTS_TEMPLATED_FRIEND_FUNCTION_WITH_EMPTY_BRACKETS )
531 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T) < >
533 #if defined( ITK_SUPPORTS_TEMPLATED_FRIEND_FUNCTION_WITH_TEMPLATE_ARGUMENTS )
534 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T) < T >
540 #if ( defined ( _MSC_VER ) && ( _MSC_VER >= 1600 ) )
541 #ifdef ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT
542 #undef ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT
544 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T)
553 #if defined( __INTEL_COMPILER ) && __INTEL_COMPILER >= 700
554 #define ITK_TEMPLATE_EXTERN 1
555 #elif defined( __GNUC__ ) && __GNUC__ >= 3
556 #define ITK_TEMPLATE_EXTERN 1
557 #elif defined( _MSC_VER )
558 #define ITK_TEMPLATE_EXTERN 1
560 #if !defined( ITK_TEMPLATE_DO_NOT_INSTANTIATE )
561 #define ITK_TEMPLATE_DO_NOT_INSTANTIATE 0
563 #if !defined( ITK_TEMPLATE_EXTERN )
564 #define ITK_TEMPLATE_EXTERN 0
574 #define ITK_TEMPLATE_EXPORT(x) ITK_TEMPLATE_EXPORT_DELAY(x)
575 #define ITK_TEMPLATE_EXPORT_DELAY(x) template ITK_TEMPLATE_##x;
585 #if ITK_TEMPLATE_EXTERN
586 #define ITK_TEMPLATE_IMPORT_DELAY(x) extern template ITK_TEMPLATE_##x;
587 #elif ITK_TEMPLATE_DO_NOT_INSTANTIATE
588 #define ITK_TEMPLATE_IMPORT_DELAY(x) \
589 ITK_TEMPLATE_IMPORT_IMPL(do_not_instantiate ITK_TEMPLATE_##x)
590 #define ITK_TEMPLATE_IMPORT_IMPL(x) _Pragma(#x)
592 #if defined( ITK_TEMPLATE_IMPORT_DELAY )
593 #define ITK_TEMPLATE_IMPORT(x) ITK_TEMPLATE_IMPORT_DELAY(x)
594 #define ITK_TEMPLATE_IMPORT_WORKS 1
596 #define ITK_TEMPLATE_IMPORT(x)
597 #define ITK_TEMPLATE_IMPORT_WORKS 0
604 #define ITK_EXPORT_ITKCommon(c, x, n) \
605 ITK_EXPORT_TEMPLATE(ITKCommon_EXPORT, c, x, n)
606 #define ITK_IMPORT_ITKCommon(c, x, n) \
607 ITK_IMPORT_TEMPLATE(ITKCommon_EXPORT, c, x, n)
622 #define itkForLoopAssignmentMacro(DestinationType, \
624 DestinationElementType, \
627 NumberOfIterations) \
628 for ( unsigned int i = 0; i < NumberOfIterations; ++i ) \
630 DestinationArray[i] = static_cast< DestinationElementType >( SourceArray[i] ); \
642 #define itkForLoopRoundingAndAssignmentMacro(DestinationType, \
643 Sourcrnd_halfintup, \
644 DestinationElementType, \
647 NumberOfIterations) \
648 for ( unsigned int i = 0; i < NumberOfIterations; ++i ) \
650 DestinationArray[i] = itk::Math::Round< DestinationElementType >(SourceArray[i]); \
658 #define itkAssertInDebugOrThrowInReleaseMacro(msg) __assert_fail (msg, __FILE__, __LINE__, __ASSERT_FUNCTION);
660 #define itkAssertInDebugOrThrowInReleaseMacro(msg) itkGenericExceptionMacro(<< msg);
664 #define itkAssertInDebugOrThrowInReleaseMacro(msg) itkGenericExceptionMacro(<< msg);
667 #define itkAssertOrThrowMacro(test, message) \
670 std::ostringstream msgstr; \
672 itkAssertInDebugOrThrowInReleaseMacro( msgstr.str().c_str() ); \
676 #define itkAssertInDebugAndIgnoreInReleaseMacro(X) assert(X)
678 #define itkAssertInDebugAndIgnoreInReleaseMacro(X)
681 #ifdef ITKV3_COMPATIBILITY
685 #define ITK_TYPENAME typename
691 template <
typename TTarget,
typename TSource>
692 TTarget itkDynamicCastInDebugMode(TSource x)
699 TTarget rval =
dynamic_cast<TTarget
>(x);
702 itkGenericExceptionMacro(<<
"Failed dynamic cast to "
703 <<
typeid(TTarget).name()
705 << x->GetNameOfClass());
709 return static_cast<TTarget
>(x);
721 #define itkStaticConstMacro(name, type, value) enum { name = value }
723 #define itkGetStaticConstMacro(name) (Self::name)
726 #define itkSetInputMacro(name, type) \
727 virtual void Set##name(const type *_arg) \
729 itkDebugMacro("setting input " #name " to " << _arg); \
730 if ( _arg != static_cast< type * >( this->ProcessObject::GetInput(#name) ) ) \
732 this->ProcessObject::SetInput( #name, const_cast< type * >( _arg ) ); \
739 #define itkGetInputMacro(name, type) \
740 virtual const type * Get##name() const \
742 itkDebugMacro( "returning input " << #name " of " \
743 << static_cast< const type * >( this->ProcessObject::GetInput(#name) ) ); \
744 return static_cast< const type * >( this->ProcessObject::GetInput(#name) ); \
749 #define itkSetDecoratedInputMacro(name, type) \
750 virtual void Set##name##Input(const SimpleDataObjectDecorator< type > *_arg) \
752 itkDebugMacro("setting input " #name " to " << _arg); \
753 if ( _arg != static_cast< SimpleDataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ) \
755 this->ProcessObject::SetInput( #name, const_cast< SimpleDataObjectDecorator< type > * >( _arg ) ); \
759 virtual void Set##name(const type &_arg) \
761 typedef SimpleDataObjectDecorator< type > DecoratorType; \
762 itkDebugMacro("setting input " #name " to " << _arg); \
763 const DecoratorType *oldInput = \
764 static_cast< const DecoratorType * >( \
765 this->ProcessObject::GetInput(#name) ); \
766 if ( oldInput && oldInput->Get() == _arg ) \
770 typename DecoratorType::Pointer newInput = DecoratorType::New(); \
771 newInput->Set(_arg); \
772 this->Set##name##Input(newInput); \
777 #define itkGetDecoratedInputMacro(name, type) \
778 virtual const SimpleDataObjectDecorator< type > * Get##name##Input() const \
780 itkDebugMacro( "returning input " << #name " of " \
781 << static_cast< const SimpleDataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ); \
782 return static_cast< const SimpleDataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ); \
784 virtual const type & Get##name() const \
786 itkDebugMacro("Getting input " #name); \
787 typedef SimpleDataObjectDecorator< type > DecoratorType; \
788 const DecoratorType *input = \
789 static_cast< const DecoratorType * >( \
790 this->ProcessObject::GetInput(#name) ); \
791 if( input == NULL ) \
793 itkExceptionMacro(<<"input" #name " is not set"); \
795 return input->Get(); \
801 #define itkSetGetDecoratedInputMacro(name, type) \
802 itkSetDecoratedInputMacro(name, type) \
803 itkGetDecoratedInputMacro(name, type)
809 #define itkSetDecoratedObjectInputMacro(name, type) \
810 virtual void Set##name##Input(const DataObjectDecorator< type > *_arg) \
812 itkDebugMacro("setting input " #name " to " << _arg); \
813 if ( _arg != static_cast< DataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ) \
815 this->ProcessObject::SetInput( #name, const_cast< DataObjectDecorator< type > * >( _arg ) ); \
819 virtual void Set##name(const type * _arg) \
821 typedef DataObjectDecorator< type > DecoratorType; \
822 itkDebugMacro("setting input " #name " to " << _arg); \
823 const DecoratorType *oldInput = \
824 static_cast< const DecoratorType * >( \
825 this->ProcessObject::GetInput(#name) ); \
826 if ( oldInput && oldInput->Get() == _arg ) \
830 typename DecoratorType::Pointer newInput = DecoratorType::New(); \
831 newInput->Set(_arg); \
832 this->Set##name##Input(newInput); \
840 #define itkGetDecoratedObjectInputMacro(name, type) \
841 virtual const DataObjectDecorator< type > * Get##name##Input() const \
843 itkDebugMacro( "returning input " << #name " of " \
844 << static_cast< const DataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ); \
845 return static_cast< const DataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ); \
847 virtual const type * Get##name() const \
849 itkDebugMacro("Getting input " #name); \
850 typedef DataObjectDecorator< type > DecoratorType; \
851 const DecoratorType *input = \
852 static_cast< const DecoratorType * >( \
853 this->ProcessObject::GetInput(#name) ); \
854 if( input == NULL ) \
856 itkExceptionMacro(<<"input" #name " is not set"); \
858 return input->Get(); \
864 #define itkSetGetDecoratedObjectInputMacro(name, type) \
865 itkSetDecoratedObjectInputMacro(name, type) \
866 itkGetDecoratedObjectInputMacro(name, type)
869 #define itkSetMacro(name, type) \
870 virtual void Set##name (const type _arg) \
872 itkDebugMacro("setting " #name " to " << _arg); \
873 if ( this->m_##name != _arg ) \
875 this->m_##name = _arg; \
882 #define itkGetMacro(name, type) \
883 virtual type Get##name () \
885 return this->m_##name; \
892 #define itkGetConstMacro(name, type) \
893 virtual type Get##name () const \
895 return this->m_##name; \
903 #define itkGetConstReferenceMacro(name, type) \
904 virtual const type &Get##name () const \
906 return this->m_##name; \
914 #define itkSetEnumMacro(name, type) \
915 virtual void Set##name (const type _arg) \
917 itkDebugMacro( "setting " #name " to " << static_cast< long >( _arg ) ); \
918 if ( this->m_##name != _arg ) \
920 this->m_##name = _arg; \
930 #define itkGetEnumMacro(name, type) \
931 virtual type Get##name () const \
933 return this->m_##name; \
940 #define itkSetStringMacro(name) \
941 virtual void Set##name (const char *_arg) \
943 if ( _arg && ( _arg == this->m_##name ) ) { return; } \
946 this->m_##name = _arg; \
950 this->m_##name = ""; \
954 virtual void Set##name (const std::string & _arg) \
956 this->Set##name( _arg.c_str() ); \
964 #define itkGetStringMacro(name) \
965 virtual const char *Get##name () const \
967 return this->m_##name.c_str(); \
973 #define itkSetClampMacro(name, type, min, max) \
974 virtual void Set##name (type _arg) \
976 itkDebugMacro("setting " << #name " to " << _arg); \
977 if ( this->m_##name != ( _arg < min ? min : ( _arg > max ? max : _arg ) ) ) \
979 this->m_##name = ( _arg < min ? min : ( _arg > max ? max : _arg ) ); \
989 #define itkSetObjectMacro(name, type) \
990 virtual void Set##name (type * _arg) \
992 itkDebugMacro("setting " << #name " to " << _arg); \
993 if ( this->m_##name != _arg ) \
995 this->m_##name = _arg; \
1026 #define itkGetConstObjectMacro(name, type) \
1027 virtual const type * Get##name () const \
1029 return this->m_##name.GetPointer(); \
1033 #if defined ( ITK_FUTURE_LEGACY_REMOVE )
1039 # define itkGetObjectMacro(name, type) \
1040 virtual type * Get##name () \
1042 purposeful_error("itkGetObjectMacro should be replaced with itkGetModifiableObjectMacro."); \
1045 # define itkGetModifiableObjectMacro(name, type) \
1046 virtual type * GetModifiable##name () \
1048 return this->m_##name.GetPointer(); \
1050 itkGetConstObjectMacro(name, type)
1052 #else // defined ( ITK_FUTURE_LEGACY_REMOVE )
1055 # define itkGetObjectMacro(name, type) \
1056 virtual type * Get##name () \
1058 return this->m_##name.GetPointer(); \
1060 # define itkGetModifiableObjectMacro(name, type) \
1061 virtual type * GetModifiable##name () \
1063 return this->m_##name.GetPointer(); \
1065 itkGetConstObjectMacro(name, type) \
1066 itkGetObjectMacro(name, type)
1067 #endif // defined ( ITK_FUTURE_LEGACY_REMOVE )
1076 #define itkGetConstReferenceObjectMacro(name, type) \
1077 virtual const typename type::Pointer & Get##name () const \
1079 return this->m_##name; \
1086 #define itkSetConstObjectMacro(name, type) \
1087 virtual void Set##name (const type * _arg) \
1089 itkDebugMacro("setting " << #name " to " << _arg); \
1090 if ( this->m_##name != _arg ) \
1092 this->m_##name = _arg; \
1100 #define itkBooleanMacro(name) \
1101 virtual void name##On () \
1103 this->Set##name(true); \
1105 virtual void name##Off () \
1107 this->Set##name(false); \
1114 #define itkSetVectorMacro(name, type, count) \
1115 virtual void Set##name(type data[]) \
1118 for ( i = 0; i < count; i++ ) \
1120 if ( data[i] != this->m_##name[i] ) \
1128 for ( i = 0; i < count; i++ ) \
1130 this->m_##name[i] = data[i]; \
1138 #define itkGetVectorMacro(name, type, count) \
1139 virtual type * Get##name () const \
1141 return this->m_##name; \
1147 #define itkGPUKernelClassMacro(kernel) \
1151 static const char* GetOpenCLSource(); \
1154 virtual ~kernel(); \
1155 kernel(const kernel &); \
1156 void operator=(const kernel &); \
1160 #define itkGetOpenCLSourceFromKernelMacro(kernel) \
1161 static const char* GetOpenCLSource() \
1163 return kernel::GetOpenCLSource(); \
1168 #endif //end of itkMacro.h