#pragma once namespace nall { template struct unique_pointer { template static auto create(P&&... p) { return unique_pointer{new T{forward

(p)...}}; } using type = T; T* pointer = nullptr; function deleter; unique_pointer(const unique_pointer&) = delete; auto operator=(const unique_pointer&) -> unique_pointer& = delete; unique_pointer(T* pointer = nullptr, const function& deleter = {}) : pointer(pointer), deleter(deleter) {} ~unique_pointer() { reset(); } auto operator=(T* source) -> unique_pointer& { reset(); pointer = source; return *this; } explicit operator bool() const { return pointer; } auto operator->() -> T* { return pointer; } auto operator->() const -> const T* { return pointer; } auto operator*() -> T& { return *pointer; } auto operator*() const -> const T& { return *pointer; } auto operator()() -> T& { return *pointer; } auto operator()() const -> const T& { return *pointer; } auto data() -> T* { return pointer; } auto data() const -> const T* { return pointer; } auto release() -> T* { auto result = pointer; pointer = nullptr; return result; } auto reset() -> void { if(pointer) { if(deleter) { deleter(pointer); } else { delete pointer; } pointer = nullptr; } } }; template struct unique_pointer { using type = T; T* pointer = nullptr; function void> deleter; unique_pointer(const unique_pointer&) = delete; auto operator=(const unique_pointer&) -> unique_pointer& = delete; unique_pointer(T* pointer = nullptr, const function& deleter = {}) : pointer(pointer), deleter(deleter) {} ~unique_pointer() { reset(); } auto operator=(T* source) -> unique_pointer& { reset(); pointer = source; return *this; } explicit operator bool() const { return pointer; } auto operator()() -> T* { return pointer; } auto operator()() const -> T* { return pointer; } alwaysinline auto operator[](uint offset) -> T& { return pointer[offset]; } alwaysinline auto operator[](uint offset) const -> const T& { return pointer[offset]; } auto data() -> T* { return pointer; } auto data() const -> const T* { return pointer; } auto release() -> T* { auto result = pointer; pointer = nullptr; return result; } auto reset() -> void { if(pointer) { if(deleter) { deleter(pointer); } else { delete[] pointer; } pointer = nullptr; } } }; }