Scanframe Modular Application 0.1.0
Loading...
Searching...
No Matches
TEnvelope.h
Go to the documentation of this file.
1#pragma once
2
3namespace sf
4{
5
25template<typename T>
27{
28 public:
33 TEnvelope(T* letter);
34
38 TEnvelope(const TEnvelope& src);
39
43 TEnvelope(const TEnvelope&& src) noexcept;
44
49
51
52 TEnvelope& operator=(T* object);
53
54 operator bool();
55
57
59
61
62 T* get();
63
64 const T* get() const;
65
66 explicit operator T*();
67
68 explicit operator const T*() const;
69
70 int referencedCount() const;
71
72 private:
73 struct Letter
74 {
75 explicit Letter(T* object);
76
77 ~Letter();
78
79 void addRef();
80
81 void release();
82
83 T* _object;
84 int _refCount;
85 };
86
87 Letter* _letter;
88};
89
90template<typename T>
92 : _letter(new Letter(letter))
93{}
94
95template<typename T>
97 : _letter(src._letter)
98{
99 _letter->addRef();
100}
101
102template<typename T>
104 : _letter(src._letter)
105{}
106
107template<typename T>
109{
110 _letter->release();
111}
112
113template<typename T>
115{
116 if (this != &src)
117 {
118 _letter->release();
119 _letter = src._letter;
120 _letter->addRef();
121 }
122 return *this;
123}
124
125template<typename T>
127{
128 _letter->release();
129 _letter = new Letter(object);
130 return *this;
131}
132
133template<typename T>
135{
136 return _letter->_object != nullptr;
137}
138
139template<typename T>
141{
142 return _letter->_object;
143}
144
145template<typename T>
147{
148 return *_letter->_object;
149}
150
151template<typename T>
153{
154 return _letter->_object;
155}
156
157template<typename T>
159{
160 return _letter->_object;
161}
162
163template<typename T>
164const T* TEnvelope<T>::get() const
165{
166 return _letter->_object;
167}
168
169template<typename T>
171{
172 return _letter->_object;
173}
174
175template<typename T>
177{
178 return _letter->_object;
179}
180
181template<typename T>
183{
184 return _letter ? _letter->_refCount : 0;
185}
186
187template<typename T>
189 : _object(object)
190 , _refCount(1)
191{}
192
193template<typename T>
194TEnvelope<T>::Letter::~Letter()
195{
196 delete _object;
197}
198
199template<typename T>
200void TEnvelope<T>::Letter::addRef()
201{
202 _refCount++;
203}
204
205template<typename T>
206void TEnvelope<T>::Letter::release()
207{
208 if (--_refCount == 0)
209 {
210 delete this;
211 }
212}
213
214}// namespace sf
Envelope-letter type of smart pointers.
Definition TEnvelope.h:27
T * operator()()
Definition TEnvelope.h:152
T * operator->()
Definition TEnvelope.h:140
TEnvelope(const TEnvelope &&src) noexcept
Move constructor.
Definition TEnvelope.h:103
TEnvelope & operator=(T *object)
Definition TEnvelope.h:126
TEnvelope(const TEnvelope &src)
Copy constructor.
Definition TEnvelope.h:96
~TEnvelope()
Destructor.
Definition TEnvelope.h:108
int referencedCount() const
Definition TEnvelope.h:182
T * get()
Definition TEnvelope.h:158
TEnvelope(T *letter)
Constructor for the envelope's letter object.
Definition TEnvelope.h:91
T & operator*()
Definition TEnvelope.h:146
const T * get() const
Definition TEnvelope.h:164
TEnvelope & operator=(const TEnvelope &src)
Definition TEnvelope.h:114
Definition Application.h:10