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