#pragma once #include #include #include /// std::unique_ptr, but for non-pointer resources template requires std::is_trivial_v && std::equality_comparable class ScopedResource { private: T mValue; public: ScopedResource() : mValue{ kNullValue } {} explicit ScopedResource(T t) : mValue{ std::move(t) } {} ScopedResource(const ScopedResource& that) = delete; ScopedResource& operator=(const ScopedResource& that) = delete; ScopedResource(ScopedResource&& that) noexcept : mValue(that.mValue) {} ScopedResource& operator=(ScopedResource&& that) noexcept { if (this == &that) return *this; TDeleter::DeleteObject(mValue); mValue = that.mValue; that.mValue = kNullValue; return *this; } ScopedResource& operator=(T newValue) { TDeleter::DeleteObject(mValue); mValue = newValue; return *this; } ~ScopedResource() { TDeleter::DeleteObject(mValue); } explicit operator bool() const { return mValue != kNullValue; } const T& get() const { return mValue; } T& get() { return mValue; } T release() { T tmp = mValue; mValue = kNullValue; return tmp; } };