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 ~FileDescriptor() 33 { 34 if (fd >= 0) 35 { 36 close(fd); 37 } 38 } 39 40 int operator()() 41 { 42 return fd; 43 } 44 45 operator bool() const 46 { 47 return fd != -1; 48 } 49 50 void set(int descriptor) 51 { 52 if (fd >= 0) 53 { 54 close(fd); 55 } 56 57 fd = descriptor; 58 } 59 60 private: 61 /** 62 * File descriptor 63 */ 64 int fd = -1; 65 }; 66 67 } // namespace util 68 } // namespace power 69 } // namespace witherspoon 70