diff --git a/BAN/include/BAN/UniqPtr.h b/BAN/include/BAN/UniqPtr.h new file mode 100644 index 00000000..c22a1b7c --- /dev/null +++ b/BAN/include/BAN/UniqPtr.h @@ -0,0 +1,92 @@ +#pragma once + +#include +#include + +namespace BAN +{ + + template + class UniqPtr + { + BAN_NON_COPYABLE(UniqPtr); + + public: + UniqPtr() = default; + + UniqPtr(UniqPtr&& other) + { + m_pointer = other.m_pointer; + other.m_pointer = nullptr; + } + + ~UniqPtr() + { + clear(); + } + + static UniqPtr adopt(T* pointer) + { + UniqPtr uniq; + uniq.m_pointer = pointer; + return uniq; + } + + template + static BAN::ErrorOr create(Args&&... args) + { + UniqPtr uniq; + uniq.m_pointer = new T(BAN::forward(args)...); + if (uniq.m_pointer == nullptr) + return BAN::Error::from_errno(ENOMEM); + return uniq; + } + + UniqPtr& operator=(UniqPtr&& other) + { + m_pointer = other.m_pointer; + other.m_pointer = nullptr; + return *this; + } + + T& operator*() + { + ASSERT(m_pointer); + return *m_pointer; + } + + const T& operator*() const + { + ASSERT(m_pointer); + return *m_pointer; + } + + T* operator->() + { + ASSERT(m_pointer); + return m_pointer; + } + + const T* operator->() const + { + ASSERT(m_pointer); + return m_pointer; + } + + T* ptr() { return m_pointer; } + const T* ptr() const { return m_pointer; } + + void clear() + { + if (m_pointer) + delete m_pointer; + m_pointer = nullptr; + } + + operator bool() const { return m_pointer != nullptr; } + + private: + T* m_pointer = nullptr; + }; + +} \ No newline at end of file