ETL  0.04.19
_ref_count.h
Go to the documentation of this file.
1 
25 /* === S T A R T =========================================================== */
26 
27 #ifndef __ETL__REF_COUNT_H
28 #define __ETL__REF_COUNT_H
29 
30 /* === H E A D E R S ======================================================= */
31 
32 #include "_curve_func.h"
33 #include <cassert>
34 
35 /* === M A C R O S ========================================================= */
36 
37 /* === T Y P E D E F S ===================================================== */
38 
39 /* === C L A S S E S & S T R U C T S ======================================= */
40 
42 
44 
45 // ========================================================================
52 {
53  friend class weak_reference_counter;
54 private:
55  int* counter_;
56 public:
57 
58  reference_counter(const bool &x=true):counter_(x?new int(1):0) { }
59 
61  { if(counter_) (*counter_)++; }
62 
64 
66 
68  {
69  detach();
70  counter_=rhs.counter_;
71  if(counter_)
72  {
73  assert(*counter_>0);
74  (*counter_)++;
75  }
76  return *this;
77  }
78 
79  void detach()
80  {
81  if(counter_)
82  {
83  assert(*counter_>0);
84  if(!--(*counter_))
85  delete counter_;
86  counter_=0;
87  }
88  }
89 
90  void reset()
91  {
92  detach();
93  counter_=new int(1);
94  }
95 
96  int count()const { return counter_?*counter_:0; }
97 
98  bool unique()const { return counter_?*counter_==1:0; }
99 
100  operator int()const { return count(); }
101 }; // END of class reference_counter
102 
103 // ========================================================================
110 {
111  friend class reference_counter;
112 private:
113  int* counter_;
114 public:
116 
118 
120 
122 
124  {
125  counter_=rhs.counter_;
126  assert(*counter_>0);
127  return *this;
128  }
129 
131  {
132  counter_=rhs.counter_;
133  assert(*counter_>0);
134  return *this;
135  }
136 
137  void detach() { counter_=0; }
138 
139  int count()const { return counter_?*counter_:0; }
140 
141  bool unique()const { return counter_?*counter_==1:0; }
142 
143  operator int()const { return count(); }
144 }; // END of class weak_reference_counter
145 
147  counter_(x.counter_)
148 {
149  if(counter_) (*counter_)++;
150 }
151 
153 
154 /* === E X T E R N S ======================================================= */
155 
156 /* === E N D =============================================================== */
157 
158 #endif