13 #ifndef mitkWeakPointer_h
14 #define mitkWeakPointer_h
16 #include <itkCommand.h>
51 : m_RawPointer(
nullptr)
61 : m_RawPointer(rawPointer)
63 this->AddDeleteEventObserver();
72 : m_RawPointer(other.m_RawPointer)
74 this->AddDeleteEventObserver();
85 : m_RawPointer(other.m_RawPointer)
87 other.RemoveDeleteEventObserver();
88 other.m_RawPointer =
nullptr;
89 this->AddDeleteEventObserver();
97 this->RemoveDeleteEventObserver();
119 this->RemoveDeleteEventObserver();
120 m_RawPointer = other.m_RawPointer;
121 this->AddDeleteEventObserver();
140 this->RemoveDeleteEventObserver();
141 m_RawPointer = other.m_RawPointer;
142 other.m_RawPointer =
nullptr;
143 this->AddDeleteEventObserver();
155 this->RemoveDeleteEventObserver();
156 m_RawPointer =
nullptr;
169 if (m_RawPointer != other)
171 this->RemoveDeleteEventObserver();
172 m_RawPointer = other;
173 this->AddDeleteEventObserver();
184 explicit operator bool() const noexcept
186 return nullptr != m_RawPointer;
219 m_DeleteEventCallback = callback;
223 void AddDeleteEventObserver()
225 if (
nullptr != m_RawPointer)
227 auto command = itk::SimpleMemberCommand<WeakPointer>::New();
228 command->SetCallbackFunction(
this, &WeakPointer::OnDeleteEvent);
230 using TWithoutConst =
typename std::remove_const_t<T>;
233 auto nonConstPointer =
const_cast<TWithoutConst*
>(m_RawPointer);
234 m_ObserverTag = nonConstPointer->AddObserver(itk::DeleteEvent(), command);
238 void RemoveDeleteEventObserver()
240 if (
nullptr != m_RawPointer)
242 using TWithoutConst =
typename std::remove_const_t<T>;
245 auto nonConstPointer =
const_cast<TWithoutConst*
>(m_RawPointer);
246 nonConstPointer->RemoveObserver(m_ObserverTag);
250 void OnDeleteEvent() noexcept
255 m_RawPointer =
nullptr;
257 if (m_DeleteEventCallback)
258 m_DeleteEventCallback();
268 return left.m_RawPointer == right.m_RawPointer;
273 return std::compare_three_way()(left.m_RawPointer, right.m_RawPointer);
278 return left.m_RawPointer == right;
283 return std::compare_three_way()(left.m_RawPointer, right);
291 unsigned long m_ObserverTag;
A weak pointer that observes an itk::Object without preventing its deletion.
WeakPointer() noexcept
Default constructor. Creates an expired weak pointer (null).
WeakPointer(const WeakPointer &other)
Copy constructor. Observes the same object as other.
~WeakPointer() noexcept
Destructor. Removes the delete-event observer from the observed object.
friend bool operator==(const WeakPointer &left, const WeakPointer &right) noexcept
void SetDeleteEventCallback(const DeleteEventCallbackType &callback)
Set a callback to be invoked when the observed object is deleted.
itk::SmartPointer< T > Lock() const
Obtain a smart pointer to the observed object.
WeakPointer & operator=(const WeakPointer &other)
Copy assignment operator.
friend std::strong_ordering operator<=>(const WeakPointer &left, const WeakPointer &right) noexcept
WeakPointer(T *rawPointer)
Construct a weak pointer observing the given raw pointer.
WeakPointer(WeakPointer &&other)
Move constructor. Takes over the observed object from other.
std::function< void()> DeleteEventCallbackType
Callback type invoked when the observed object is deleted.
bool IsExpired() const noexcept
Check whether the observed object has been deleted.
Find image slices visible on a given plane.