Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // WTFPL
- #pragma once
- #include <type_traits> // is_same
- #ifndef NOMINMAX
- #define NOMINMAX 1
- #define NOMINMAX_WAS_NOT_DEFINED 1
- #endif
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN 1
- #define LM_WAS_NOT_DEFINED 1
- #endif
- #include <windows.h>
- #ifdef LM_WAS_NOT_DEFINED
- #undef LMS_WAS_NOT_DEFINED
- #undef WIN32_LEAN_AND_MEAN
- #endif
- #ifdef NOMINMAX_WAS_NOT_DEFINED
- #undef NOMINMAX_WAS_NOT_DEFINED
- #undef NOMINMAX
- #endif
- namespace ApiResource
- {
- template<typename T, BOOL(WINAPI *Deleter)(T)>
- struct UniqueApiResource {
- UniqueApiResource() noexcept :
- res(nullptr)
- {
- }
- UniqueApiResource(T res) noexcept :
- res(res)
- {
- }
- UniqueApiResource(UniqueApiResource && other) noexcept :
- res(other.res)
- {
- other.res = nullptr;
- }
- UniqueApiResource & operator=(UniqueApiResource && other) noexcept
- {
- res = other.res;
- other.res = nullptr;
- return *this;
- }
- UniqueApiResource & operator=(nullptr_t) noexcept
- {
- if (res) {
- Deleter(res);
- res = nullptr;
- }
- return *this;
- }
- ~UniqueApiResource() noexcept(noexcept(Deleter))
- {
- if (!operator!()) {
- Deleter(res);
- }
- }
- T get() noexcept
- {
- return res;
- }
- const T get() const noexcept
- {
- return res;
- }
- T eject() noexcept
- {
- T temp{ res };
- res = nullptr;
- return temp;
- }
- bool operator!() const noexcept
- {
- if constexpr (std::is_same_v<T, HANDLE>)
- {
- return res == nullptr || res == INVALID_HANDLE_VALUE;
- } else {
- return res == nullptr;
- }
- }
- operator bool() const noexcept
- {
- return !operator!();
- }
- UniqueApiResource(const UniqueApiResource &) = delete;
- UniqueApiResource & operator=(const UniqueApiResource &) = delete;
- protected:
- T res;
- };
- inline BOOL WINAPI unmapViewOfFile_const_fix(LPVOID addr)
- {
- return UnmapViewOfFile(addr);
- }
- using UniqueLibrary = UniqueApiResource<HMODULE, FreeLibrary>;
- using UniqueHandle = UniqueApiResource<HANDLE, CloseHandle>;
- using UniqueViewOfFile = UniqueApiResource<LPVOID, &unmapViewOfFile_const_fix>;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement