PrivMX Endpoint v2.8.0
Loading...
Searching...
No Matches
ExtendedPointer.hpp
1#ifndef _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_
2#define _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_
3
4#include <iostream>
5#include <memory>
6#include <optional>
7#include <string>
8
9#include "privmx/endpoint/core/CoreException.hpp"
10
11namespace privmx {
12namespace endpoint {
13namespace core {
14
15template<typename T>
16class ExtendedPointer {
17public:
18 ExtendedPointer();
19 ExtendedPointer(const ExtendedPointer& obj);
20 ExtendedPointer& operator=(const ExtendedPointer& obj);
21 ExtendedPointer(ExtendedPointer&& obj);
22 ~ExtendedPointer();
23
24 ExtendedPointer(std::shared_ptr<T> ptr);
25 std::shared_ptr<T> getImpl() const;
26
27protected:
28 void attachToPtrIfPossible();
29 void detachFromPtrIfPossible();
30 std::weak_ptr<T> _ptr;
31};
32
33template<typename T>
34ExtendedPointer<T>::ExtendedPointer(){};
35
36template<typename T>
37ExtendedPointer<T>::ExtendedPointer(const ExtendedPointer& obj) : _ptr(obj._ptr) {
38 attachToPtrIfPossible();
39}
40template<typename T>
41ExtendedPointer<T>& ExtendedPointer<T>::operator=(const ExtendedPointer<T>& obj) {
42 this->_ptr = obj._ptr;
43 this->attachToPtrIfPossible();
44 return *this;
45}
46template<typename T>
47ExtendedPointer<T>::ExtendedPointer(ExtendedPointer&& obj) : _ptr(obj._ptr) {
48 attachToPtrIfPossible();
49}
50template<typename T>
51ExtendedPointer<T>::~ExtendedPointer() {
52 detachFromPtrIfPossible();
53}
54
55template<typename T>
56ExtendedPointer<T>::ExtendedPointer(std::shared_ptr<T> ptr) : _ptr(ptr) {}
57
58template<typename T>
59std::shared_ptr<T> ExtendedPointer<T>::getImpl() const {
60 auto ptr = _ptr.lock();
61 if (!ptr)
62 throw NotConnectedException();
63 return ptr;
64}
65
66template<typename T>
67void ExtendedPointer<T>::attachToPtrIfPossible() {
68 if (!_ptr.expired()) {
69 auto ptr = _ptr.lock();
70 if (ptr) {
71 ptr->attach();
72 }
73 }
74}
75
76template<typename T>
77void ExtendedPointer<T>::detachFromPtrIfPossible() {
78 if (!_ptr.expired()) {
79 auto ptr = _ptr.lock();
80 if (ptr) {
81 ptr->detach();
82 }
83 }
84}
85
86} // namespace core
87} // namespace endpoint
88} // namespace privmx
89
90#endif // _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_