UniSet @VERSION@
AccessMask.h
1/*
2 * Copyright (c) 2025 Pavel Vainerman.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as
6 * published by the Free Software Foundation, version 2.1.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Lesser Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16// --------------------------------------------------------------------------
17#ifndef AccessMask_H_
18#define AccessMask_H_
19// --------------------------------------------------------------------------
20#include <cstdint>
21#include <string>
22#include <algorithm>
23#include <initializer_list>
24#include <ostream>
25// --------------------------------------------------------------------------
26namespace uniset
27{
29 {
30 public:
31 enum Flag : uint8_t
32 {
33 UNKNOWN = 0,
34 NONE = 1 << 0,
35 READ = 1 << 1,
36 WRITE = 1 << 2
37 };
38
39 constexpr AccessMask() noexcept = default;
40 constexpr AccessMask(uint8_t m) noexcept : mask_(m) {}
41 constexpr AccessMask(Flag f) noexcept : mask_(f) {}
42 constexpr AccessMask(std::initializer_list<Flag> flags) noexcept
43 {
44 for (auto f : flags) mask_ |= f;
45 }
46
47 constexpr bool canRead() const noexcept
48 {
49 return mask_ & READ;
50 }
51
52 constexpr bool canWrite() const noexcept
53 {
54 return mask_ & WRITE;
55 }
56
57 constexpr bool empty() const noexcept
58 {
59 return mask_ == 0;
60 }
61
62 constexpr bool has(const AccessMask& other) const noexcept
63 {
64 return (mask_ & other.mask_) == other.mask_;
65 }
66
67 constexpr void add(const AccessMask& other) noexcept
68 {
69 mask_ |= other.mask_;
70 }
71
72 constexpr void remove(const AccessMask& other) noexcept
73 {
74 mask_ &= ~other.mask_;
75 }
76
77 constexpr void clear() noexcept
78 {
79 mask_ = 0;
80 }
81
82 constexpr uint8_t raw() const noexcept
83 {
84 return mask_;
85 }
86
87 std::string toString() const
88 {
89 switch (mask_)
90 {
91 case NONE:
92 return "None";
93
94 case READ:
95 return "RO";
96
97 case READ | WRITE:
98 return "RW";
99
100 case UNKNOWN:
101 return "Unknown";
102
103 default:
104 return "Unknown(" + std::to_string(mask_) + ")";
105 }
106 }
107
108 // сравнения и операции
109 constexpr bool operator==(const AccessMask& o) const noexcept
110 {
111 return mask_ == o.mask_;
112 }
113 constexpr bool operator!=(const AccessMask& o) const noexcept
114 {
115 return mask_ != o.mask_;
116 }
117
118 constexpr AccessMask operator|(const AccessMask& o) const noexcept
119 {
120 if( mask_ == NONE )
121 return *this;
122 return mask_ | o.mask_;
123 }
124 constexpr AccessMask operator&(const AccessMask& o) const noexcept
125 {
126 if( mask_ == NONE )
127 return *this;
128
129 return mask_ & o.mask_;
130 }
131
132 constexpr AccessMask& operator|=(const AccessMask& o) noexcept
133 {
134 if( mask_ == NONE )
135 return *this;
136
137 mask_ |= o.mask_;
138 return *this;
139 }
140 constexpr AccessMask& operator&=(const AccessMask& o) noexcept
141 {
142 if( mask_ == NONE )
143 return *this;
144 mask_ &= o.mask_;
145 return *this;
146 }
147
148 static std::string toLower( const std::string& s )
149 {
150 std::string res = s;
151 std::transform(res.begin(), res.end(), res.begin(),
152 [](unsigned char c)
153 {
154 return std::tolower(c);
155 });
156 return res;
157 }
158
159 static AccessMask fromString( const std::string& m )
160 {
161 if( m.empty() )
162 return AccessMask::UNKNOWN;
163
164 auto s = toLower(m);
165
166 if( s == "rd" || s == "read" || s == "ro" || s == "r" )
167 return AccessMask::READ;
168
169 if( s == "wr" || s == "write" || s == "w" )
170 return AccessMask::WRITE;
171
172 if( s == "rw" )
173 return AccessMask::READ | AccessMask::WRITE;
174
175 if( s == "none" )
176 return AccessMask::NONE;
177
178 return AccessMask::UNKNOWN;
179 }
180
181 private:
182 uint8_t mask_ { UNKNOWN };
183 };
184
185 inline std::ostream& operator<<(std::ostream& os, const AccessMask& a)
186 {
187 return os << a.toString();
188 }
189
190 constexpr AccessMask AccessUnknown = AccessMask(AccessMask::UNKNOWN);
191 constexpr AccessMask AccessNone = AccessMask(AccessMask::NONE);
192 constexpr AccessMask AccessRO = AccessMask(AccessMask::READ);
193 constexpr AccessMask AccessRW = AccessMask({AccessMask::READ, AccessMask::WRITE});
194 // --------------------------------------------------------------------------
195} // end of uniset namespace
196// --------------------------------------------------------------------------
197#endif // AccessMask_H_
Definition AccessMask.h:29
Definition AccessConfig.h:30