#ifndef CORE_UNIQUE_POINTER_H
#define CORE_UNIQUE_POINTER_H

namespace Core {
    template<typename T>
    class UniquePointer final {
        T* t;

    public:
        UniquePointer(T* t_) : t(t_) {
        }

        UniquePointer() : UniquePointer(nullptr) {
        }

        ~UniquePointer() {
            delete t;
        }

        UniquePointer(const UniquePointer&) = delete;
        UniquePointer& operator=(const UniquePointer&) = delete;

        UniquePointer(UniquePointer&& other) : UniquePointer(other.t) {
            other.t = nullptr;
        }

        UniquePointer& operator=(UniquePointer&& other) {
            if(this != &other) {
                delete t;
                t = other.t;
                other.t = nullptr;
            }
            return *this;
        };

        T* operator->() {
            return t;
        }

        const T* operator->() const {
            return t;
        }

        operator T*() {
            return t;
        }

        operator const T*() const {
            return t;
        }
    };
}

#endif