DATAKIT SDK  V2026.4
util_ptr_dtk.hpp
Go to the documentation of this file.
1 #ifndef _UTIL_PTR_DTK_HPP_
2 #define _UTIL_PTR_DTK_HPP_
3 
4 #include <iostream>
5 #include "def/define.h"
6 #include "dtk/config.hpp"
7 #include <iosfwd>
8 
9 /// @cond NO_DOXYGEN_DOC
10 namespace dtk
11 {
12  namespace detail
13  {
14  struct bool_conversion {int for_bool; int for_arg(); };
15  typedef int bool_conversion::* explicit_bool_arg;
16 
17 #if !defined(DTK_NO_CXX11_NULLPTR) && !defined(DTK_NO_CXX11_DECLTYPE)
18  typedef decltype(nullptr) nullptr_type;
19 #elif !defined(DTK_NO_CXX11_NULLPTR)
20  typedef std::nullptr_t nullptr_type;
21 #else
22  typedef int (bool_conversion::*nullptr_type)();
23 #endif
24  }
25 }
26 //! \endcond
27 /** \defgroup ptr SmartPointer Classes
28  * Encapsulate other entities for better memory management
29  */
30 
31 class Dtk_Object;
32 class Dtk_Entity;
33 
34 class Dtk_Info;
35 class Dtk_StoredInfo;
36 class Dtk_matrix;
37 class Dtk_transfo;
38 
39 //! \ingroup ptr
40 //! \class Dtk_SmartPtr
41 //! This the Smart Pointer template<br>
42 template <typename T>
43 class Dtk_SmartPtr
44 {
45 public:
46  typedef T element_type;
47  typedef T* pointer;
48 
49 protected:
50  T * ptr_;
51 public:
53  {
55  return ptr_;
56  }
57 
59  {
60  return *ptr_;
61  }
62 
63 #if !defined(DTK_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
64  explicit operator bool() const DTK_NOEXCEPT
65 #else
66  operator dtk::detail::explicit_bool_arg() const DTK_NOEXCEPT
67 #endif
68  {
69  return ptr_ ? &dtk::detail::bool_conversion::for_bool : dtk::detail::explicit_bool_arg(0);
70  }
71 
74  Dtk_SmartPtr(T* p);
76 
77  //Move constructor/assignment
78 #if !defined(DTK_NO_CXX11_RVALUE_REFERENCES)
80  {
81  p.ptr_ = nullptr;
82  }
83 
85  {
86  if(this != &p)
87  {
88  release();
89  ptr_ = p.ptr_;
90  p.ptr_ = nullptr;
91  }
92 
93  return *this;
94  }
95 #endif
96 
98  { return ptr_; }
99 
100  template <typename T2>
102  {
103  if( p.IsNULL() )
104  {
105  return NULL;
106  }
107  else
108  {
109  return T::DtkDynamicCast(p.operator ->());
110  }
111  }
112 
114 
115  void Clone(Dtk_SmartPtr<T>& out) const;
116  //! \brief Resets the Dtk_SmartPtr content.
117  void Clear();
118  Dtk_bool IsNULL() const {return ((!ptr_)?(true):(false));}
119  Dtk_bool IsNotNULL() const {return ((ptr_)?(true):(false));}
120 
121  friend class Dtk_Object;
122  friend std::ostream& operator<<(std::ostream& o,const Dtk_SmartPtr& d)
123  {
124  if (d.ptr_)
125  {
126  o <<"<Dtk_SmartPtr><Adr>" << d.ptr_ << "</Adr><Val>";
127  o << *(d.ptr_);
128  o << "</Val></Dtk_SmartPtr>"<<std::endl;
129  return o;
130  }
131  else
132  return o<<"<Dtk_SmartPtr><Adr>" << d.ptr_ << "</Adr></Dtk_SmartPtr>"<<std::endl;
133  }
134 private:
135  void release() DTK_NOEXCEPT;
136 
137 };
138 
139 ///////////////////////////////////////////////////////////////////////////
140 
141 
142 template <typename T>
143 void Dtk_SmartPtr<T>::release() DTK_NOEXCEPT
144 {
145  if(ptr_)
146  {
147  if (--ptr_->count_ == 0)
148  {
149  delete ptr_;
150  ptr_ = NULL;
151  }
152  }
153 }
154 
155 template <typename T>
157 {
158  release();
159 }
160 template <typename T>
162 {
163  ptr_ = NULL;
164 }
165 
166 template <typename T>
168 {
169  if(ptr_)
170  ++ptr_->count_;
171 } // p ne doit pas valoir NULL
172 
173 template <typename T>
175 {
176  if(ptr_)
177  ++ptr_->count_;
178 }
179 
180 template <typename T>
182 { // NE CHANGEZ PAS L'ORDRE DE CES INSTRUCTIONS!
183  // (Cet ordre gere correctement le cas de l'auto-affectation)
184  if(p.ptr_)
185  ++p.ptr_->count_;
186  release();
187  ptr_ = p.ptr_;
188  return *this;
189 }
190 
191 template <typename T>
193 {
194  if(ptr_)
195  {
196  auto * ptr = ptr_->Clone();
197  if( ptr )
198  res = T::DtkDynamicCast( ptr );
199  //res = new T(*ptr_);
200  }
201 }
202 
203 //! \brief Resets the Dtk_SmartPtr content.
204 template <typename T>
206 {
207  release();
208  ptr_ = NULL;
209 }
210 
211 template <class T1, class T2>
213 { return x.get() == y.get(); }
214 
215 template <class T1, class T2>
217 { return !(x == y); }
218 
219 template <class T1, class T2>
221 { return x.get() < y.get(); }
222 
223 template <class T1, class T2>
225 { return !(y < x); }
226 
227 template <class T1, class T2>
229 { return y < x; }
230 
231 template <class T1, class T2>
233 { return !(x < y); }
234 
235 
236 template <class T>
237 inline bool operator==(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
238 { return !x; }
239 
240 template <class T>
241 inline bool operator==(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
242 { return !x; }
243 
244 template <class T>
245 inline bool operator!=(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
246 { return !!x; }
247 
248 template <class T>
249 inline bool operator!=(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
250 { return !!x; }
251 
252 template <class T>
253 inline bool operator<(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
254 { return x.get() < typename Dtk_SmartPtr<T>::pointer(); }
255 
256 template <class T>
257 inline bool operator<(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
258 { return typename Dtk_SmartPtr<T>::pointer() < x.get(); }
259 
260 template <class T>
261 inline bool operator>(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
262 { return x.get() > typename Dtk_SmartPtr<T>::pointer(); }
263 
264 template <class T>
265 inline bool operator>(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
266 { return typename Dtk_SmartPtr<T>::pointer() > x.get(); }
267 
268 template <class T>
269 inline bool operator<=(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
270 { return !(x > dtk::detail::nullptr_type()); }
271 
272 template <class T>
273 inline bool operator<=(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
274 { return !(dtk::detail::nullptr_type() > x); }
275 
276 template <class T>
277 inline bool operator>=(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
278 { return !(x < dtk::detail::nullptr_type()); }
279 
280 template <class T>
281 inline bool operator>=(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
282 { return !(dtk::detail::nullptr_type() < x); }
283 
284 //! \ingroup ptr
285 //! \typedef Dtk_ObjectPtr
286 //! \brief Handles a Dtk_Object object
287 //! \sa Dtk_reference
289 
290 //! \ingroup ptr
291 //! \typedef Dtk_EntityPtr
292 //! \brief Handles a Dtk_Entity object
293 //! \sa Dtk_Entity
295 
296 //! \ingroup ptr
297 //! \typedef Dtk_matrixPtr
298 //! \brief Handles a Dtk_matrix object
299 //! \sa Dtk_dimension
301 
302 //! \ingroup ptr
303 //! \typedef Dtk_transfoPtr
304 //! \brief Handles a Dtk_transfo object
305 //! \sa Dtk_dimension
307 
308 //! \ingroup ptr
309 //! \typedef Dtk_InfoPtr
310 //! \brief Handles a Dtk_Info object
311 //! \sa Dtk_Info
313 
314 //! \ingroup ptr
315 //! \typedef Dtk_StoredInfoPtr
316 //! \brief Handles a Dtk_StoredInfo object
317 //! \sa Dtk_Info
319 
320 
321 //! \ingroup ptr
322 //! \typedef Dtk_RenderInfosPtr
323 //! \brief Handles a Dtk_RenderInfos object
324 //! \sa Dtk_InfoDtk_RenderInfos
325 class Dtk_RenderInfos;
327 
328 //! \ingroup ptr
329 //! \typedef Dtk_BuildingMaterialPtr
330 //! \brief Handles a Dtk_BuildingMaterial object
331 //! \sa Dtk_InfoDtk_BuildingMaterial
332 class Dtk_BuildingMaterial;
334 
335 
336 //! \ingroup ptr
337 //! \typedef Dtk_PhysicalMaterialInfosPtr
338 //! \brief Handles a Dtk_PhysicalMaterialInfos object
339 //! \sa Dtk_PhysicalMaterialInfos
342 
343 
344 class Dtk_picture;
346 
347 //! \ingroup ptr
348 //! \typedef Dtk_LineTypeDefinitionPtr
349 //! \brief Handles a Dtk_LineTypeDefinition object
350 //! \sa Dtk_LineTypeDefinition
353 
354 
355 //! \ingroup ptr
356 //! \typedef Dtk_OLEObjectPtr
357 //! \brief Handles a Dtk_OLEObject object
358 //! \sa Dtk_OLEObject
359 class Dtk_OLEObject;
361 
362 //! \ingroup ptr
363 //! \typedef Dtk_StreamPtr
364 //! \brief Handles a Dtk_Stream object
365 //! \sa Dtk_Stream
366 class Dtk_Stream;
368 
369 #endif
370 
371 
Dtk_InfoPtr
Dtk_SmartPtr< Dtk_Info > Dtk_InfoPtr
Handles a Dtk_Info object.
Definition: util_ptr_dtk.hpp:312
operator<=
bool operator<=(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:224
Dtk_SmartPtr::Dtk_SmartPtr
Dtk_SmartPtr(T *p)
Definition: util_ptr_dtk.hpp:167
Dtk_transfo
This is the Transformation dedicated class.
Definition: dtk_transfo.hpp:19
Dtk_SmartPtr::Clear
void Clear()
Resets the Dtk_SmartPtr content.
Definition: util_ptr_dtk.hpp:205
Dtk_SmartPtr::~Dtk_SmartPtr
~Dtk_SmartPtr()
Definition: util_ptr_dtk.hpp:156
DTK_ASSERT
#define DTK_ASSERT(expr)
Definition: define.h:743
operator!=
bool operator!=(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:216
Dtk_Info
This is the generic Info class.
Definition: util_ent_dtk.hpp:107
config.hpp
Dtk_EntityPtr
Dtk_SmartPtr< Dtk_Entity > Dtk_EntityPtr
Handles a Dtk_Entity object.
Definition: util_ptr_dtk.hpp:294
Dtk_SmartPtr::IsNotNULL
Dtk_bool IsNotNULL() const
Definition: util_ptr_dtk.hpp:119
Dtk_matrixPtr
Dtk_SmartPtr< Dtk_matrix > Dtk_matrixPtr
Handles a Dtk_matrix object.
Definition: util_ptr_dtk.hpp:300
operator<
bool operator<(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:220
operator>
bool operator>(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:228
Dtk_picturePtr
Dtk_SmartPtr< Dtk_picture > Dtk_picturePtr
Definition: util_ptr_dtk.hpp:344
Dtk_SmartPtr::pointer
T * pointer
Definition: util_ptr_dtk.hpp:47
Dtk_bool
char Dtk_bool
Definition: define.h:724
Dtk_LineTypeDefinitionPtr
Dtk_SmartPtr< Dtk_LineTypeDefinition > Dtk_LineTypeDefinitionPtr
Definition: util_ptr_dtk.hpp:351
Dtk_SmartPtr::operator->
pointer operator->() const DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:52
Dtk_StoredInfo
This is the Dtk_StoredInfo Class. The Dtk_StoredInfo object is used to store any information stored.
Definition: dtk_storedinfo.hpp:15
Dtk_RenderInfosPtr
Dtk_SmartPtr< Dtk_RenderInfos > Dtk_RenderInfosPtr
Definition: util_ptr_dtk.hpp:325
Dtk_RenderInfos
This is the Dtk_RenderInfos Class. The Dtk_RenderInfosPtr object is used to store any informations ab...
Definition: dtk_render.hpp:279
Dtk_transfoPtr
Dtk_SmartPtr< Dtk_transfo > Dtk_transfoPtr
Handles a Dtk_transfo object.
Definition: util_ptr_dtk.hpp:306
Dtk_Stream
This is the Dtk_Stream Class. The Dtk_Stream object is used to store any informations about stream fi...
Definition: dtk_stream.hpp:17
Dtk_SmartPtr::element_type
T element_type
Definition: util_ptr_dtk.hpp:46
Dtk_SmartPtr::operator*
element_type & operator*() const DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:58
Dtk_PhysicalMaterialInfosPtr
Dtk_SmartPtr< Dtk_PhysicalMaterialInfos > Dtk_PhysicalMaterialInfosPtr
Handles a Dtk_PhysicalMaterialInfos object.
Definition: util_ptr_dtk.hpp:340
Dtk_StoredInfoPtr
Dtk_SmartPtr< Dtk_StoredInfo > Dtk_StoredInfoPtr
Handles a Dtk_StoredInfo object.
Definition: util_ptr_dtk.hpp:318
Dtk_OLEObject
This is the Dtk_OLEObject Class. The Dtk_OLEObject object is used to store any informations about Obj...
Definition: dtk_oleobject.hpp:22
Dtk_SmartPtr::Clone
void Clone(Dtk_SmartPtr< T > &out) const
Definition: util_ptr_dtk.hpp:192
operator>=
bool operator>=(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:232
Dtk_picture
This class defines a picture.
Definition: dtk_picture.hpp:39
Dtk_OLEObjectPtr
Dtk_SmartPtr< Dtk_OLEObject > Dtk_OLEObjectPtr
Handles a Dtk_OLEObject object.
Definition: util_ptr_dtk.hpp:359
Dtk_StreamPtr
Dtk_SmartPtr< Dtk_Stream > Dtk_StreamPtr
Handles a Dtk_Stream object.
Definition: util_ptr_dtk.hpp:366
Dtk_LineTypeDefinition
This is the Dtk_LineTypeDefinition Class. The Dtk_LineTypeDefinition object is used to store any info...
Definition: dtk_line_type_definition.hpp:23
Dtk_SmartPtr::DtkDynamicCast
static Dtk_SmartPtr< T > DtkDynamicCast(const Dtk_SmartPtr< T2 > &p)
Definition: util_ptr_dtk.hpp:101
Dtk_SmartPtr::operator=
Dtk_SmartPtr & operator=(Dtk_SmartPtr &&p) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:84
Dtk_SmartPtr::IsNULL
Dtk_bool IsNULL() const
Definition: util_ptr_dtk.hpp:118
Dtk_matrix
Definition: dtk_matrix.hpp:8
Dtk_ObjectPtr
Dtk_SmartPtr< Dtk_Object > Dtk_ObjectPtr
Handles a Dtk_Object object.
Definition: util_ptr_dtk.hpp:288
Dtk_SmartPtr
Definition: util_ptr_dtk.hpp:37
Dtk_SmartPtr::get
pointer get() const DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:97
Dtk_PhysicalMaterialInfos
Definition: dtk_render.hpp:384
dtk
Definition: span.hpp:10
define.h
Dtk_SmartPtr::operator<<
friend std::ostream & operator<<(std::ostream &o, const Dtk_SmartPtr &d)
Definition: util_ptr_dtk.hpp:122
Dtk_Object
Definition: dtk_object.hpp:8
Dtk_SmartPtr::ptr_
T * ptr_
Definition: util_ptr_dtk.hpp:50
Dtk_SmartPtr::Dtk_SmartPtr
Dtk_SmartPtr(const Dtk_SmartPtr< T > &p)
Definition: util_ptr_dtk.hpp:174
operator==
bool operator==(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:212
Dtk_KinFixPart
Dtk_KinFixPart represents the fixed part to simulate the mechanism.
Definition: util_kinematics_dtk.hpp:1503
Dtk_SmartPtr::Dtk_SmartPtr
Dtk_SmartPtr(Dtk_SmartPtr &&p) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:79
DTK_NOEXCEPT
#define DTK_NOEXCEPT
Definition: config.hpp:20
Dtk_BuildingMaterialPtr
Dtk_SmartPtr< Dtk_BuildingMaterial > Dtk_BuildingMaterialPtr
Handles a Dtk_BuildingMaterial object.
Definition: util_ptr_dtk.hpp:332
Dtk_SmartPtr::Dtk_SmartPtr
Dtk_SmartPtr()
Definition: util_ptr_dtk.hpp:161
Dtk_Entity
Definition: util_ent_dtk.hpp:367