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