#ifndef UNIQUE_FD_HH #define UNIQUE_FD_HH #include class unique_fd { public: constexpr unique_fd() noexcept : fd_(-1) {} constexpr unique_fd(std::nullptr_t) noexcept : fd_(-1) {} explicit unique_fd(int fd) noexcept : fd_(fd) {} unique_fd(unique_fd&& fd) noexcept : fd_(fd.release()) {} ~unique_fd() { reset(); } unique_fd& operator=(unique_fd&& fd) noexcept { reset(fd.release()); return *this; } unique_fd& operator=(std::nullptr_t) noexcept { reset(); return *this; } int get() const noexcept { return fd_; } int operator*() const { return get(); } explicit operator bool() const noexcept { return fd_ >= 0; } int release() noexcept { int ret = fd_; fd_ = -1; return ret; } void reset(int fd = -1); private: unique_fd(unique_fd const&) = delete; unique_fd& operator=(unique_fd const&) = delete; int fd_; }; #endif // UNIQUE_FD_HH