CernVM-FS  2.12.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
shared_ptr.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_UTIL_SHARED_PTR_H_
6 #define CVMFS_UTIL_SHARED_PTR_H_
7 
8 #include <cstdlib>
9 
10 #include "util/atomic.h"
11 
12 #ifdef CVMFS_NAMESPACE_GUARD
13 namespace CVMFS_NAMESPACE_GUARD {
14 #endif // CVMFS_NAMESPACE_GUARD
15 
16 template <typename T>
17 class SharedPtr {
18  public:
19  typedef T element_type;
20 
21  SharedPtr() { // never throws
22  value_ = NULL;
23  count_ = NULL;
24  }
25 
26  template <class Y>
27  explicit SharedPtr(Y* p) {
28  value_ = static_cast<element_type*>(p);
29  count_ = new atomic_int64;
30  atomic_write64(count_, 1);
31  }
32 
33  ~SharedPtr() { // never throws
34  if (count_) {
35  atomic_dec64(count_);
36  if (atomic_read64(count_) == 0) {
37  delete value_;
38  delete count_;
39  }
40  }
41  }
42 
43  SharedPtr(SharedPtr const& r)
44  : value_(r.value_), count_(r.count_) { // never throws
45  if (count_) {
46  atomic_inc64(count_);
47  }
48  }
49 
50  template <class Y>
51  explicit SharedPtr(SharedPtr<Y> const& r)
52  : value_(r.value_), count_(r.count_) { // never throws
53  if (count_) {
54  atomic_inc64(count_);
55  }
56  }
57 
58  SharedPtr& operator=(SharedPtr const& r) { // never throws
59  if (this == &r)
60  return *this;
61 
62  Reset();
63  value_ = r.value_;
64  count_ = r.count_;
65  if (count_) {
66  atomic_inc64(count_);
67  }
68  return *this;
69  }
70 
71  template <class Y>
72  SharedPtr& operator=(SharedPtr<Y> const& r) { // never throws
73  Reset();
74  value_ = r.Get();
75  count_ = r.GetCountPtr();
76  if (count_) {
77  atomic_inc64(count_);
78  }
79  return *this;
80  }
81 
82  void Reset() { // never throws
83  if (count_) {
84  atomic_dec64(count_);
85  if (atomic_read64(count_) == 0) {
86  delete value_;
87  delete count_;
88  }
89  value_ = NULL;
90  count_ = NULL;
91  }
92  }
93 
94  template <class Y>
95  void Reset(Y* p) {
96  Reset();
97  value_ = static_cast<element_type*>(p);
98  count_ = new atomic_int64;
99  atomic_write64(count_, 1);
100  }
101 
102  T& operator*() const { // never throws
103  return *value_;
104  }
105 
106  T* operator->() const { // never throws
107  return value_;
108  }
109 
110  element_type* Get() const { // never throws
111  return value_;
112  }
113 
115  return count_;
116  }
117 
118  bool Unique() const { // never throws
119  return count_ && (atomic_read64(count_) == 1);
120  }
121 
122  int64_t UseCount() const { // never throws
123  return count_ ? atomic_read64(count_) : -1;
124  }
125 
126  private:
127  element_type* value_;
129 };
130 
131 template <class T, class U>
132 bool operator==(SharedPtr<T> const& a,
133  SharedPtr<U> const& b) { // never throws
134  return a.value_ == b.value_;
135 }
136 
137 template <class T, class U>
138 bool operator!=(SharedPtr<T> const& a,
139  SharedPtr<U> const& b) { // never throws
140  return a.value_ != b.value_;
141 }
142 
143 template <class T, class U>
144 bool operator<(SharedPtr<T> const& a, SharedPtr<U> const& b) { // never throws
145  return a.value_ < b.value_;
146 }
147 
148 template <class T>
150  SharedPtr<T> const& p) { // never throws
151  return p.value_;
152 }
153 
154 template <class T, class U>
155 SharedPtr<T> StaticPointerCast(SharedPtr<U> const& r) { // never throws
156  return SharedPtr<T>(static_cast<T*>(r.value_));
157 }
158 
159 template <class T, class U>
160 SharedPtr<T> ConstPointerCast(SharedPtr<U> const& r) { // never throws
161  return SharedPtr<T>(const_cast<T*>(r.value_));
162 }
163 
164 template <class T, class U>
165 SharedPtr<T> DynamicPointerCast(SharedPtr<U> const& r) { // never throws
166  return SharedPtr<T>(dynamic_cast<T*>(r.value_));
167 }
168 
169 template <class T, class U>
171  return SharedPtr<T>(reinterpret_cast<T*>(r.value_));
172 }
173 
174 #ifdef CVMFS_NAMESPACE_GUARD
175 } // namespace CVMFS_NAMESPACE_GUARD
176 #endif
177 
178 #endif // CVMFS_UTIL_SHARED_PTR_H_
T & operator*() const
Definition: shared_ptr.h:102
void Reset()
Definition: shared_ptr.h:82
SharedPtr< T > ConstPointerCast(SharedPtr< U > const &r)
Definition: shared_ptr.h:160
int64_t atomic_int64
Definition: atomic.h:18
void Reset(Y *p)
Definition: shared_ptr.h:95
element_type * value_
Definition: shared_ptr.h:127
SharedPtr< T > DynamicPointerCast(SharedPtr< U > const &r)
Definition: shared_ptr.h:165
SharedPtr(SharedPtr< Y > const &r)
Definition: shared_ptr.h:51
SharedPtr< T >::element_type * GetPointer(SharedPtr< T > const &p)
Definition: shared_ptr.h:149
SharedPtr< T > ReinterpretPointerCast(SharedPtr< U > const &r)
Definition: shared_ptr.h:170
SharedPtr< T > StaticPointerCast(SharedPtr< U > const &r)
Definition: shared_ptr.h:155
~SharedPtr()
Definition: shared_ptr.h:33
atomic_int64 * count_
Definition: shared_ptr.h:128
SharedPtr & operator=(SharedPtr const &r)
Definition: shared_ptr.h:58
bool Unique() const
Definition: shared_ptr.h:118
bool operator!=(const cvmcache_hash &a, const cvmcache_hash &b)
int64_t UseCount() const
Definition: shared_ptr.h:122
atomic_int64 * GetCountPtr() const
Definition: shared_ptr.h:114
SharedPtr(Y *p)
Definition: shared_ptr.h:27
bool operator==(const cvmcache_hash &a, const cvmcache_hash &b)
element_type * Get() const
Definition: shared_ptr.h:110
SharedPtr(SharedPtr const &r)
Definition: shared_ptr.h:43
T * operator->() const
Definition: shared_ptr.h:106
T element_type
Definition: shared_ptr.h:19
SharedPtr & operator=(SharedPtr< Y > const &r)
Definition: shared_ptr.h:72