CbcPointer.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #ifndef SQUID_SRC_BASE_CBCPOINTER_H
10 #define SQUID_SRC_BASE_CBCPOINTER_H
11 
12 #include "base/TextException.h"
13 #include "cbdata.h"
14 #include "debug/Stream.h"
15 
24 template<class Cbc>
25 class CbcPointer
26 {
27 public:
28  CbcPointer(); // a nil pointer
29  CbcPointer(Cbc *aCbc);
30  CbcPointer(const CbcPointer &p);
32  ~CbcPointer();
33 
34  Cbc *raw() const;
35  Cbc *get() const;
36  Cbc &operator *() const;
37  Cbc *operator ->() const;
38 
39  // no bool operator because set() != valid()
40  bool set() const { return cbc != nullptr; }
41  Cbc *valid() const { return get(); }
42  bool operator !() const { return !valid(); }
43  bool operator ==(const CbcPointer<Cbc> &o) const { return lock == o.lock; }
44 
45  CbcPointer &operator =(const CbcPointer &p);
47 
49  template <typename Other>
50  CbcPointer(const CbcPointer<Other> &o): cbc(o.raw()), lock(nullptr) {
51  if (o.valid())
52  lock = cbdataReference(o->toCbdata());
53  }
54 
56  template <typename Other>
58  if (this != &o) { // assignment to self
59  clear();
60  cbc = o.raw(); // so that set() is accurate
61  if (o.valid())
62  lock = cbdataReference(o->toCbdata());
63  }
64  return *this;
65  }
66 
67  void clear();
68 
69  std::ostream &print(std::ostream &os) const;
70 
71 private:
72  Cbc *cbc; // a possibly invalid pointer to a cbdata class
73  void *lock; // a valid pointer to cbc's cbdata or nil
74 };
75 
76 template <class Cbc>
77 inline
78 std::ostream &operator <<(std::ostream &os, const CbcPointer<Cbc> &p)
79 {
80  return p.print(os);
81 }
82 
83 // inlined methods
84 
85 template<class Cbc>
86 CbcPointer<Cbc>::CbcPointer(): cbc(nullptr), lock(nullptr)
87 {
88 }
89 
90 template<class Cbc>
91 CbcPointer<Cbc>::CbcPointer(Cbc *aCbc): cbc(aCbc), lock(nullptr)
92 {
93  if (cbc)
94  lock = cbdataReference(cbc->toCbdata());
95 }
96 
97 template<class Cbc>
98 CbcPointer<Cbc>::CbcPointer(const CbcPointer &d): cbc(d.cbc), lock(nullptr)
99 {
100  if (d.lock && cbdataReferenceValid(d.lock))
102 }
103 
104 template<class Cbc>
105 CbcPointer<Cbc>::CbcPointer(CbcPointer &&d): cbc(d.cbc), lock(d.lock)
106 {
107  d.cbc = nullptr;
108  d.lock = nullptr;
109 }
110 
111 template<class Cbc>
113 {
114  clear();
115 }
116 
117 template<class Cbc>
119 {
120  if (this != &d) { // assignment to self
121  clear();
122  cbc = d.cbc;
123  if (d.lock && cbdataReferenceValid(d.lock))
124  lock = cbdataReference(d.lock);
125  }
126  return *this;
127 }
128 
129 template<class Cbc>
131 {
132  if (this != &d) { // assignment to self
133  clear();
134  cbc = d.cbc;
135  d.cbc = nullptr;
136  lock = d.lock;
137  d.lock = nullptr;
138  }
139  return *this;
140 }
141 
142 template<class Cbc>
143 void
145 {
146  cbdataReferenceDone(lock); // lock may be nil before and will be nil after
147  cbc = nullptr;
148 }
149 
150 template<class Cbc>
151 Cbc *
153 {
154  return cbc;
155 }
156 
157 template<class Cbc>
158 Cbc *
160 {
161  return (lock && cbdataReferenceValid(lock)) ? cbc : nullptr;
162 }
163 
164 template<class Cbc>
165 Cbc &
167 {
168  Cbc *c = get();
169  assert(c);
170  return *c;
171 }
172 
173 template<class Cbc>
174 Cbc *
176 {
177  Cbc *c = get();
178  assert(c);
179  return c;
180 }
181 
182 template <class Cbc>
183 std::ostream &CbcPointer<Cbc>::print(std::ostream &os) const
184 {
185  return os << cbc << '/' << lock;
186 }
187 
188 #endif /* SQUID_SRC_BASE_CBCPOINTER_H */
189 
bool operator==(const CbcPointer< Cbc > &o) const
Definition: CbcPointer.h:43
Cbc * get() const
a temporary valid raw Cbc pointer or NULL
Definition: CbcPointer.h:159
Cbc * cbc
Definition: CbcPointer.h:72
int cbdataReferenceValid(const void *p)
Definition: cbdata.cc:270
#define cbdataReference(var)
Definition: cbdata.h:348
Cbc & operator*() const
a valid Cbc reference or exception
Definition: CbcPointer.h:166
CbcPointer & operator=(const CbcPointer &p)
Definition: CbcPointer.h:118
Cbc * raw() const
a temporary raw Cbc pointer; may be invalid
Definition: CbcPointer.h:152
#define assert(EX)
Definition: assert.h:17
void clear()
make pointer not set; does not invalidate cbdata
Definition: CbcPointer.h:144
#define cbdataReferenceDone(var)
Definition: cbdata.h:357
Cbc * operator->() const
a valid Cbc pointer or exception
Definition: CbcPointer.h:175
std::ostream & operator<<(std::ostream &os, const CbcPointer< Cbc > &p)
Definition: CbcPointer.h:78
void * lock
Definition: CbcPointer.h:73
std::ostream & print(std::ostream &os) const
Definition: CbcPointer.h:183
CbcPointer(const CbcPointer< Other > &o)
support converting a child cbc pointer into a parent cbc pointer
Definition: CbcPointer.h:50

 

Introduction

Documentation

Support

Miscellaneous