1 #pragma once 2 3 #include <unistd.h> 4 namespace witherspoon 5 { 6 namespace power 7 { 8 namespace util 9 { 10 11 /** 12 * @class FileDescriptor 13 * 14 * Closes the file descriptor on destruction 15 */ 16 class FileDescriptor 17 { 18 public: 19 FileDescriptor() = default; 20 FileDescriptor(const FileDescriptor&) = delete; 21 FileDescriptor& operator=(const FileDescriptor&) = delete; 22 FileDescriptor(FileDescriptor&&) = delete; 23 FileDescriptor& operator=(FileDescriptor&&) = delete; 24 25 /** 26 * Constructor 27 * 28 * @param[in] fd - File descriptor 29 */ 30 FileDescriptor(int fd) : fd(fd) 31 {} 32 33 ~FileDescriptor() 34 { 35 if (fd >= 0) 36 { 37 close(fd); 38 } 39 } 40 41 int operator()() 42 { 43 return fd; 44 } 45 46 operator bool() const 47 { 48 return fd != -1; 49 } 50 51 void set(int descriptor) 52 { 53 if (fd >= 0) 54 { 55 close(fd); 56 } 57 58 fd = descriptor; 59 } 60 61 private: 62 /** 63 * File descriptor 64 */ 65 int fd = -1; 66 }; 67 68 } // namespace util 69 } // namespace power 70 } // namespace witherspoon 71