LameShadowPtr.h
Go to the documentation of this file.
1 #ifndef _utl_LameShadowPtr_h_
2 #define _utl_LameShadowPtr_h_
3 
4 #include <algorithm>
5 #include <utl/ShadowPtrPolicy.h>
6 #include <utl/LameShadowPtr_fwd.h>
7 
8 namespace utl {
9 
17  template<typename T, class DereferenceCheck/* = ThrowOnZeroDereference*/>
18  class LameShadowPtr {
19 
20  public:
22 
23  explicit LameShadowPtr(T* const p) : fPtr(p) { }
24 
25  explicit LameShadowPtr(const LameShadowPtr& sp) { DeepCopy(sp.fPtr); }
26 
27  LameShadowPtr(LameShadowPtr&& sp) : fPtr(sp.fPtr) { sp.fPtr = nullptr; }
28 
30 
31  T* Get() { return fPtr; }
32  const T* Get() const { return fPtr; }
33 
36  {
37  if (this != &sp) {
38  Delete();
39  DeepCopy(sp.fPtr);
40  }
41  return *this;
42  }
43 
46  {
47  Delete();
48  fPtr = sp.fPtr;
49  sp.fPtr = nullptr;
50  return *this;
51  }
52 
53  LameShadowPtr& operator=(T* const p) { Delete(); fPtr = p; return *this; }
54 
55  T& operator*();
56  const T& operator*() const;
57 
58  T* operator->() { DereferenceCheck::Examine(fPtr); return fPtr; }
59  const T* operator->() const { DereferenceCheck::Examine(fPtr); return fPtr; }
60 
61  bool operator==(const LameShadowPtr& sp) const { return fPtr == sp.fPtr; }
62  bool operator!=(const LameShadowPtr& sp) const { return fPtr != sp.fPtr; }
63  bool operator==(const T* const p) const { return fPtr == p; }
64  bool operator!=(const T* const p) const { return fPtr != p; }
65 
66  explicit operator bool() const { return fPtr; }
67 
68  void Swap(LameShadowPtr& sp) { std::swap(fPtr, sp.fPtr); }
69 
70  private:
71  void Delete();
72 
73  protected:
74  void DeepCopy(const T* const p);
75 
76  T* fPtr = nullptr;
77 
78  };
79 
80 
81  template<typename T, class DereferenceCheck/* = ThrowOnZeroDereference*/>
82  class InitializedLameShadowPtr : public LameShadowPtr<T, DereferenceCheck> {
83 
84  public:
85  InitializedLameShadowPtr() : LameShadowPtr<T, DereferenceCheck>(new T) { }
86 
87  };
88 
89 
90  template<typename T, class D>
91  inline bool DeepEqual(const LameShadowPtr<T, D>& s1, const LameShadowPtr<T, D>& s2)
92  { return (!s1 && !s2) || (s1 && s2 && *s1 == *s2); }
93 
94 
96  template<typename T, class D>
98  { a.Swap(b); }
99 
100 }
101 
102 
103 #endif
void Swap(LameShadowPtr &sp)
Definition: LameShadowPtr.h:68
void swap(utl::Trace< T > &t1, utl::Trace< T > &t2)
Definition: Trace.h:363
void DeepCopy(const T *const p)
void swap(utl::TabulatedFunction &t1, utl::TabulatedFunction &t2)
bool operator!=(const T *const p) const
Definition: LameShadowPtr.h:64
LameShadowPtr(T *const p)
Definition: LameShadowPtr.h:23
LameShadowPtr & operator=(const LameShadowPtr &sp)
Definition: LameShadowPtr.h:35
bool operator==(const LameShadowPtr &sp) const
Definition: LameShadowPtr.h:61
const T * Get() const
Definition: LameShadowPtr.h:32
LameShadowPtr(const LameShadowPtr &sp)
Definition: LameShadowPtr.h:25
LameShadowPtr(LameShadowPtr &&sp)
Definition: LameShadowPtr.h:27
bool operator!=(const LameShadowPtr &sp) const
Definition: LameShadowPtr.h:62
bool operator==(const T *const p) const
Definition: LameShadowPtr.h:63
bool DeepEqual(const LameShadowPtr< T, D > &s1, const LameShadowPtr< T, D > &s2)
Definition: LameShadowPtr.h:91
LameShadowPtr & operator=(LameShadowPtr &&sp)
Definition: LameShadowPtr.h:45
const T * operator->() const
Definition: LameShadowPtr.h:59
LameShadowPtr & operator=(T *const p)
Definition: LameShadowPtr.h:53

, generated on Tue Sep 26 2023.