11#ifndef INCGUARD_MGL_UNIQUE_PTR_H_1743858098
12#define INCGUARD_MGL_UNIQUE_PTR_H_1743858098
91 template <
class U = T,
class... Args>
95 if constexpr (std::is_class_v<T> && !std::is_same_v<T, U>)
97 static_assert(std::is_base_of_v<T, U>,
"Cannot be converted to the specified type.");
101 _ptr = Allocate<U>(std::forward<Args>(args)...);
114 template <
class U = T,
class Initializer,
class... Args>
118 if constexpr (std::is_class_v<T> && !std::is_same_v<T, U>)
120 static_assert(std::is_base_of_v<T, U>,
"Cannot be converted to the specified type.");
125 auto obj = Allocate<U>(std::forward<Args>(args)...);
130 if (!InvokeInitializer(initializer, *obj))
132 std::destroy_at(obj);
133 MGL::Memory::Deallocate(obj);
150 std::destroy_at(_ptr);
151 MGL::Memory::Deallocate(_ptr);
162 [[nodiscard]]
constexpr T *
Get() const noexcept
185 [[nodiscard]]
constexpr std::add_lvalue_reference_t<T>
operator*() const noexcept
197 [[nodiscard]]
constexpr bool IsNull() const noexcept
199 return _ptr ==
nullptr;
211 return _ptr ==
nullptr;
221 [[nodiscard]]
explicit constexpr operator bool() const noexcept
223 return _ptr !=
nullptr;
234 template <
class U = T,
class... Args>
238 if constexpr (std::is_class_v<T> && !std::is_same_v<T, U>)
240 static_assert(std::is_base_of_v<T, U>,
"Cannot be converted to the specified type.");
243 return UniquePtr(Allocate<U>(std::forward<Args>(args)...));
254 template <
class U = T,
class Initializer,
class... Args>
258 if constexpr (std::is_class_v<T> && !std::is_same_v<T, U>)
260 static_assert(std::is_base_of_v<T, U>,
"Cannot be converted to the specified type.");
264 auto obj = Allocate<U>(std::forward<Args>(args)...);
267 if (!InvokeInitializer(initializer, *obj))
269 std::destroy_at(obj);
270 MGL::Memory::Deallocate(obj);
287 auto deleter = [](T *ptr)
constexpr
291 std::destroy_at(ptr);
292 MGL::Memory::Deallocate(ptr);
300 auto sharedPtr = std::shared_ptr<T>(_ptr, deleter, allocator);
325 template <
class U,
class... Args>
326 [[nodiscard]]
static U *Allocate(Args &&...args)
noexcept
329 auto *ptr = MGL::Memory::Allocate(
sizeof(U));
336 if constexpr (std::is_nothrow_constructible_v<U, Args...>)
338 return new (ptr) U(std::forward<Args>(args)...);
345 return new (ptr) U(std::forward<Args>(args)...);
365 template <
class U,
class Initializer>
366 static bool InvokeInitializer(Initializer initializer, U &obj)
noexcept
369 if constexpr (std::is_invocable_r_v<bool,
decltype(initializer), U &>)
371 return initializer(obj);
374 else if constexpr (std::is_invocable_r_v<void,
decltype(initializer), U &>)
382 static_assert(std::false_type::value,
"Initializer must be U& type argument and bool or void value returns.");
396 static_assert(
false,
"MGL::UniquePtr cannot specification array type.");
400template <
class T,
size_t n>
403 static_assert(
false,
"MGL::UniquePtr cannot specification sized array type.");
STL用アロケータ
Definition mgl_stl_memory.h:24
ユニークポインタ
Definition mgl_unique_ptr.h:30
UniquePtr(UniquePtr &&rhs) noexcept
ムーブコンストラクタ
Definition mgl_unique_ptr.h:52
~UniquePtr() noexcept
デストラクタ
Definition mgl_unique_ptr.h:78
static UniquePtr InitMake(Initializer initializer, Args &&...args) noexcept
新たなクラスオブジェクトの生成
Definition mgl_unique_ptr.h:255
UniquePtr & InitNew(Initializer initializer, Args &&...args) noexcept
初期化付きのクラスオブジェクトの生成
Definition mgl_unique_ptr.h:115
constexpr bool IsNull() const noexcept
保持しているポインタがNULLであるかをチェック
Definition mgl_unique_ptr.h:197
void Delete() noexcept
オブジェクトの削除
Definition mgl_unique_ptr.h:146
UniquePtr & New(Args &&...args) noexcept
オブジェクトを生成
Definition mgl_unique_ptr.h:92
constexpr T * operator->() const noexcept
演算子によるポインタへのアクセス
Definition mgl_unique_ptr.h:173
constexpr std::add_lvalue_reference_t< T > operator*() const noexcept
演算子によるポインタの間接参照
Definition mgl_unique_ptr.h:185
constexpr bool operator!() const noexcept
保持しているポインタが無効であるかを取得
Definition mgl_unique_ptr.h:209
static UniquePtr Make(Args &&...args) noexcept
新たなクラスオブジェクトの生成
Definition mgl_unique_ptr.h:235
constexpr UniquePtr() noexcept
コンストラクタ
Definition mgl_unique_ptr.h:37
constexpr T * Get() const noexcept
ポインタを取得
Definition mgl_unique_ptr.h:162
UniquePtr & operator=(UniquePtr &&rhs) noexcept
演算子によるムーブ
Definition mgl_unique_ptr.h:65
std::shared_ptr< T > MoveSharedPtr()
シェアードポインタへのムーブ
Definition mgl_unique_ptr.h:284
void Deallocate(void *buffer) noexcept
デアロケート
Definition mgl_memory.cc:118