Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkMacro.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkMacro.h,v $
00005   Language:  C++
00006   Date:      $Date: 2004/01/20 16:08:19 $
00007   Version:   $Revision: 1.50 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012   Portions of this code are covered under the VTK copyright.
00013   See VTKCopyright.txt or http://www.kitware.com/VTKCopyright.htm for details.
00014 
00015      This software is distributed WITHOUT ANY WARRANTY; without even 
00016      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00017      PURPOSE.  See the above copyright notices for more information.
00018 
00019 =========================================================================*/
00030 #ifndef __itkMacro_h
00031 #define __itkMacro_h
00032 
00033 #include "itkWin32Header.h"
00034 #include "itkConfigure.h"
00035 
00036 #include <string>
00037 
00038 // Determine type of string stream to use.
00039 #if !defined(CMAKE_NO_ANSI_STRING_STREAM)
00040 #  include <sstream>
00041 #elif !defined(CMAKE_NO_ANSI_STREAM_HEADERS)
00042 #  include <strstream>
00043 #  define ITK_NO_ANSI_STRING_STREAM
00044 #else
00045 #  include <strstream.h>
00046 #  define ITK_NO_ANSI_STRING_STREAM
00047 #endif
00048 
00053 namespace itk
00054 {
00055 } // end namespace itk - this is here for documentation purposes
00056 
00059 #define itkNotUsed(x)
00060 
00075 #if defined(_MSC_VER) && (_MSC_VER <= 1300) 
00076 #   define ITK_NO_INCLASS_MEMBER_INITIALIZATION
00077 #endif
00078 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x540)
00079 #   define ITK_NO_INCLASS_MEMBER_INITIALIZATION
00080 #endif
00081 #if defined(__SVR4) && !defined(__SUNPRO_CC)
00082 #   define ITK_NO_INCLASS_MEMBER_INITIALIZATION
00083 #endif
00084 
00085 #if defined(_MSC_VER) && (_MSC_VER <= 1300) 
00086 #define ITK_NO_SELF_AS_TRAIT_IN_TEMPLATE_ARGUMENTS
00087 #endif
00088 
00089 #ifdef ITK_NO_INCLASS_MEMBER_INITIALIZATION
00090 #   define itkStaticConstMacro(name,type,value) enum { name = value }
00091 #else
00092 #   define itkStaticConstMacro(name,type,value) static const type name = value
00093 #endif
00094 
00095 #ifdef ITK_NO_SELF_AS_TRAIT_IN_TEMPLATE_ARGUMENTS
00096 #   define itkGetStaticConstMacro(name) name
00097 #else
00098 #   define itkGetStaticConstMacro(name) (Self::name)
00099 #endif
00100 
00101 
00103 #define itkSetMacro(name,type) \
00104   virtual void Set##name (const type _arg) \
00105   { \
00106     itkDebugMacro("setting " #name " to " << _arg); \
00107     if (this->m_##name != _arg) \
00108       { \
00109       this->m_##name = _arg; \
00110       this->Modified(); \
00111       } \
00112   } 
00113 
00115 #define itkGetMacro(name,type) \
00116   virtual type Get##name () \
00117   { \
00118     itkDebugMacro("returning " << #name " of " << this->m_##name ); \
00119     return this->m_##name; \
00120   }
00121 
00125 #define itkGetConstMacro(name,type) \
00126   virtual type Get##name () const \
00127   { \
00128     itkDebugMacro("returning " << #name " of " << this->m_##name ); \
00129     return this->m_##name; \
00130   }
00131 
00136 #define itkGetConstReferenceMacro(name,type) \
00137   virtual const type & Get##name () const \
00138   { \
00139     itkDebugMacro("returning " << #name " of " << this->m_##name ); \
00140     return this->m_##name; \
00141   }
00142 
00146 #define itkSetStringMacro(name) \
00147   virtual void Set##name (const char* _arg) \
00148   { \
00149     if ( _arg && (_arg == this->m_##name) ) { return;} \
00150     if (_arg) \
00151       { \
00152       this->m_##name = _arg;\
00153       } \
00154      else \
00155       { \
00156       this->m_##name = ""; \
00157       } \
00158     this->Modified(); \
00159   } 
00160 
00161 
00165 #define itkGetStringMacro(name) \
00166   virtual const char* Get##name () const \
00167   { \
00168     return this->m_##name.c_str(); \
00169   } 
00170 
00174 #define itkSetClampMacro(name,type,min,max) \
00175   virtual void Set##name (type _arg) \
00176   { \
00177     itkDebugMacro("setting " << #name " to " << _arg ); \
00178     if (this->m_##name != (_arg<min?min:(_arg>max?max:_arg))) \
00179       { \
00180       this->m_##name = (_arg<min?min:(_arg>max?max:_arg)); \
00181       this->Modified(); \
00182       } \
00183   } 
00184 
00189 #define itkSetObjectMacro(name,type) \
00190   virtual void Set##name (type* _arg) \
00191   { \
00192     itkDebugMacro("setting " << #name " to " << _arg ); \
00193     if (this->m_##name != _arg) \
00194       { \
00195       this->m_##name = _arg; \
00196       this->Modified(); \
00197       } \
00198   } 
00199 
00202 #define itkGetObjectMacro(name,type) \
00203   virtual type * Get##name () \
00204   { \
00205     itkDebugMacro("returning " #name " address " << this->m_##name ); \
00206     return this->m_##name.GetPointer(); \
00207   } 
00208 
00213 #define itkSetConstObjectMacro(name,type) \
00214   virtual void Set##name (const type* _arg) \
00215   { \
00216     itkDebugMacro("setting " << #name " to " << _arg ); \
00217     if (this->m_##name != _arg) \
00218       { \
00219       this->m_##name = _arg; \
00220       this->Modified(); \
00221       } \
00222   } 
00223 
00224 
00227 #define itkGetConstObjectMacro(name,type) \
00228   virtual const type * Get##name () const \
00229   { \
00230     itkDebugMacro("returning " #name " address " << this->m_##name ); \
00231     return this->m_##name.GetPointer(); \
00232   } 
00233 
00236 #define itkGetConstReferenceObjectMacro(name,type) \
00237   virtual const typename type::Pointer & Get##name () const \
00238   { \
00239     itkDebugMacro("returning " #name " address " << this->m_##name ); \
00240     return this->m_##name; \
00241   } 
00242 
00245 #define itkBooleanMacro(name) \
00246   virtual void name##On () { this->Set##name(true);} \
00247   virtual void name##Off () { this->Set##name(false);}
00248 
00252 #define itkSetVectorMacro(name,type,count) \
00253   virtual void Set##name(type data[]) \
00254   { \
00255     unsigned int i; \
00256     for (i=0; i<count; i++) { if ( data[i] != this->m_##name[i] ) { break; }} \
00257     if ( i < count ) \
00258       { \
00259       this->Modified(); \
00260       for (i=0; i<count; i++) { this->m_##name[i] = data[i]; }\
00261       } \
00262   }
00263 
00266 #define itkGetVectorMacro(name,type,count) \
00267   virtual type *Get##name () const \
00268   { \
00269     return this->m_##name; \
00270   } 
00271 
00283 #define itkNewMacro(x) \
00284 static Pointer New(void) \
00285 { \
00286   Pointer smartPtr; \
00287   x *rawPtr = ::itk::ObjectFactory<x>::Create(); \
00288   if(rawPtr == NULL) \
00289     { \
00290     rawPtr = new x; \
00291     } \
00292   smartPtr = rawPtr; \
00293   rawPtr->UnRegister(); \
00294   return smartPtr; \
00295 }
00296 
00303 #define itkFactorylessNewMacro(x) \
00304 static Pointer New(void) \
00305 { \
00306   Pointer smartPtr; \
00307   x *rawPtr = new x; \
00308   smartPtr = rawPtr; \
00309   rawPtr->UnRegister(); \
00310   return smartPtr; \
00311 }
00312 
00315 #define itkTypeMacro(thisClass,superclass) \
00316     virtual const char *GetNameOfClass() const \
00317         {return #thisClass;} 
00318 
00319 
00320 namespace itk
00321 {
00328 extern ITKCommon_EXPORT void OutputWindowDisplayText(const char*);
00329 extern ITKCommon_EXPORT void OutputWindowDisplayErrorText(const char*);
00330 extern ITKCommon_EXPORT void OutputWindowDisplayWarningText(const char*);
00331 extern ITKCommon_EXPORT void OutputWindowDisplayGenericOutputText(const char*);
00332 extern ITKCommon_EXPORT void OutputWindowDisplayDebugText(const char*);
00333 } // end namespace itk
00334 
00338 #ifdef ITK_LEAN_AND_MEAN
00339 #define itkDebugMacro(x)
00340 #else
00341 #define itkDebugMacro(x) \
00342 { if (this->GetDebug() && itk::Object::GetGlobalWarningDisplay()) \
00343     { ::itk::OStringStream itkmsg; \
00344       itkmsg << "Debug: In " __FILE__ ", line " << __LINE__ << "\n" \
00345              << this->GetNameOfClass() << " (" << this << "): " x  \
00346              << "\n\n"; \
00347       ::itk::OutputWindowDisplayDebugText(itkmsg.str().c_str());} \
00348 }
00349 #endif
00350 
00351 
00355 #ifdef ITK_LEAN_AND_MEAN
00356 #define itkWarningMacro(x)
00357 #else
00358 #define itkWarningMacro(x) \
00359 { if (itk::Object::GetGlobalWarningDisplay()) \
00360     { ::itk::OStringStream itkmsg; \
00361       itkmsg << "WARNING: In " __FILE__ ", line " << __LINE__ << "\n" \
00362              << this->GetNameOfClass() << " (" << this << "): " x  \
00363              << "\n\n"; \
00364       itk::OutputWindowDisplayWarningText(itkmsg.str().c_str());} \
00365 }
00366 #endif
00367 
00368 namespace itk
00369 {
00370 
00376 #if !defined(ITK_NO_ANSI_STRING_STREAM)
00377 class OStringStream: public std::ostringstream
00378 {
00379 public:
00380   OStringStream() {}
00381 private:
00382   OStringStream(const OStringStream&);
00383   void operator=(const OStringStream&);
00384 };
00385 #else
00386 namespace OStringStreamDetail
00387 {
00388   class Cleanup
00389   {
00390   public:
00391     Cleanup(std::ostrstream& ostr): m_OStrStream(ostr) {}
00392     ~Cleanup() { m_OStrStream.rdbuf()->freeze(0); }
00393     static void IgnoreUnusedVariable(const Cleanup&) {}
00394   protected:
00395     std::ostrstream& m_OStrStream;
00396   };
00397 }//namespace OStringStreamDetail
00398 
00399 class OStringStream: public std::ostrstream
00400 {
00401 public:
00402   typedef std::ostrstream Superclass;
00403   OStringStream() {}
00404   std::string str()
00405     {
00406       OStringStreamDetail::Cleanup cleanup(*this);
00407       OStringStreamDetail::Cleanup::IgnoreUnusedVariable(cleanup);
00408       int pcount = this->pcount();
00409       const char* ptr = this->Superclass::str();
00410       return std::string(ptr?ptr:"", pcount);
00411     }
00412 private:
00413   OStringStream(const OStringStream&);
00414   void operator=(const OStringStream&);
00415 };
00416 #endif
00417 
00418 }//namespace itk
00419 
00420 #include "itkExceptionObject.h"
00421   
00425 #define itkExceptionMacro(x) \
00426   { \
00427   ::itk::OStringStream message; \
00428   message << "itk::ERROR: " << this->GetNameOfClass() \
00429           << "(" << this << "): " x; \
00430   ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str()); \
00431   throw e_; /* Explicit naming to work around Intel compiler bug.  */ \
00432   }
00433 
00434 #define itkGenericExceptionMacro(x) \
00435   { \
00436   ::itk::OStringStream message; \
00437   message << "itk::ERROR: " x; \
00438   ::itk::ExceptionObject e_(__FILE__, __LINE__, message.str().c_str()); \
00439   throw e_; /* Explicit naming to work around Intel compiler bug.  */ \
00440   }
00441 
00442 #ifdef ITK_LEAN_AND_MEAN
00443 #define itkGenericOutputMacro(x)
00444 #else
00445 #define itkGenericOutputMacro(x) \
00446 { if (::itk::Object::GetGlobalWarningDisplay()) \
00447     { ::itk::OStringStream itkmsg; \
00448       itkmsg << "WARNING: In " __FILE__ ", line " << __LINE__ << "\n" \
00449              x << "\n\n"; \
00450       itk::OutputWindowDisplayGenericOutputText(itkmsg.str().c_str());} \
00451 }
00452 #endif
00453 
00454 
00455 #endif //end of itkMacro.h
00456 
00457 

Generated at Sun Jan 25 13:19:39 2004 for ITK by doxygen 1.3.3 written by Dimitri van Heesch, © 1997-2000