42 #include "itkConfigure.h"
78 #if defined( _MSC_VER ) && ( _MSC_VER < 1310 )
81 #if defined( __SUNPRO_CC ) && ( __SUNPRO_CC < 0x590 )
82 #error "__SUNPRO_CC < 0x590 not supported under ITKv4"
84 #if defined( __CYGWIN__ )
85 #error "The Cygwin compiler is not supported in ITKv4 and above"
87 #if defined( __BORLANDC__ )
88 #error "The Borland C compiler is not supported in ITKv4 and above"
90 #if defined( __MWERKS__ )
91 #error "The MetroWerks compiler is not supported in ITKv4 and above"
93 #if defined( __GNUC__ ) && ( __GNUC__ < 3 )
94 #error "The __GNUC__ version 2.95 compiler is not supprted under ITKv4 and above"
99 #error "The __sgi compiler is not supprted under ITKv4 and above"
109 #if defined( _WIN32 ) || defined ( WIN32 )
110 #define ITK_ABI_IMPORT __declspec(dllimport)
111 #define ITK_ABI_EXPORT __declspec(dllexport)
112 #define ITK_ABI_HIDDEN
115 #define ITK_ABI_IMPORT __attribute__ ((visibility ("default")))
116 #define ITK_ABI_EXPORT __attribute__ ((visibility ("default")))
117 #define ITK_ABI_HIDDEN __attribute__ ((visibility ("hidden")))
119 #define ITK_ABI_IMPORT
120 #define ITK_ABI_EXPORT
121 #define ITK_ABI_HIDDEN
125 #define ITKCommon_HIDDEN ITK_ABI_HIDDEN
127 #if !defined( ITKSTATIC )
128 #ifdef ITKCommon_EXPORTS
129 #define ITKCommon_EXPORT ITK_ABI_EXPORT
131 #define ITKCommon_EXPORT ITK_ABI_IMPORT
138 #define ITKCommon_EXPORT ITK_ABI_EXPORT
140 #define ITKCommon_EXPORT
164 #define itkNewMacro(x) \
165 itkSimpleNewMacro(x) \
166 itkCreateAnotherMacro(x) \
169 #define itkSimpleNewMacro(x) \
170 static Pointer New(void) \
172 Pointer smartPtr = ::itk::ObjectFactory< x >::Create(); \
173 if ( smartPtr.GetPointer() == NULL ) \
177 smartPtr->UnRegister(); \
181 #define itkCreateAnotherMacro(x) \
182 virtual::itk::LightObject::Pointer CreateAnother(void) const \
184 ::itk::LightObject::Pointer smartPtr; \
185 smartPtr = x::New().GetPointer(); \
189 #define itkCloneMacro(x) \
190 Pointer Clone() const \
193 dynamic_cast<x *>(this->InternalClone().GetPointer()); \
213 #define itkFactorylessNewMacro(x) \
214 static Pointer New(void) \
217 x * rawPtr = new x; \
219 rawPtr->UnRegister(); \
222 virtual::itk::LightObject::Pointer CreateAnother(void) const \
224 ::itk::LightObject::Pointer smartPtr; \
225 smartPtr = x::New().GetPointer(); \
232 #define itkTypeMacro(thisClass, superclass) \
233 virtual const char *GetNameOfClass() const \
246 extern ITKCommon_EXPORT
void OutputWindowDisplayText(
const char *);
249 extern ITKCommon_EXPORT
void OutputWindowDisplayErrorText(
const char *);
251 extern ITKCommon_EXPORT
void OutputWindowDisplayWarningText(
const char *);
253 extern ITKCommon_EXPORT
void OutputWindowDisplayGenericOutputText(
const char *);
255 extern ITKCommon_EXPORT
void OutputWindowDisplayDebugText(
const char *);
261 #if defined( NDEBUG )
262 #define itkDebugMacro(x)
263 #define itkDebugStatement(x)
265 #define itkDebugMacro(x) \
267 if ( this->GetDebug() && ::itk::Object::GetGlobalWarningDisplay() ) \
269 std::ostringstream itkmsg; \
270 itkmsg << "Debug: In " __FILE__ ", line " << __LINE__ << "\n" \
271 << this->GetNameOfClass() << " (" << this << "): " x \
273 ::itk::OutputWindowDisplayDebugText( itkmsg.str().c_str() ); \
280 #define itkDebugStatement(x) x
286 #define itkWarningMacro(x) \
288 if ( ::itk::Object::GetGlobalWarningDisplay() ) \
290 std::ostringstream itkmsg; \
291 itkmsg << "WARNING: In " __FILE__ ", line " << __LINE__ << "\n" \
292 << this->GetNameOfClass() << " (" << this << "): " x \
294 ::itk::OutputWindowDisplayWarningText( itkmsg.str().c_str() ); \
301 #define itkWarningStatement(x) x
303 #if defined( ITK_CPP_FUNCTION )
304 #if defined( _WIN32 ) && !defined( __MINGW32__ ) && !defined( CABLE_CONFIGURATION ) \
306 #define ITK_LOCATION __FUNCSIG__
307 #elif defined( __GNUC__ )
308 #define ITK_LOCATION __PRETTY_FUNCTION__
310 #define ITK_LOCATION __FUNCTION__
313 #define ITK_LOCATION "unknown"
321 #define itkExceptionMacro(x) \
323 std::ostringstream message; \
324 message << "itk::ERROR: " << this->GetNameOfClass() \
325 << "(" << this << "): " x; \
326 ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str(), ITK_LOCATION); \
331 #define itkGenericExceptionMacro(x) \
333 std::ostringstream message; \
334 message << "itk::ERROR: " x; \
335 ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str(), ITK_LOCATION); \
339 #define itkDeclareExceptionMacro(newexcp,parentexcp,whatmessage) \
341 class ITK_EXPORT newexcp : public parentexcp \
344 newexcp( const char *file, unsigned int lineNumber ) : \
345 parentexcp( file, lineNumber ) \
347 this->SetDescription( whatmessage ); \
349 newexcp( const std::string & file, unsigned int lineNumber ) : \
350 parentexcp( file, lineNumber ) \
352 this->SetDescription( whatmessage ); \
354 itkTypeMacro(newexcp, parentexcp); \
358 #define itkSpecializedExceptionMacro(exceptiontype) \
360 ::itk::exceptiontype e_(__FILE__, __LINE__); \
361 e_.SetLocation(ITK_LOCATION); \
365 #define itkSpecializedMessageExceptionMacro(exceptiontype,x) \
367 ::itk::exceptiontype e_(__FILE__, __LINE__); \
368 std::ostringstream message; \
369 message << "itk::ERROR: " x; \
370 e_.SetDescription(message.str().c_str()); \
371 e_.SetLocation(ITK_LOCATION); \
376 #define itkGenericOutputMacro(x) \
378 if ( ::itk::Object::GetGlobalWarningDisplay() ) \
380 std::ostringstream itkmsg; \
381 itkmsg << "WARNING: In " __FILE__ ", line " << __LINE__ << "\n" \
383 ::itk::OutputWindowDisplayGenericOutputText( itkmsg.str().c_str() ); \
390 #define itkLogMacro(x, y) \
392 if ( this->GetLogger() ) \
394 this->GetLogger()->Write(::itk::LoggerBase::x, y); \
398 #define itkLogMacroStatic(obj, x, y) \
400 if ( obj->GetLogger() ) \
402 obj->GetLogger()->Write(::itk::LoggerBase::x, y); \
428 #if defined( ITK_LEGACY_REMOVE )
429 #define itkLegacyMacro(method)
430 #elif defined( ITK_LEGACY_SILENT ) || defined( ITK_LEGACY_TEST ) || defined( CSWIG )
432 #define itkLegacyMacro(method) method
436 #if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) && ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) )
437 #define itkLegacyMacro(method) method __attribute__( ( deprecated ) )
438 #elif defined( _MSC_VER )
439 #define itkLegacyMacro(method) __declspec(deprecated) method
441 #define itkLegacyMacro(method) method
458 #if defined( ITK_LEGACY_REMOVE ) || defined( ITK_LEGACY_SILENT )
459 #define itkLegacyBodyMacro(method, version)
460 #define itkLegacyReplaceBodyMacro(method, version, replace)
461 #define itkGenericLegacyBodyMacro(method, version)
462 #define itkGenericLegacyReplaceBodyMacro(method, version, replace)
464 #define itkLegacyBodyMacro(method, version) \
465 itkWarningMacro(#method " was deprecated for ITK " #version " and will be removed in a future version.")
466 #define itkLegacyReplaceBodyMacro(method, version, replace) \
468 #method " was deprecated for ITK " #version " and will be removed in a future version. Use " #replace \
470 #define itkGenericLegacyBodyMacro(method, version) \
471 itkGenericOutputMacro(#method " was deprecated for ITK " #version " and will be removed in a future version.")
472 #define itkGenericLegacyReplaceBodyMacro(method, version, replace) \
473 itkGenericOutputMacro( \
474 #method " was deprecated for ITK " #version " and will be removed in a future version. Use " #replace \
478 #if defined ( ITK_LEGACY_REMOVE )
479 #define ITK_TEMPLATE_TXX "error ITK_TEMPLATE_TXX is no longer a supported identifier, you should replace with ITK_MANUAL_INSTANTIATION as a replacement"
481 #define ITK_TEMPLATE_TXX 1
489 #define ITK_CACHE_LINE_ALIGNMENT 64
495 #if defined ( ITK_HAS_CPP11_ALIGNAS )
496 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
497 typedef oldtype newtype alignas(alignment)
498 #elif defined( ITK_HAS_GNU_ATTRIBUTE_ALIGNED )
499 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
500 typedef oldtype newtype __attribute__((aligned(alignment)))
501 #elif defined ( _MSC_VER )
502 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
503 typedef __declspec(align( alignment )) struct oldtype newtype
505 # define itkAlignedTypedef( alignment, oldtype, newtype ) \
506 typedef oldtype newtype
538 #if defined( ITK_SUPPORTS_TEMPLATED_FRIEND_FUNCTION_WITH_NULL_STRING )
539 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T)
541 #if defined( ITK_SUPPORTS_TEMPLATED_FRIEND_FUNCTION_WITH_EMPTY_BRACKETS )
542 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T) < >
544 #if defined( ITK_SUPPORTS_TEMPLATED_FRIEND_FUNCTION_WITH_TEMPLATE_ARGUMENTS )
545 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T) < T >
551 #if ( defined ( _MSC_VER ) && ( _MSC_VER >= 1600 ) )
552 #ifdef ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT
553 #undef ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT
555 #define ITK_FRIEND_TEMPLATE_FUNCTION_ARGUMENT(T)
564 #if defined( __INTEL_COMPILER ) && __INTEL_COMPILER >= 700
565 #define ITK_TEMPLATE_EXTERN 1
566 #elif defined( __GNUC__ ) && __GNUC__ >= 3
567 #define ITK_TEMPLATE_EXTERN 1
568 #elif defined( _MSC_VER )
569 #define ITK_TEMPLATE_EXTERN 1
571 #if !defined( ITK_TEMPLATE_DO_NOT_INSTANTIATE )
572 #define ITK_TEMPLATE_DO_NOT_INSTANTIATE 0
574 #if !defined( ITK_TEMPLATE_EXTERN )
575 #define ITK_TEMPLATE_EXTERN 0
585 #define ITK_TEMPLATE_EXPORT(x) ITK_TEMPLATE_EXPORT_DELAY(x)
586 #define ITK_TEMPLATE_EXPORT_DELAY(x) template ITK_TEMPLATE_##x;
596 #if ITK_TEMPLATE_EXTERN
597 #define ITK_TEMPLATE_IMPORT_DELAY(x) extern template ITK_TEMPLATE_##x;
598 #elif ITK_TEMPLATE_DO_NOT_INSTANTIATE
599 #define ITK_TEMPLATE_IMPORT_DELAY(x) \
600 ITK_TEMPLATE_IMPORT_IMPL(do_not_instantiate ITK_TEMPLATE_##x)
601 #define ITK_TEMPLATE_IMPORT_IMPL(x) _Pragma(#x)
603 #if defined( ITK_TEMPLATE_IMPORT_DELAY )
604 #define ITK_TEMPLATE_IMPORT(x) ITK_TEMPLATE_IMPORT_DELAY(x)
605 #define ITK_TEMPLATE_IMPORT_WORKS 1
607 #define ITK_TEMPLATE_IMPORT(x)
608 #define ITK_TEMPLATE_IMPORT_WORKS 0
615 #define ITK_EXPORT_ITKCommon(c, x, n) \
616 ITK_EXPORT_TEMPLATE(ITKCommon_EXPORT, c, x, n)
617 #define ITK_IMPORT_ITKCommon(c, x, n) \
618 ITK_IMPORT_TEMPLATE(ITKCommon_EXPORT, c, x, n)
633 #define itkForLoopAssignmentMacro(DestinationType, \
635 DestinationElementType, \
638 NumberOfIterations) \
639 for ( unsigned int i = 0; i < NumberOfIterations; ++i ) \
641 DestinationArray[i] = static_cast< DestinationElementType >( SourceArray[i] ); \
653 #define itkForLoopRoundingAndAssignmentMacro(DestinationType, \
654 Sourcrnd_halfintup, \
655 DestinationElementType, \
658 NumberOfIterations) \
659 for ( unsigned int i = 0; i < NumberOfIterations; ++i ) \
661 DestinationArray[i] = itk::Math::Round< DestinationElementType >(SourceArray[i]); \
669 #define itkAssertInDebugOrThrowInReleaseMacro(msg) __assert_fail (msg, __FILE__, __LINE__, __ASSERT_FUNCTION);
671 #define itkAssertInDebugOrThrowInReleaseMacro(msg) itkGenericExceptionMacro(<< msg);
675 #define itkAssertInDebugOrThrowInReleaseMacro(msg) itkGenericExceptionMacro(<< msg);
678 #define itkAssertOrThrowMacro(test, message) \
681 std::ostringstream msgstr; \
683 itkAssertInDebugOrThrowInReleaseMacro( msgstr.str().c_str() ); \
687 #define itkAssertInDebugAndIgnoreInReleaseMacro(X) assert(X)
689 #define itkAssertInDebugAndIgnoreInReleaseMacro(X)
692 #ifdef ITKV3_COMPATIBILITY
696 #define ITK_TYPENAME typename
702 template <
typename TTarget,
typename TSource>
703 TTarget itkDynamicCastInDebugMode(TSource x)
710 TTarget rval =
dynamic_cast<TTarget
>(x);
713 itkGenericExceptionMacro(<<
"Failed dynamic cast to "
714 <<
typeid(TTarget).name()
716 << x->GetNameOfClass());
720 return static_cast<TTarget
>(x);
732 #define itkStaticConstMacro(name, type, value) enum { name = value }
734 #define itkGetStaticConstMacro(name) (Self::name)
737 #define itkSetInputMacro(name, type) \
738 virtual void Set##name(const type *_arg) \
740 itkDebugMacro("setting input " #name " to " << _arg); \
741 if ( _arg != static_cast< type * >( this->ProcessObject::GetInput(#name) ) ) \
743 this->ProcessObject::SetInput( #name, const_cast< type * >( _arg ) ); \
750 #define itkGetInputMacro(name, type) \
751 virtual const type * Get##name() const \
753 itkDebugMacro( "returning input " << #name " of " \
754 << static_cast< const type * >( this->ProcessObject::GetInput(#name) ) ); \
755 return static_cast< const type * >( this->ProcessObject::GetInput(#name) ); \
760 #define itkSetDecoratedInputMacro(name, type) \
761 virtual void Set##name##Input(const SimpleDataObjectDecorator< type > *_arg) \
763 itkDebugMacro("setting input " #name " to " << _arg); \
764 if ( _arg != static_cast< SimpleDataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ) \
766 this->ProcessObject::SetInput( #name, const_cast< SimpleDataObjectDecorator< type > * >( _arg ) ); \
770 virtual void Set##name(const type &_arg) \
772 typedef SimpleDataObjectDecorator< type > DecoratorType; \
773 itkDebugMacro("setting input " #name " to " << _arg); \
774 const DecoratorType *oldInput = \
775 static_cast< const DecoratorType * >( \
776 this->ProcessObject::GetInput(#name) ); \
777 if ( oldInput && oldInput->Get() == _arg ) \
781 typename DecoratorType::Pointer newInput = DecoratorType::New(); \
782 newInput->Set(_arg); \
783 this->Set##name##Input(newInput); \
788 #define itkGetDecoratedInputMacro(name, type) \
789 virtual const SimpleDataObjectDecorator< type > * Get##name##Input() const \
791 itkDebugMacro( "returning input " << #name " of " \
792 << static_cast< const SimpleDataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ); \
793 return static_cast< const SimpleDataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ); \
795 virtual const type & Get##name() const \
797 itkDebugMacro("Getting input " #name); \
798 typedef SimpleDataObjectDecorator< type > DecoratorType; \
799 const DecoratorType *input = \
800 static_cast< const DecoratorType * >( \
801 this->ProcessObject::GetInput(#name) ); \
802 if( input == NULL ) \
804 itkExceptionMacro(<<"input" #name " is not set"); \
806 return input->Get(); \
812 #define itkSetGetDecoratedInputMacro(name, type) \
813 itkSetDecoratedInputMacro(name, type) \
814 itkGetDecoratedInputMacro(name, type)
820 #define itkSetDecoratedObjectInputMacro(name, type) \
821 virtual void Set##name##Input(const DataObjectDecorator< type > *_arg) \
823 itkDebugMacro("setting input " #name " to " << _arg); \
824 if ( _arg != static_cast< DataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ) \
826 this->ProcessObject::SetInput( #name, const_cast< DataObjectDecorator< type > * >( _arg ) ); \
830 virtual void Set##name(const type * _arg) \
832 typedef DataObjectDecorator< type > DecoratorType; \
833 itkDebugMacro("setting input " #name " to " << _arg); \
834 const DecoratorType *oldInput = \
835 static_cast< const DecoratorType * >( \
836 this->ProcessObject::GetInput(#name) ); \
837 if ( oldInput && oldInput->Get() == _arg ) \
841 typename DecoratorType::Pointer newInput = DecoratorType::New(); \
842 newInput->Set(_arg); \
843 this->Set##name##Input(newInput); \
851 #define itkGetDecoratedObjectInputMacro(name, type) \
852 virtual const DataObjectDecorator< type > * Get##name##Input() const \
854 itkDebugMacro( "returning input " << #name " of " \
855 << static_cast< const DataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ) ); \
856 return static_cast< const DataObjectDecorator< type > * >( this->ProcessObject::GetInput(#name) ); \
858 virtual const type * Get##name() const \
860 itkDebugMacro("Getting input " #name); \
861 typedef DataObjectDecorator< type > DecoratorType; \
862 const DecoratorType *input = \
863 static_cast< const DecoratorType * >( \
864 this->ProcessObject::GetInput(#name) ); \
865 if( input == NULL ) \
867 itkExceptionMacro(<<"input" #name " is not set"); \
869 return input->Get(); \
875 #define itkSetGetDecoratedObjectInputMacro(name, type) \
876 itkSetDecoratedObjectInputMacro(name, type) \
877 itkGetDecoratedObjectInputMacro(name, type)
880 #define itkSetMacro(name, type) \
881 virtual void Set##name (const type _arg) \
883 itkDebugMacro("setting " #name " to " << _arg); \
884 if ( this->m_##name != _arg ) \
886 this->m_##name = _arg; \
893 #define itkGetMacro(name, type) \
894 virtual type Get##name () \
896 return this->m_##name; \
903 #define itkGetConstMacro(name, type) \
904 virtual type Get##name () const \
906 return this->m_##name; \
914 #define itkGetConstReferenceMacro(name, type) \
915 virtual const type &Get##name () const \
917 return this->m_##name; \
925 #define itkSetEnumMacro(name, type) \
926 virtual void Set##name (const type _arg) \
928 itkDebugMacro( "setting " #name " to " << static_cast< long >( _arg ) ); \
929 if ( this->m_##name != _arg ) \
931 this->m_##name = _arg; \
941 #define itkGetEnumMacro(name, type) \
942 virtual type Get##name () const \
944 return this->m_##name; \
951 #define itkSetStringMacro(name) \
952 virtual void Set##name (const char *_arg) \
954 if ( _arg && ( _arg == this->m_##name ) ) { return; } \
957 this->m_##name = _arg; \
961 this->m_##name = ""; \
965 virtual void Set##name (const std::string & _arg) \
967 this->Set##name( _arg.c_str() ); \
975 #define itkGetStringMacro(name) \
976 virtual const char *Get##name () const \
978 return this->m_##name.c_str(); \
984 #define itkSetClampMacro(name, type, min, max) \
985 virtual void Set##name (type _arg) \
987 itkDebugMacro("setting " << #name " to " << _arg); \
988 if ( this->m_##name != ( _arg < min ? min : ( _arg > max ? max : _arg ) ) ) \
990 this->m_##name = ( _arg < min ? min : ( _arg > max ? max : _arg ) ); \
1000 #define itkSetObjectMacro(name, type) \
1001 virtual void Set##name (type * _arg) \
1003 itkDebugMacro("setting " << #name " to " << _arg); \
1004 if ( this->m_##name != _arg ) \
1006 this->m_##name = _arg; \
1037 #define itkGetConstObjectMacro(name, type) \
1038 virtual const type * Get##name () const \
1040 return this->m_##name.GetPointer(); \
1044 #if defined ( ITK_FUTURE_LEGACY_REMOVE )
1050 # define itkGetObjectMacro(name, type) \
1051 virtual type * Get##name () \
1053 purposeful_error("itkGetObjectMacro should be replaced with itkGetModifiableObjectMacro."); \
1056 # define itkGetModifiableObjectMacro(name, type) \
1057 virtual type * GetModifiable##name () \
1059 return this->m_##name.GetPointer(); \
1061 itkGetConstObjectMacro(name, type)
1063 #else // defined ( ITK_FUTURE_LEGACY_REMOVE )
1066 # define itkGetObjectMacro(name, type) \
1067 virtual type * Get##name () \
1069 return this->m_##name.GetPointer(); \
1071 # define itkGetModifiableObjectMacro(name, type) \
1072 virtual type * GetModifiable##name () \
1074 return this->m_##name.GetPointer(); \
1076 itkGetConstObjectMacro(name, type) \
1077 itkGetObjectMacro(name, type)
1078 #endif // defined ( ITK_FUTURE_LEGACY_REMOVE )
1083 #define itkGetConstReferenceObjectMacro(name, type) \
1084 virtual const typename type::Pointer & Get##name () const \
1086 return this->m_##name; \
1093 #define itkSetConstObjectMacro(name, type) \
1094 virtual void Set##name (const type * _arg) \
1096 itkDebugMacro("setting " << #name " to " << _arg); \
1097 if ( this->m_##name != _arg ) \
1099 this->m_##name = _arg; \
1107 #define itkBooleanMacro(name) \
1108 virtual void name##On () \
1110 this->Set##name(true); \
1112 virtual void name##Off () \
1114 this->Set##name(false); \
1121 #define itkSetVectorMacro(name, type, count) \
1122 virtual void Set##name(type data[]) \
1125 for ( i = 0; i < count; i++ ) \
1127 if ( data[i] != this->m_##name[i] ) \
1135 for ( i = 0; i < count; i++ ) \
1137 this->m_##name[i] = data[i]; \
1145 #define itkGetVectorMacro(name, type, count) \
1146 virtual type * Get##name () const \
1148 return this->m_##name; \
1154 #define itkGPUKernelClassMacro(kernel) \
1155 class ITK_EXPORT kernel \
1158 static const char* GetOpenCLSource(); \
1161 virtual ~kernel(); \
1162 kernel(const kernel &); \
1163 void operator=(const kernel &); \
1167 #define itkGetOpenCLSourceFromKernelMacro(kernel) \
1168 static const char* GetOpenCLSource() \
1170 return kernel::GetOpenCLSource(); \
1175 #endif //end of itkMacro.h