CernVM-FS  2.13.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 
114  atomic_int64 *GetCountPtr() const { return count_; }
115 
116  bool Unique() const { // never throws
117  return count_ && (atomic_read64(count_) == 1);
118  }
119 
120  int64_t UseCount() const { // never throws
121  return count_ ? atomic_read64(count_) : -1;
122  }
123 
124  private:
125  element_type *value_;
127 };
128 
129 template<class T, class U>
130 bool operator==(SharedPtr<T> const &a,
131  SharedPtr<U> const &b) { // never throws
132  return a.value_ == b.value_;
133 }
134 
135 template<class T, class U>
136 bool operator!=(SharedPtr<T> const &a,
137  SharedPtr<U> const &b) { // never throws
138  return a.value_ != b.value_;
139 }
140 
141 template<class T, class U>
142 bool operator<(SharedPtr<T> const &a, SharedPtr<U> const &b) { // never throws
143  return a.value_ < b.value_;
144 }
145 
146 template<class T>
148  SharedPtr<T> const &p) { // never throws
149  return p.value_;
150 }
151 
152 template<class T, class U>
153 SharedPtr<T> StaticPointerCast(SharedPtr<U> const &r) { // never throws
154  return SharedPtr<T>(static_cast<T *>(r.value_));
155 }
156 
157 template<class T, class U>
158 SharedPtr<T> ConstPointerCast(SharedPtr<U> const &r) { // never throws
159  return SharedPtr<T>(const_cast<T *>(r.value_));
160 }
161 
162 template<class T, class U>
163 SharedPtr<T> DynamicPointerCast(SharedPtr<U> const &r) { // never throws
164  return SharedPtr<T>(dynamic_cast<T *>(r.value_));
165 }
166 
167 template<class T, class U>
169  return SharedPtr<T>(reinterpret_cast<T *>(r.value_));
170 }
171 
172 #ifdef CVMFS_NAMESPACE_GUARD
173 } // namespace CVMFS_NAMESPACE_GUARD
174 #endif
175 
176 #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:158
int64_t atomic_int64
Definition: atomic.h:18
void Reset(Y *p)
Definition: shared_ptr.h:95
element_type * value_
Definition: shared_ptr.h:125
SharedPtr< T > DynamicPointerCast(SharedPtr< U > const &r)
Definition: shared_ptr.h:163
SharedPtr(SharedPtr< Y > const &r)
Definition: shared_ptr.h:51
SharedPtr< T >::element_type * GetPointer(SharedPtr< T > const &p)
Definition: shared_ptr.h:147
SharedPtr< T > ReinterpretPointerCast(SharedPtr< U > const &r)
Definition: shared_ptr.h:168
SharedPtr< T > StaticPointerCast(SharedPtr< U > const &r)
Definition: shared_ptr.h:153
~SharedPtr()
Definition: shared_ptr.h:33
atomic_int64 * count_
Definition: shared_ptr.h:126
SharedPtr & operator=(SharedPtr const &r)
Definition: shared_ptr.h:58
bool Unique() const
Definition: shared_ptr.h:116
bool operator!=(const cvmcache_hash &a, const cvmcache_hash &b)
int64_t UseCount() const
Definition: shared_ptr.h:120
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