43 #include "base_data_type.h" 49 template <
class CastingType,
class OwnerType,
class CastedType>
50 CastingType *DynamicCast(OwnerType *owner, CastedType *casted)
52 CastingType *tmp =
dynamic_cast<CastingType *
>(casted);
55 std::cout <<
"\n Error: pointer DynamicCasting " <<
typeid(*casted).name() <<
" leads to nullptr! \n";
56 std::cout <<
"\n This error locates in " <<
typeid(*owner).name() <<
'\n';
62 template <
class CastingType,
class OwnerType,
class CastedType>
63 CastingType &DynamicCast(OwnerType *owner, CastedType &casted)
65 CastingType *tmp =
dynamic_cast<CastingType *
>(&casted);
68 std::cout <<
"\n Error: reference DynamicCasting " <<
typeid(casted).name() <<
" leads to nullptr! \n";
69 std::cout <<
"\n This error locates in " <<
typeid(*owner).name() <<
'\n';
76 using UniquePtr = std::unique_ptr<T>;
78 template <
class T,
typename... ConstructorArgs>
79 UniquePtr<T> makeUnique(ConstructorArgs &&...args)
81 return std::unique_ptr<T>(
new T(std::forward<ConstructorArgs>(args)...));
89 template <
class BaseType>
94 template <
class DerivedType,
typename... ConstructorArgs>
97 ptr_member_.reset(
new DerivedType(std::forward<ConstructorArgs>(args)...));
98 return static_cast<DerivedType *
>(ptr_member_.get());
102 template <
class DerivedType,
typename... ConstructorArgs>
105 ptr_member_.reset(
new DerivedType(std::forward<ConstructorArgs>(args)...));
106 return *
static_cast<DerivedType *
>(ptr_member_.get());
110 BaseType *
movePtr(UniquePtr<BaseType> moved_unique_ptr)
112 ptr_member_ = std::move(moved_unique_ptr);
113 return ptr_member_.get();
117 UniquePtr<BaseType> ptr_member_;
126 template <
class BaseType>
132 template <
class DerivedType,
typename... ConstructorArgs>
136 BaseType *observer = ptr_keepers_.back()
137 .template createPtr<DerivedType>(std::forward<ConstructorArgs>(args)...);
138 return static_cast<DerivedType *
>(observer);
143 if (index < ptr_keepers_.size())
145 return ptr_keepers_[index];
147 std::cout <<
"\n Error in UniquePtrKeepers : UniquePtr index is out of bound! \n";
152 std::vector<UniquePtrKeeper<BaseType>> ptr_keepers_;
156 using SharedPtr = std::shared_ptr<T>;
158 template <
class T,
typename... ConstructorArgs>
159 SharedPtr<T> makeShared(ConstructorArgs &&...args)
161 return std::make_shared<T>(std::forward<ConstructorArgs>(args)...);
169 template <
class BaseType>
174 template <
class DerivedType,
typename... ConstructorArgs>
177 ptr_member_ = makeShared<DerivedType>(std::forward<ConstructorArgs>(args)...);
178 return static_cast<DerivedType *
>(ptr_member_.get());
182 template <
class DerivedType,
typename... ConstructorArgs>
185 return *resetPtr<DerivedType>(std::forward<ConstructorArgs>(args)...);
191 ptr_member_ = shared_ptr;
192 return ptr_member_.get();
198 ptr_member_ = shared_ptr;
199 return *ptr_member_.get();
203 SharedPtr<BaseType> ptr_member_;
206 #endif // OWNERSHIP_H DerivedType * resetPtr(ConstructorArgs &&...args)
Definition: ownership.h:175
DerivedType & resetRef(ConstructorArgs &&...args)
Definition: ownership.h:183
A wrapper to provide an ownership for a new derived object which previous often generated by new a ra...
Definition: ownership.h:90
DerivedType * createPtr(ConstructorArgs &&...args)
Definition: ownership.h:95
BaseType * assignPtr(SharedPtr< BaseType > shared_ptr)
Definition: ownership.h:189
BaseType * movePtr(UniquePtr< BaseType > moved_unique_ptr)
Definition: ownership.h:110
DerivedType & createRef(ConstructorArgs &&...args)
Definition: ownership.h:103
A wrapper to provide an ownership for a vector of base class pointers which point to derived objects...
Definition: ownership.h:127
A wrapper to provide an shared ownership for a new derived object which previous often generated by n...
Definition: ownership.h:170
BaseType & assignRef(SharedPtr< BaseType > shared_ptr)
Definition: ownership.h:196
DerivedType * createPtr(ConstructorArgs &&...args)
Definition: ownership.h:133
Definition: solid_body_supplementary.cpp:9