diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2016-09-16 01:47:56 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2016-09-16 01:47:56 +0300 |
commit | fbd6445c68745d484d5df8c75b0c12054185958f (patch) | |
tree | c8eb6da6b89d88f530647f408fd2c47669e1bb27 /src/handle.hpp | |
parent | .hpp instead of .h for C++ headers (diff) | |
download | privilege-check-fbd6445c68745d484d5df8c75b0c12054185958f.tar.gz privilege-check-fbd6445c68745d484d5df8c75b0c12054185958f.zip |
move source files to src/
Diffstat (limited to 'src/handle.hpp')
-rw-r--r-- | src/handle.hpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/handle.hpp b/src/handle.hpp new file mode 100644 index 0000000..5f83f24 --- /dev/null +++ b/src/handle.hpp @@ -0,0 +1,64 @@ +#pragma once + +#include <Windows.h> + +#include <cassert> + +#include <memory> +#include <utility> + +class Handle +{ +public: + Handle() = default; + + explicit Handle(HANDLE raw) + : impl{raw} + { } + + Handle(Handle&& other) noexcept + { + swap(other); + } + + Handle& operator=(Handle other) noexcept + { + swap(other); + return *this; + } + + void swap(Handle& other) noexcept + { + using std::swap; + swap(impl, other.impl); + } + + operator HANDLE() const + { + return impl.get(); + } + +private: + struct Close + { + void operator()(HANDLE raw) const + { + if (raw == NULL || raw == INVALID_HANDLE_VALUE) + return; + const auto ret = CloseHandle(raw); + assert(ret); + } + }; + + std::unique_ptr<void, Close> impl; + + Handle(const Handle&) = delete; +}; + +namespace std +{ + void swap(Handle& a, Handle& b) noexcept + { + a.swap(b); + } +} |