TurtleBrains  0.3.5
High quality, portable, C++ framework for rapid 2D game development.
tb_hybrid_owned_pointer.hpp
1 
9 #ifndef TurtleBrains_HybridOwnedPointer_hpp
10 #define TurtleBrains_HybridOwnedPointer_hpp
11 
12 #include <turtle_brains/core/tb_configuration.hpp>
13 #include <turtle_brains/core/debug/tb_debug_logger.hpp>
14 
15 #include <memory>
16 
17 namespace TurtleBrains::Core
18 {
19 
20  template<typename Type> class HybridOwnedPointer
21  {
22  public:
23  enum class Ownership { Managed, Referenced };
24 
25  //static HybridOwnedPointer MakeReferenced(Type& value)
26  //{
27  // return HybridOwnedPointer(&value, Ownership::Referenced);
28  //}
29 
30  //template<class... _Types> static HybridOwnedPointer MakeManaged(_Types&&... arguments)
31  //{
32  // return HybridOwnedPointer(new Type(std::forward<_Types>(arguments)...), Ownership::Managed);
33  //}
34 
35  explicit HybridOwnedPointer(void) :
36  mManaged(nullptr),
37  mObject(nullptr)
38  {
39  }
40 
41  HybridOwnedPointer(Type* object, const Ownership ownership) :
42  mManaged((Ownership::Managed == ownership) ? object : nullptr),
43  mObject(object)
44  {
45  tb_error_if(mManaged.get() != nullptr && mManaged.get() != mObject, "tbInternalError: ctor Expected Managed and Object to match.");
46 
47  tb_debug_log_if(kIsDebugging, "HybridOwnedPointer(" << ((nullptr == mManaged) ? "Referenced" : "Managed") << ") ctor for: " <<
48  static_cast<const void*>(this) << " with obj: " << static_cast<const void*>(mObject) << " type: " <<
49  ((nullptr == mObject) ? "nullptr" : typeid(*mObject).name()));
50  }
51 
52  HybridOwnedPointer(std::unique_ptr<Type>&& typePointer) :
53  mManaged(std::move(typePointer)),
54  mObject(mManaged.get())
55  {
56  tb_error_if(mManaged.get() != nullptr && mManaged.get() != mObject, "tbInternalError: ctor Expected Managed and Object to match.");
57 
58  tb_debug_log_if(kIsDebugging, "HybridOwnedPointer(" << ((nullptr == mManaged) ? "Referenced" : "Managed") << ") ctor for: " <<
59  static_cast<const void*>(this) << " with obj: " << static_cast<const void*>(mObject) << " type: " <<
60  ((nullptr == mObject) ? "nullptr" : typeid(*mObject).name()));
61  }
62 
63  HybridOwnedPointer(HybridOwnedPointer&& other) noexcept :
64  mManaged(std::move(other.mManaged)),
65  mObject(std::move(other.mObject))
66  {
67  tb_error_if(mManaged.get() != nullptr && mManaged.get() != mObject, "tbInternalError: mtor Expected Managed and Object to match.");
68 
69  tb_debug_log_if(kIsDebugging, "HybridOwnedPointer(" << ((nullptr == mManaged) ? "Referenced" : "Managed") << ") MoveCtor for: " <<
70  static_cast<const void*>(this) << " with obj: " << static_cast<const void*>(mObject) << " type: " <<
71  ((nullptr == mObject) ? "nullptr" : typeid(*mObject).name()));
72 
73  other.mObject = nullptr;
74  other.mManaged = nullptr;
75  }
76 
77  HybridOwnedPointer& operator=(HybridOwnedPointer&& other) noexcept
78  {
79  mManaged = std::move(other.mManaged);
80  mObject = std::move(other.mObject);
81 
82  tb_error_if(mManaged.get() != nullptr && mManaged.get() != mObject, "tbInternalError: =&& Expected Managed and Object to match.");
83 
84  other.mObject = nullptr;
85  other.mManaged = nullptr;
86 
87  tb_debug_log_if(kIsDebugging, "HybridOwnedPointer(" << ((nullptr == mManaged) ? "Referenced" : "Managed") << ") MoveAssign for: " <<
88  static_cast<const void*>(this) << " with obj: " << static_cast<const void*>(mObject) << " type: " <<
89  ((nullptr == mObject) ? "nullptr" : typeid(*mObject).name()));
90 
91  return *this;
92  }
93 
94  ~HybridOwnedPointer(void)
95  {
96  tb_error_if(mManaged.get() != nullptr && mManaged.get() != mObject, "tbInternalError: dtor Expected Managed and Object to match.");
97 
98  tb_debug_log_if(kIsDebugging, "HybridOwnedPointer(" << ((nullptr == mManaged) ? "Referenced" : "Managed") << ") dtor for: " <<
99  static_cast<const void*>(this) << " with obj: " << static_cast<const void*>(mObject) << " type: " <<
100  ((nullptr == mObject) ? "nullptr" : typeid(*mObject).name()));
101  }
102 
103  const Type* operator->(void) const { return mObject; }
104  Type* operator->(void) { return mObject; }
105 
106  const Type& operator*(void) const { return *mObject; }
107  Type& operator*(void) { return *mObject; }
108 
109  bool operator==(const Type* other) const { return mObject == other; }
110  friend bool operator==(const Type* other, const HybridOwnedPointer& hybrid) { return hybrid.mObject == other; }
111 
112  private:
113  HybridOwnedPointer(const HybridOwnedPointer& other) = delete;
114  HybridOwnedPointer& operator=(const HybridOwnedPointer& other) = delete;
115 
116  std::unique_ptr<Type> mManaged;
117  Type* mObject;
118  static const bool kIsDebugging = false;
119  };
120 
121 }; /* namespace TurtleBrains::Core */
122 
123 namespace tbCore = TurtleBrains::Core;
124 
125 #endif /* TurtleBrains_HybridOwnedPointer_hpp */
Definition: tb_hybrid_owned_pointer.hpp:21
#define tb_debug_log_if(testResult, log_stream)
Definition: tb_debug_logger.hpp:54
#define tb_error_if(errorTest, message,...)
Definition: tb_error.hpp:42
Contains core functionality for each component of the API.
Definition: tb_debug_logger.hpp:125