Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __itkMetaDataObject_h
00021 #define __itkMetaDataObject_h
00022
00023 #include "itkMetaDataDictionary.h"
00024 #include "itkMacro.h"
00025 #include "itkObjectFactory.h"
00026 #include "itkCommand.h"
00027 #include "itkFastMutexLock.h"
00028
00029 #include <string.h>
00030 #include <cstring>
00031
00032 namespace itk
00033 {
00061 template <class MetaDataObjectType>
00062 class ITK_EXPORT MetaDataObject: public MetaDataObjectBase
00063 {
00064 public:
00065
00067 typedef MetaDataObject Self;
00068 typedef MetaDataObjectBase Superclass;
00069 typedef SmartPointer<Self> Pointer;
00070 typedef SmartPointer<const Self> ConstPointer;
00071
00073 itkFactorylessNewMacro(Self);
00074
00076 itkTypeMacro(MetaDataObject, MetaDataObjectBase);
00077
00082 MetaDataObject(void);
00083
00087 virtual ~MetaDataObject(void);
00088
00093 MetaDataObject(const MetaDataObjectType InitializerValue);
00094
00099 MetaDataObject(const MetaDataObject<MetaDataObjectType> &TemplateObject);
00100
00108 virtual const char * GetMetaDataObjectTypeName(void) const;
00109
00117 virtual const std::type_info & GetMetaDataObjectTypeInfo(void) const;
00118
00124 const MetaDataObjectType & GetMetaDataObjectValue(void) const;
00125
00131 void SetMetaDataObjectValue(const MetaDataObjectType & NewValue );
00132
00137 virtual void Print(std::ostream& os) const;
00138 private:
00139
00140
00141
00146 MetaDataObjectType m_MetaDataObjectValue;
00147 };
00148
00149
00159 template <class T>
00160 inline void EncapsulateMetaData(MetaDataDictionary &Dictionary, const std::string & key, const T &invalue)
00161 {
00162 typename MetaDataObject<T>::Pointer temp=MetaDataObject<T>::New();
00163 temp->SetMetaDataObjectValue(invalue);
00164 Dictionary[key] = temp;
00165 }
00167
00168 template <class T>
00169 inline void EncapsulateMetaData(MetaDataDictionary &Dictionary, const char *key, const T &invalue)
00170 {
00171 EncapsulateMetaData(Dictionary, std::string(key), invalue);
00172 }
00173
00183 template <class T>
00184 inline bool ExposeMetaData(MetaDataDictionary &Dictionary, const std::string key, T &outval)
00185 {
00186 if(!Dictionary.HasKey(key))
00187 {
00188 return false;
00189 }
00190
00191 MetaDataObjectBase::Pointer baseObjectSmartPointer = Dictionary[key];
00192
00193 if(strcmp(typeid(T).name(),baseObjectSmartPointer->GetMetaDataObjectTypeName()) != 0)
00194 {
00195 return false;
00196 }
00197
00198
00199
00200 #if (defined(__sgi) && !defined(__GNUC__))
00201
00211 outval =
00212 reinterpret_cast<MetaDataObject <T> *>(Dictionary[key].GetPointer())->GetMetaDataObjectValue();
00213 #else
00214 {
00215 if(MetaDataObject <T> * TempMetaDataObject =dynamic_cast<MetaDataObject <T> *>(Dictionary[key].GetPointer()))
00216 {
00217 outval = TempMetaDataObject->GetMetaDataObjectValue();
00218 }
00219 else
00220 {
00221 return false;
00222 }
00223 }
00224 #endif
00225
00226
00227 return true;
00228 }
00230
00231
00232
00233
00234 template <class T>
00235 inline bool ExposeMetaData(MetaDataDictionary &Dictionary, const char * const key, T &outval)
00236 {
00237 return ExposeMetaData(Dictionary, std::string(key), outval);
00238 }
00239
00240
00241 template <class T>
00242 inline bool ExposeMetaData(const MetaDataDictionary &Dictionary, const std::string key, T &outval)
00243 {
00244 MetaDataDictionary NonConstVersion=Dictionary;
00245 return ExposeMetaData(NonConstVersion,key,outval);
00246 }
00247
00248 template <class T>
00249 inline bool ExposeMetaData(const MetaDataDictionary &Dictionary, const char * const key, T &outval)
00250 {
00251 MetaDataDictionary NonConstVersion=Dictionary;
00252 return ExposeMetaData(Dictionary, std::string(key), outval);
00253 }
00254
00255 }
00256
00264 #define NATIVE_TYPE_METADATAPRINT(TYPE_NAME) \
00265 template <> \
00266 void \
00267 itk::MetaDataObject< TYPE_NAME > \
00268 ::Print(std::ostream& os) const \
00269 { \
00270 os << this->m_MetaDataObjectValue << std::endl; \
00271 } \
00272 template <> \
00273 void \
00274 itk::MetaDataObject< const TYPE_NAME > \
00275 ::Print(std::ostream& os) const \
00276 { \
00277 os << this->m_MetaDataObjectValue << std::endl; \
00278 }
00279
00280
00289 #define ITK_OBJECT_TYPE_METADATAPRINT_1COMMA( TYPE_NAME_PART1 , TYPE_NAME_PART2 ) \
00290 template <> \
00291 void \
00292 itk::MetaDataObject< TYPE_NAME_PART1 , TYPE_NAME_PART2 > \
00293 ::Print(std::ostream& os) const \
00294 { \
00295 this->m_MetaDataObjectValue->Print(os); \
00296 } \
00297 template <> \
00298 void \
00299 itk::MetaDataObject< const TYPE_NAME_PART1 , TYPE_NAME_PART2 > \
00300 ::Print(std::ostream& os) const \
00301 { \
00302 this->m_MetaDataObjectValue->Print(os); \
00303 }
00304
00305
00313 #define ITK_IMAGE_TYPE_METADATAPRINT(STORAGE_TYPE) \
00314 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 1 >::Pointer) \
00315 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 2 >::Pointer) \
00316 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 3 >::Pointer) \
00317 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 4 >::Pointer) \
00318 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 5 >::Pointer) \
00319 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 6 >::Pointer) \
00320 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 7 >::Pointer) \
00321 ITK_OBJECT_TYPE_METADATAPRINT_1COMMA(itk::Image< STORAGE_TYPE , 8 >::Pointer) \
00322
00323
00324 #define ITK_TEMPLATE_MetaDataObject(_, EXPORT, x, y) namespace itk { \
00325 _(1(class EXPORT MetaDataObject< ITK_TEMPLATE_1 x >)) \
00326 namespace Templates { typedef MetaDataObject< ITK_TEMPLATE_1 x > \
00327 MetaDataObject##y; } \
00328 }
00329
00330 #if ITK_TEMPLATE_EXPLICIT
00331 # include "Templates/itkMetaDataObject+-.h"
00332 #endif
00333
00334 #if ITK_TEMPLATE_TXX
00335 # include "itkMetaDataObject.txx"
00336 #endif
00337
00338
00339 #endif //itkMetaDataObject_h
00340