DATAKIT API  V2025.1
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 
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 }
27 
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 
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;
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 
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  res = T::DtkDynamicCast( ptr_->Clone() );
197  //res = new T(*ptr_);
198  }
199 }
200 
202 template <typename T>
204 {
205  release();
206  ptr_ = NULL;
207 }
208 
209 template <class T1, class T2>
211 { return x.get() == y.get(); }
212 
213 template <class T1, class T2>
215 { return !(x == y); }
216 
217 template <class T1, class T2>
219 { return x.get() < y.get(); }
220 
221 template <class T1, class T2>
223 { return !(y < x); }
224 
225 template <class T1, class T2>
227 { return y < x; }
228 
229 template <class T1, class T2>
231 { return !(x < y); }
232 
233 
234 template <class T>
235 inline bool operator==(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
236 { return !x; }
237 
238 template <class T>
239 inline bool operator==(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
240 { return !x; }
241 
242 template <class T>
243 inline bool operator!=(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
244 { return !!x; }
245 
246 template <class T>
247 inline bool operator!=(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
248 { return !!x; }
249 
250 template <class T>
251 inline bool operator<(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
252 { return x.get() < typename Dtk_SmartPtr<T>::pointer(); }
253 
254 template <class T>
255 inline bool operator<(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
256 { return typename Dtk_SmartPtr<T>::pointer() < x.get(); }
257 
258 template <class T>
259 inline bool operator>(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
260 { return x.get() > typename Dtk_SmartPtr<T>::pointer(); }
261 
262 template <class T>
263 inline bool operator>(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
264 { return typename Dtk_SmartPtr<T>::pointer() > x.get(); }
265 
266 template <class T>
267 inline bool operator<=(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
268 { return !(x > dtk::detail::nullptr_type()); }
269 
270 template <class T>
271 inline bool operator<=(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
272 { return !(dtk::detail::nullptr_type() > x); }
273 
274 template <class T>
275 inline bool operator>=(const Dtk_SmartPtr<T> &x, dtk::detail::nullptr_type) DTK_NOEXCEPT
276 { return !(x < dtk::detail::nullptr_type()); }
277 
278 template <class T>
279 inline bool operator>=(dtk::detail::nullptr_type, const Dtk_SmartPtr<T> &x) DTK_NOEXCEPT
280 { return !(dtk::detail::nullptr_type() < x); }
281 
287 
293 
299 
305 
311 
317 
318 
323 class Dtk_RenderInfos;
325 
330 class Dtk_BuildingMaterial;
332 
333 
340 
341 
342 class Dtk_picture;
344 
351 
352 
357 class Dtk_OLEObject;
359 
364 class Dtk_Stream;
366 
367 #endif
368 
369 
Dtk_InfoPtr
Dtk_SmartPtr< Dtk_Info > Dtk_InfoPtr
Handles a Dtk_Info object.
Definition: util_ptr_dtk.hpp:310
operator<=
bool operator<=(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:222
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:203
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:214
Dtk_Info
This is the generic Info class.
Definition: util_ent_dtk.hpp:115
config.hpp
Dtk_EntityPtr
Dtk_SmartPtr< Dtk_Entity > Dtk_EntityPtr
Handles a Dtk_Entity object.
Definition: util_ptr_dtk.hpp:292
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:298
operator<
bool operator<(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:218
operator>
bool operator>(const Dtk_SmartPtr< T1 > &x, const Dtk_SmartPtr< T2 > &y) DTK_NOEXCEPT
Definition: util_ptr_dtk.hpp:226
Dtk_picturePtr
Dtk_SmartPtr< Dtk_picture > Dtk_picturePtr
Definition: util_ptr_dtk.hpp:342
Dtk_SmartPtr::pointer
T * pointer
Definition: util_ptr_dtk.hpp:47
Dtk_bool
char Dtk_bool
Definition: define.h:725
Dtk_LineTypeDefinitionPtr
Dtk_SmartPtr< Dtk_LineTypeDefinition > Dtk_LineTypeDefinitionPtr
Definition: util_ptr_dtk.hpp:349
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:323
Dtk_RenderInfos
This is the Dtk_RenderInfos Class. The Dtk_RenderInfosPtr object is used to store any informations ab...
Definition: dtk_render.hpp:277
Dtk_transfoPtr
Dtk_SmartPtr< Dtk_transfo > Dtk_transfoPtr
Handles a Dtk_transfo object.
Definition: util_ptr_dtk.hpp:304
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:16
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:338
Dtk_StoredInfoPtr
Dtk_SmartPtr< Dtk_StoredInfo > Dtk_StoredInfoPtr
Handles a Dtk_StoredInfo object.
Definition: util_ptr_dtk.hpp:316
Dtk_OLEObject
This is the Dtk_OLEObject Class. The Dtk_OLEObject object is used to store any informations about Obj...
Definition: dtk_oleobject.hpp:21
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:230
Dtk_picture
This class defines a picture.
Definition: dtk_picture.hpp:45
Dtk_OLEObjectPtr
Dtk_SmartPtr< Dtk_OLEObject > Dtk_OLEObjectPtr
Handles a Dtk_OLEObject object.
Definition: util_ptr_dtk.hpp:357
Dtk_StreamPtr
Dtk_SmartPtr< Dtk_Stream > Dtk_StreamPtr
Handles a Dtk_Stream object.
Definition: util_ptr_dtk.hpp:364
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:286
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:381
dtk
Definition: util_stl_dtk.hpp:982
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:210
Dtk_KinFixPart
Dtk_KinFixPart represents the fixed part to simulate the mechanism.
Definition: util_kinematics_dtk.hpp:1499
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:26
Dtk_BuildingMaterialPtr
Dtk_SmartPtr< Dtk_BuildingMaterial > Dtk_BuildingMaterialPtr
Handles a Dtk_BuildingMaterial object.
Definition: util_ptr_dtk.hpp:330
Dtk_SmartPtr::Dtk_SmartPtr
Dtk_SmartPtr()
Definition: util_ptr_dtk.hpp:161
Dtk_Entity
Definition: util_ent_dtk.hpp:329