9 #ifndef TurtleBrains_HybridOwnedPointer_hpp
10 #define TurtleBrains_HybridOwnedPointer_hpp
12 #include <turtle_brains/core/tb_configuration.hpp>
13 #include <turtle_brains/core/debug/tb_debug_logger.hpp>
23 enum class Ownership { Managed, Referenced };
42 mManaged((Ownership::Managed == ownership) ?
object :
nullptr),
45 tb_error_if(mManaged.get() !=
nullptr && mManaged.get() != mObject,
"tbInternalError: ctor Expected Managed and Object to match.");
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()));
53 mManaged(std::move(typePointer)),
54 mObject(mManaged.get())
56 tb_error_if(mManaged.get() !=
nullptr && mManaged.get() != mObject,
"tbInternalError: ctor Expected Managed and Object to match.");
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()));
64 mManaged(std::move(other.mManaged)),
65 mObject(std::move(other.mObject))
67 tb_error_if(mManaged.get() !=
nullptr && mManaged.get() != mObject,
"tbInternalError: mtor Expected Managed and Object to match.");
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()));
73 other.mObject =
nullptr;
74 other.mManaged =
nullptr;
79 mManaged = std::move(other.mManaged);
80 mObject = std::move(other.mObject);
82 tb_error_if(mManaged.get() !=
nullptr && mManaged.get() != mObject,
"tbInternalError: =&& Expected Managed and Object to match.");
84 other.mObject =
nullptr;
85 other.mManaged =
nullptr;
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()));
96 tb_error_if(mManaged.get() !=
nullptr && mManaged.get() != mObject,
"tbInternalError: dtor Expected Managed and Object to match.");
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()));
103 const Type* operator->(
void)
const {
return mObject; }
104 Type* operator->(
void) {
return mObject; }
106 const Type& operator*(
void)
const {
return *mObject; }
107 Type& operator*(
void) {
return *mObject; }
109 bool operator==(
const Type* other)
const {
return mObject == other; }
110 friend bool operator==(
const Type* other,
const HybridOwnedPointer& hybrid) {
return hybrid.mObject == other; }
116 std::unique_ptr<Type> mManaged;
118 static const bool kIsDebugging =
false;
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