PrivMX Endpoint v2.7.0
Loading...
Searching...
No Matches
ExtendedPointer.hpp
1#ifndef _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_
2#define _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_
3
4#include <memory>
5#include <string>
6#include <optional>
7#include <iostream>
8
9#include "privmx/endpoint/core/CoreException.hpp"
10
11namespace privmx {
12namespace endpoint {
13namespace core {
14
15template <typename T>
16class ExtendedPointer {
17public:
18
19 ExtendedPointer();
20 ExtendedPointer(const ExtendedPointer& obj);
21 ExtendedPointer& operator=(const ExtendedPointer& obj);
22 ExtendedPointer(ExtendedPointer&& obj);
23 ~ExtendedPointer();
24
25 ExtendedPointer(std::shared_ptr<T> ptr);
26 std::shared_ptr<T> getImpl() const;
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) throw NotConnectedException();
62 return ptr;
63}
64
65template <typename T>
66void ExtendedPointer<T>::attachToPtrIfPossible() {
67 if(!_ptr.expired()) {
68 auto ptr = _ptr.lock();
69 if(ptr) {
70 ptr->attach();
71 }
72 }
73}
74
75template <typename T>
76void ExtendedPointer<T>::detachFromPtrIfPossible() {
77 if(!_ptr.expired()) {
78 auto ptr = _ptr.lock();
79 if(ptr) {
80 ptr->detach();
81 }
82 }
83}
84
85} // namespace core
86} // namespace endpoint
87} // namespace privmx
88
89#endif // _PRIVMXLIB_ENDPOINT_CORE_EXTENDEDPOINTER_HPP_