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