1#ifndef _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_
2#define _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_
9#include "privmx/endpoint/core/CoreException.hpp"
16class ExtendedPointer {
20 ExtendedPointer(
const ExtendedPointer& obj);
21 ExtendedPointer& operator=(
const ExtendedPointer& obj);
22 ExtendedPointer(ExtendedPointer&& obj);
25 ExtendedPointer(std::shared_ptr<T> ptr);
26 std::shared_ptr<T> getImpl()
const;
28 void attachToPtrIfPossible();
29 void detachFromPtrIfPossible();
30 std::weak_ptr<T> _ptr;
34ExtendedPointer<T>::ExtendedPointer() {};
37ExtendedPointer<T>::ExtendedPointer(
const ExtendedPointer& obj) : _ptr(obj._ptr) {
38 attachToPtrIfPossible();
41ExtendedPointer<T>& ExtendedPointer<T>::operator=(
const ExtendedPointer<T>& obj) {
42 this->_ptr = obj._ptr;
43 this->attachToPtrIfPossible();
47ExtendedPointer<T>::ExtendedPointer(ExtendedPointer&& obj) : _ptr(obj._ptr) {
48 attachToPtrIfPossible();
51ExtendedPointer<T>::~ExtendedPointer() {
52 detachFromPtrIfPossible();
56ExtendedPointer<T>::ExtendedPointer(std::shared_ptr<T> ptr) : _ptr(ptr) {}
59std::shared_ptr<T> ExtendedPointer<T>::getImpl()
const {
60 auto ptr = _ptr.lock();
61 if(!ptr)
throw NotConnectedException();
66void ExtendedPointer<T>::attachToPtrIfPossible() {
68 auto ptr = _ptr.lock();
76void ExtendedPointer<T>::detachFromPtrIfPossible() {
78 auto ptr = _ptr.lock();