1*e73bd0a1SAndrew Jeffery #pragma once 2*e73bd0a1SAndrew Jeffery 3*e73bd0a1SAndrew Jeffery #include <filesystem> 4*e73bd0a1SAndrew Jeffery #include <ios> 5*e73bd0a1SAndrew Jeffery 6*e73bd0a1SAndrew Jeffery // An RAII compliant object for holding a posix file descriptor 7*e73bd0a1SAndrew Jeffery class FileHandle 8*e73bd0a1SAndrew Jeffery { 9*e73bd0a1SAndrew Jeffery private: 10*e73bd0a1SAndrew Jeffery int fd; 11*e73bd0a1SAndrew Jeffery 12*e73bd0a1SAndrew Jeffery public: 13*e73bd0a1SAndrew Jeffery FileHandle() = delete; 14*e73bd0a1SAndrew Jeffery FileHandle(const FileHandle&) = delete; 15*e73bd0a1SAndrew Jeffery FileHandle& operator=(const FileHandle&) = delete; 16*e73bd0a1SAndrew Jeffery FileHandle(FileHandle&& /*in*/) noexcept; 17*e73bd0a1SAndrew Jeffery FileHandle& operator=(FileHandle&& /*in*/) noexcept; 18*e73bd0a1SAndrew Jeffery 19*e73bd0a1SAndrew Jeffery explicit FileHandle(const std::filesystem::path& name, 20*e73bd0a1SAndrew Jeffery std::ios_base::openmode mode = std::ios_base::in | 21*e73bd0a1SAndrew Jeffery std::ios_base::out); 22*e73bd0a1SAndrew Jeffery 23*e73bd0a1SAndrew Jeffery explicit FileHandle(int fd); 24*e73bd0a1SAndrew Jeffery 25*e73bd0a1SAndrew Jeffery ~FileHandle(); 26*e73bd0a1SAndrew Jeffery int handle() const; 27*e73bd0a1SAndrew Jeffery }; 28