29struct Default_ref_counter
31 void h_drop_ref(T *p)
noexcept
33 if (p->remove_ref() == 0)
37 void h_take_ref(T *p)
noexcept
49template<
typename T,
template<
typename X >
class CNT = Default_ref_counter>
79 template<
typename X >
class CNT = Default_ref_counter
81class Ref_ptr :
public Ref_ptr_base,
private CNT<T>
84 typedef decltype(
nullptr) Null_type;
85 typedef Weak_ptr<T, CNT> Wp;
91 Ref_ptr(Ref_ptr_base::Default_value v) : _p((T*)v) {}
98 Ref_ptr(Wp
const &o) noexcept : _p(o.ptr())
102 Ref_ptr(
decltype(
nullptr) n) noexcept : _p(n) {}
124 Ref_ptr(T *o,
bool d) noexcept : _p(o) { (void)d; }
158 template<
typename OT>
159 Ref_ptr(Ref_ptr<OT, CNT>
const &o)
noexcept
165 Ref_ptr(Ref_ptr<T>
const &o)
noexcept
171 template<
typename OT >
172 void operator = (Ref_ptr<OT>
const &o)
noexcept
179 void operator = (Ref_ptr<T>
const &o)
noexcept
189 void operator = (Null_type)
noexcept
195 template<
typename OT>
196 Ref_ptr(Ref_ptr<OT, CNT> &&o)
noexcept
197 { _p = o.release(); }
199 Ref_ptr(Ref_ptr<T> &&o)
noexcept
200 { _p = o.release(); }
202 template<
typename OT >
203 void operator = (Ref_ptr<OT> &&o)
noexcept
209 void operator = (Ref_ptr<T> &&o)
noexcept
218 explicit operator bool () const noexcept {
return _p; }
220 T *operator -> () const noexcept
223 bool operator == (
Ref_ptr const &o)
const noexcept
224 {
return _p == o._p; }
226 bool operator != (
Ref_ptr const &o)
const noexcept
227 {
return _p != o._p; }
229 bool operator < (
Ref_ptr const &o)
const noexcept
230 {
return _p < o._p; }
232 bool operator <= (
Ref_ptr const &o)
const noexcept
233 {
return _p <= o._p; }
235 bool operator > (
Ref_ptr const &o)
const noexcept
236 {
return _p > o._p; }
238 bool operator >= (
Ref_ptr const &o)
const noexcept
239 {
return _p >= o._p; }
241 bool operator == (T
const *o)
const noexcept
244 bool operator < (T
const *o)
const noexcept
247 bool operator <= (T
const *o)
const noexcept
250 bool operator > (T
const *o)
const noexcept
253 bool operator >= (T
const *o)
const noexcept
257 void __drop_ref() noexcept
260 static_cast<CNT<T>*
>(
this)->h_drop_ref(_p);
263 void __take_ref() noexcept
266 static_cast<CNT<T>*
>(
this)->h_take_ref(_p);
273template<
typename T,
template<
typename X >
class CNT>
278 typedef Ref_ptr<T, CNT> Rp;
281 Weak_ptr() =
default;
282 Weak_ptr(
decltype(
nullptr)) : _p(nullptr) {}
284 explicit Weak_ptr(
int x)
noexcept
287 {
if (x != 0) __builtin_trap(); }
289 Weak_ptr(Rp
const &o) noexcept : _p(o.ptr()) {}
290 explicit Weak_ptr(T *o) noexcept : _p(o) {}
292 template<
typename OT>
293 Weak_ptr(Weak_ptr<OT, CNT>
const &o) noexcept : _p(o.ptr()) {}
295 Weak_ptr(Weak_ptr<T, CNT>
const &o) noexcept : _p(o._p) {}
297 Weak_ptr<T, CNT> &operator = (
const Weak_ptr<T, CNT> &o) =
default;
299 T *get() const noexcept {
return _p; }
300 T *ptr() const noexcept {
return _p; }
302 T *operator -> () const noexcept {
return _p; }
303 operator Null_type
const * ()
const noexcept
304 {
return reinterpret_cast<Null_type const*
>(_p); }
310template<
typename OT,
typename T>
inline
311Ref_ptr<OT> ref_ptr_static_cast(Ref_ptr<T>
const &o)
312{
return ref_ptr(
static_cast<OT*
>(o.ptr())); }
314template<
typename T >
315inline Ref_ptr<T> ref_ptr(T *t)
316{
return Ref_ptr<T>(t); }
318template<
typename T >
319inline Weak_ptr<T> weak_ptr(T *t)
320{
return Weak_ptr<T>(t); }
326 mutable int _ref_cnt;
329 Ref_obj() : _ref_cnt(0) {}
330 void add_ref() const noexcept { ++_ref_cnt; }
331 int remove_ref() const noexcept {
return --_ref_cnt; }
334template<
typename T,
typename... Args >
336make_ref_obj(Args &&... args)
339template<
typename T,
typename U>
341dynamic_pointer_cast(Ref_ptr<U>
const &p)
noexcept
344 return Ref_ptr<T>(
dynamic_cast<T *
>(p.get()));
347template<
typename T,
typename U>
349static_pointer_cast(Ref_ptr<U>
const &p)
noexcept
352 return Ref_ptr<T>(
static_cast<T *
>(p.get()));
A reference-counting pointer with automatic cleanup.
Ref_ptr(Wp const &o) noexcept
Create a shared pointer from a weak pointer.
Ref_ptr() noexcept
Default constructor creates a pointer with no managed object.
Ref_ptr(decltype(nullptr) n) noexcept
allow creation from nullptr
T * get() const noexcept
Return a raw pointer to the object this shared pointer points to.
T * release() noexcept
Release the shared pointer without removing the reference.
Ref_ptr(X *o) noexcept
Create a shared pointer from a raw pointer.
Ref_ptr(T *o, bool d) noexcept
Create a shared pointer from a raw pointer without creating a new reference.
T * ptr() const noexcept
Return a raw pointer to the object this shared pointer points to.
L4 compiler related defines.
#define L4_DEPRECATED(s)
Mark symbol deprecated.