Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkSmartPointerProperty.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
14 
15 mitk::SmartPointerProperty::ReferenceCountMapType mitk::SmartPointerProperty::m_ReferenceCount;
16 mitk::SmartPointerProperty::ReferencesUIDMapType mitk::SmartPointerProperty::m_ReferencesUID;
17 mitk::SmartPointerProperty::ReadInSmartPointersMapType mitk::SmartPointerProperty::m_ReadInInstances;
18 mitk::SmartPointerProperty::ReadInTargetsMapType mitk::SmartPointerProperty::m_ReadInTargets;
19 mitk::UIDGenerator mitk::SmartPointerProperty::m_UIDGenerator("POINTER_");
20 
22 {
23  for (auto iter = m_ReadInInstances.begin(); iter != m_ReadInInstances.end(); ++iter)
24  {
25  if (m_ReadInTargets.find(iter->second) != m_ReadInTargets.end())
26  {
27  iter->first->SetSmartPointer(m_ReadInTargets[iter->second]);
28  }
29  }
30 
31  m_ReadInInstances.clear();
32 }
33 
35 unsigned int mitk::SmartPointerProperty::GetReferenceCountFor(itk::Object *object)
36 {
37  if (m_ReferenceCount.find(object) != m_ReferenceCount.end())
38  {
39  return m_ReferenceCount[object];
40  }
41  else
42  {
43  return 0;
44  }
45 }
46 
47 void mitk::SmartPointerProperty::RegisterPointerTarget(itk::Object *object, const std::string uid)
48 {
49  m_ReadInTargets[uid] = object;
50 }
51 
52 std::string mitk::SmartPointerProperty::GetReferenceUIDFor(itk::Object *object)
53 {
54  if (m_ReferencesUID.find(object) != m_ReferencesUID.end())
55  {
56  return m_ReferencesUID[object];
57  }
58  else
59  {
60  return std::string("invalid");
61  }
62 }
63 
64 bool mitk::SmartPointerProperty::IsEqual(const BaseProperty &property) const
65 {
66  return this->m_SmartPointer == static_cast<const Self &>(property).m_SmartPointer;
67 }
68 
69 bool mitk::SmartPointerProperty::Assign(const BaseProperty &property)
70 {
71  this->m_SmartPointer = static_cast<const Self &>(property).m_SmartPointer;
72  return true;
73 }
74 
76 {
77  SetSmartPointer(pointer);
78 }
79 
82 {
83 }
84 
85 itk::Object::Pointer mitk::SmartPointerProperty::GetSmartPointer() const
86 {
87  return m_SmartPointer;
88 }
89 
90 itk::Object::Pointer mitk::SmartPointerProperty::GetValue() const
91 {
92  return this->GetSmartPointer();
93 }
94 
96 {
97  if (m_SmartPointer.GetPointer() != pointer)
98  {
99  // keep track of referenced objects
100  if (m_SmartPointer.GetPointer() &&
101  --m_ReferenceCount[m_SmartPointer.GetPointer()] == 0) // if there is no reference left, delete entry
102  {
103  m_ReferenceCount.erase(m_SmartPointer.GetPointer());
104  m_ReferencesUID.erase(m_SmartPointer.GetPointer());
105  }
106 
107  if (pointer && ++m_ReferenceCount[pointer] == 1) // first reference --> generate UID
108  {
109  m_ReferencesUID[pointer] = m_UIDGenerator.GetUID();
110  }
111 
112  // change pointer
113  m_SmartPointer = pointer;
114  Modified();
115  }
116 }
117 
119 {
120  this->SetSmartPointer(value.GetPointer());
121 }
122 
124 {
125  if (m_SmartPointer.IsNotNull())
126  return m_ReferencesUID[m_SmartPointer.GetPointer()];
127  else
128  return std::string("nullptr");
129 }
130 
131 itk::LightObject::Pointer mitk::SmartPointerProperty::InternalClone() const
132 {
133  itk::LightObject::Pointer result(new Self(*this));
134  result->UnRegister();
135  return result;
136 }
Generated unique IDs.
itk::Object::Pointer GetSmartPointer() const
Property containing a smart-pointer.
std::string GetValueAsString() const override
mainly for XML output
SmartPointerProperty(itk::Object *=nullptr)
Abstract base class for properties.
static std::string GetReferenceUIDFor(itk::Object *)
static void RegisterPointerTarget(itk::Object *, const std::string uid)
static unsigned int GetReferenceCountFor(itk::Object *)
Return the number of SmartPointerProperties that reference the object given as parameter.