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