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 #include "mitkSmartPointerProperty.h"
00020
00021 mitk::SmartPointerProperty::ReferenceCountMapType mitk::SmartPointerProperty::m_ReferenceCount;
00022 mitk::SmartPointerProperty::ReferencesUIDMapType mitk::SmartPointerProperty::m_ReferencesUID;
00023 mitk::SmartPointerProperty::ReadInSmartPointersMapType mitk::SmartPointerProperty::m_ReadInInstances;
00024 mitk::SmartPointerProperty::ReadInTargetsMapType mitk::SmartPointerProperty::m_ReadInTargets;
00025 mitk::UIDGenerator mitk::SmartPointerProperty::m_UIDGenerator("POINTER_");
00026
00027 void mitk::SmartPointerProperty::PostProcessXMLReading()
00028 {
00029 for (ReadInSmartPointersMapType::iterator iter = m_ReadInInstances.begin();
00030 iter != m_ReadInInstances.end();
00031 ++iter)
00032 {
00033 if ( m_ReadInTargets.find(iter->second) != m_ReadInTargets.end() )
00034 {
00035 iter->first->SetSmartPointer( m_ReadInTargets[ iter->second ] );
00036 }
00037 }
00038
00039 m_ReadInInstances.clear();
00040 }
00041
00043 unsigned int mitk::SmartPointerProperty::GetReferenceCountFor(itk::Object* object)
00044 {
00045 if ( m_ReferenceCount.find(object) != m_ReferenceCount.end() )
00046 {
00047 return m_ReferenceCount[object];
00048 }
00049 else
00050 {
00051 return 0;
00052 }
00053 }
00054
00055 void mitk::SmartPointerProperty::RegisterPointerTarget(itk::Object* object, const std::string uid)
00056 {
00057 m_ReadInTargets[uid] = object;
00058 }
00059
00060 std::string mitk::SmartPointerProperty::GetReferenceUIDFor(itk::Object* object)
00061 {
00062 if ( m_ReferencesUID.find(object) != m_ReferencesUID.end() )
00063 {
00064 return m_ReferencesUID[object];
00065 }
00066 else
00067 {
00068 return std::string("invalid");
00069 }
00070 }
00071
00072 bool mitk::SmartPointerProperty::operator==(const BaseProperty& property) const
00073 {
00074 const Self *other = dynamic_cast<const Self*>(&property);
00075
00076 if(other==NULL) return false;
00077
00078 return other->m_SmartPointer==m_SmartPointer;
00079 }
00080
00081 mitk::SmartPointerProperty::SmartPointerProperty(itk::Object* pointer)
00082 {
00083 SetSmartPointer( pointer );
00084 }
00085
00086 mitk::SmartPointerProperty::~SmartPointerProperty()
00087 {
00088 }
00089
00090 itk::Object::Pointer mitk::SmartPointerProperty::GetSmartPointer() const
00091 {
00092 return m_SmartPointer;
00093 }
00094
00095 void mitk::SmartPointerProperty::SetSmartPointer(itk::Object* pointer)
00096 {
00097 if(m_SmartPointer.GetPointer() != pointer)
00098 {
00099
00100 if ( m_SmartPointer.GetPointer() && --m_ReferenceCount[m_SmartPointer.GetPointer()] == 0 )
00101 {
00102 m_ReferenceCount.erase( m_SmartPointer.GetPointer() );
00103 m_ReferencesUID.erase( m_SmartPointer.GetPointer() );
00104 }
00105
00106 if ( pointer && ++m_ReferenceCount[pointer] == 1 )
00107 {
00108 m_ReferencesUID[pointer] = m_UIDGenerator.GetUID();
00109 }
00110
00111
00112 m_SmartPointer = pointer;
00113 Modified();
00114 }
00115 }
00116
00117 std::string mitk::SmartPointerProperty::GetValueAsString() const
00118 {
00119 if ( m_SmartPointer.IsNotNull() )
00120 return m_ReferencesUID[ m_SmartPointer.GetPointer() ];
00121 else
00122 return std::string("NULL");
00123 }
00124
00125 bool mitk::SmartPointerProperty::Assignable(const BaseProperty& other) const
00126 {
00127 try
00128 {
00129 dynamic_cast<const Self&>(other);
00130 return true;
00131 }
00132 catch (std::bad_cast)
00133 {
00134 }
00135 return false;
00136 }
00137
00138 mitk::BaseProperty& mitk::SmartPointerProperty::operator=(const BaseProperty& other)
00139 {
00140 try
00141 {
00142 const Self& otherProp( dynamic_cast<const Self&>(other) );
00143
00144 if (this->m_SmartPointer != otherProp.m_SmartPointer)
00145 {
00146 this->m_SmartPointer = otherProp.m_SmartPointer;
00147 this->Modified();
00148 }
00149 }
00150 catch (std::bad_cast)
00151 {
00152
00153 }
00154
00155 return *this;
00156 }
00157