Oxygine  1
2g game engine
intrusive_ptr.h
1 #pragma once
2 #ifndef INTRUSIVE_PTR_HEADER
3 #define INTRUSIVE_PTR_HEADER
4 
5 #include "oxygine-include.h"
6 //#include "ref_counter.h"
7 #include "ox_debug.h"
8 
9 namespace oxygine
10 {
11  template <class T>
13  {
14  T* _ptr;
15  public:
16  typedef T element_type;
17 
18  intrusive_ptr(): _ptr(0) {}
19  intrusive_ptr(const intrusive_ptr& s): _ptr(s._ptr)
20  {
21  if (s._ptr)
22  intrusive_ptr_add_ref(s._ptr);
23  }
24 
25  template<class U>
27  : _ptr(rhs.get())
28  {
29  if (_ptr != 0) intrusive_ptr_add_ref(_ptr);
30  }
31 
32  T* get() const
33  {
34  return _ptr;
35  }
36 
37  T& operator*() const
38  {
39  OX_ASSERT(_ptr && _ptr->_ref_counter > 0);
40  return *_ptr;
41  }
42 
43  T* operator->() const
44  {
45  OX_ASSERT(_ptr && _ptr->_ref_counter > 0);
46  return _ptr;
47  }
48 
49  intrusive_ptr& operator = (const intrusive_ptr& s)
50  {
51  intrusive_ptr(s).swap(*this);
52  return *this;
53  }
54 
55  intrusive_ptr& operator = (T* ptr)
56  {
57  intrusive_ptr(ptr).swap(*this);
58  return *this;
59  }
60 
61  intrusive_ptr(T* p): _ptr(p)
62  {
63  if (p)
64  intrusive_ptr_add_ref(p);
65  }
66 
67  bool operator!() const
68  {
69  return _ptr == 0;
70  }
71 
72  void swap(intrusive_ptr& s)
73  {
74  T* p = s._ptr;
75  s._ptr = _ptr;
76  _ptr = p;
77  }
78  operator bool ()const
79  {
80  return _ptr != 0;
81  }
82 
83  ~intrusive_ptr()
84  {
85  if (_ptr)
86  intrusive_ptr_release(_ptr);
87  }
88  };
89 
90  template<class T, class U> inline bool operator==(intrusive_ptr<T> const& a, intrusive_ptr<U> const& b)
91  {
92  return a.get() == b.get();
93  }
94 
95  template<class T, class U> inline bool operator!=(intrusive_ptr<T> const& a, intrusive_ptr<U> const& b)
96  {
97  return a.get() != b.get();
98  }
99 
100  template<class T> inline bool operator==(intrusive_ptr<T> const& a, T* b)
101  {
102  return a.get() == b;
103  }
104 
105  template<class T> inline bool operator!=(intrusive_ptr<T> const& a, T* b)
106  {
107  return a.get() != b;
108  }
109 
110  template<class T> inline bool operator==(T* a, intrusive_ptr<T> const& b)
111  {
112  return a == b.get();
113  }
114 
115  template<class T> inline bool operator!=(T* a, intrusive_ptr<T> const& b)
116  {
117  return a != b.get();
118  }
119 
120  template<class T> T* get_pointer(intrusive_ptr<T> const& p)
121  {
122  return p.get();
123  }
124 
125  template<class T, class U> intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const& p)
126  {
127  return static_cast<T*>(p.get());
128  }
129 
130  template<class T, class U> intrusive_ptr<T> const_pointer_cast(intrusive_ptr<U> const& p)
131  {
132  return const_cast<T*>(p.get());
133  }
134 
135  template<class T, class U> intrusive_ptr<T> dynamic_pointer_cast(intrusive_ptr<U> const& p)
136  {
137  return dynamic_cast<T*>(p.get());
138  }
139 
140 
141  template <class T>
142  class RefHolder : public T
143  {
144  public:
145  RefHolder() {this->_ref_counter = 1000000;}
146  void addRef()
147  {}
148 
149  void releaseRef()
150  {}
151  };
152 }
153 
154 #endif
Definition: intrusive_ptr.h:12
–oxgl-end–!
Definition: Actor.h:14
Definition: intrusive_ptr.h:142