DUDS
Distributed Update of Data from Something
BitFlags.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of the DUDS project. It is subject to the BSD-style
3  * license terms in the LICENSE file found in the top-level directory of this
4  * distribution and at https://github.com/jjackowski/duds/blob/master/LICENSE.
5  * No part of DUDS, including this file, may be copied, modified, propagated,
6  * or distributed except according to the terms contained in the LICENSE file.
7  *
8  * Copyright (C) 2017 Jeff Jackowski
9  */
10 #ifndef BITFLAGS_HPP
11 #define BITFLAGS_HPP
12 
13 #include <functional>
14 
15 namespace duds { namespace general {
16 
100 template <class Tag, class BitsType = int>
101 class BitFlags {
105  BitsType bits;
106  public:
112  typedef BitsType bitsType;
116  BitFlags() = default;
121  constexpr BitFlags(const BitsType &b) : bits(b) { }
127  constexpr BitFlags(const BitFlags &f) : bits(f.bits) { }
133  static constexpr BitFlags Zero() {
134  return BitFlags((BitsType)0);
135  }
141  static constexpr BitFlags Bit(BitsType b) {
142  return BitFlags(((BitsType)1) << b);
143  }
147  constexpr BitsType flags() const {
148  return bits;
149  }
153  constexpr BitFlags operator | (const BitFlags &bf) const {
154  return bits | bf.bits;
155  }
160  return bits |= bf.bits;
161  }
165  constexpr BitFlags operator & (const BitFlags &bf) const {
166  return bits & bf.bits;
167  }
172  return bits &= bf.bits;
173  }
177  constexpr BitFlags operator ^ (const BitFlags &bf) const {
178  return bits ^ bf.bits;
179  }
184  return bits ^= bf.bits;
185  }
189  constexpr bool operator == (const BitFlags &bf) const {
190  return bits == bf.bits;
191  }
195  constexpr bool operator != (const BitFlags &bf) const {
196  return bits != bf.bits;
197  }
201  constexpr bool operator == (const BitsType &b) const {
202  return bits == b;
203  }
207  constexpr bool operator != (const BitsType &b) const {
208  return bits != b;
209  }
213  constexpr BitFlags operator ~ () const {
214  return ~bits;
215  }
219  constexpr bool operator ! () const {
220  return !bits;
221  }
225  constexpr operator bool () const {
226  return bits != 0;
227  }
232  return bits = bf.bits;
233  }
240  return bits &= mask.bits;
241  }
246  return bits = 0;
247  }
252  BitFlags clear(const BitFlags &bf) {
253  return bits &= ~bf.bits;
254  }
259  BitFlags set(const BitFlags &bf) {
260  return bits |= bf.bits;
261  }
267  BitFlags setTo(const BitFlags &bf, bool val) {
268  if (val) {
269  return bits |= bf.bits;
270  }
271  return bits &= ~bf.bits;
272  }
278  BitFlags setMasked(const BitFlags &bf, const BitFlags &mask) {
279  return bits = (bits & (~mask.bits)) | (bf.bits & mask.bits);
280  }
285  BitFlags toggle(const BitFlags &bf) {
286  return bits ^= bf.bits;
287  }
294  constexpr bool test(const BitFlags &value, const BitFlags &mask) const {
295  return (bits & mask.bits) == (value.bits & mask.bits);
296  }
301  constexpr bool test(const BitFlags &valuemask) const {
302  return (bits & valuemask.bits) == valuemask.bits;
303  }
304 };
305 
306 } } // namespaces
307 
308 namespace std {
309 
314 template <class T, class B>
315 struct hash< duds::general::BitFlags<T, B> > {
316  std::size_t operator()(const duds::general::BitFlags<T, B> &bf) const {
317  return hash<B>()(bf.flags());
318  }
319 };
320 
321 }
322 
323 namespace duds { namespace general {
324 
330 template <class T, class B>
331 inline std::size_t hash_value(const duds::general::BitFlags<T, B> &bf) {
332  return std::hash< duds::general::BitFlags<T, B> >()(bf);
333 }
334 
335 } }
336 
337 #endif // #ifndef BITFLAGS_HPP
BitFlags setTo(const BitFlags &bf, bool val)
Make all bits in bf set or clear based on the value of val.
Definition: BitFlags.hpp:267
BitFlags mask(const BitFlags &mask)
A bit mask operation; bits set in mask will remain unchanged in this object, while all other bits wil...
Definition: BitFlags.hpp:239
BitFlags clear(const BitFlags &bf)
Clear all bits in this object that are set in bf.
Definition: BitFlags.hpp:252
std::size_t operator()(const duds::general::BitFlags< T, B > &bf) const
Definition: BitFlags.hpp:316
BitFlags()=default
Construct an uninitialized bit flags container.
BitFlags operator&=(const BitFlags &bf)
Regular bitwise and assignment.
Definition: BitFlags.hpp:171
constexpr bool test(const BitFlags &value, const BitFlags &mask) const
Returns true if the flags identified by mask have the same value as those flags do in value...
Definition: BitFlags.hpp:294
BitFlags toggle(const BitFlags &bf)
Toggle the bits that are set in bf; all other bits remain unchanged.
Definition: BitFlags.hpp:285
constexpr bool operator!() const
Regular logical not.
Definition: BitFlags.hpp:219
BitFlags operator^=(const BitFlags &bf)
Regular bitwise exclusive or assignment.
Definition: BitFlags.hpp:183
std::size_t hash_value(const duds::general::BitFlags< T, B > &bf)
Generates a hash value for use with Boost containers, like boost::multi_index::multi_index_container ...
Definition: BitFlags.hpp:331
static constexpr BitFlags Zero()
Makes a bit flags container with all flags cleared.
Definition: BitFlags.hpp:133
BitFlags clear()
Clear all bits.
Definition: BitFlags.hpp:245
BitFlags operator=(const BitFlags &bf)
Regular assignment.
Definition: BitFlags.hpp:231
STL namespace.
constexpr bool operator!=(const BitFlags &bf) const
Regular not equivalent operator.
Definition: BitFlags.hpp:195
constexpr BitFlags operator|(const BitFlags &bf) const
Regular bitwise or.
Definition: BitFlags.hpp:153
static constexpr BitFlags Bit(BitsType b)
Makes a bit flags container with a single bit set that is specified by digit number rather than value...
Definition: BitFlags.hpp:141
constexpr BitFlags(const BitFlags &f)
Construct a bit flags container with a copy of the contents of another container of the same type...
Definition: BitFlags.hpp:127
constexpr BitFlags(const BitsType &b)
Construct a bit flags container with a specified value.
Definition: BitFlags.hpp:121
BitFlags operator|=(const BitFlags &bf)
Regular bitwise or assignment.
Definition: BitFlags.hpp:159
BitsType bits
The flags.
Definition: BitFlags.hpp:105
constexpr BitFlags operator&(const BitFlags &bf) const
Regular bitwise and.
Definition: BitFlags.hpp:165
A type-safe bit flag storage class.
Definition: BitFlags.hpp:101
constexpr BitFlags operator^(const BitFlags &bf) const
Regular bitwise exclusive or.
Definition: BitFlags.hpp:177
constexpr bool operator==(const BitFlags &bf) const
Regular equality operator.
Definition: BitFlags.hpp:189
BitsType bitsType
The datatype used to store the flags.
Definition: BitFlags.hpp:112
constexpr BitsType flags() const
Returns the value stored in the object.
Definition: BitFlags.hpp:147
constexpr BitFlags operator~() const
Regular bitwise not.
Definition: BitFlags.hpp:213
constexpr bool test(const BitFlags &valuemask) const
Returns true if the flags identified by valuemask are all set.
Definition: BitFlags.hpp:301
BitFlags setMasked(const BitFlags &bf, const BitFlags &mask)
Changes only the bits in a masked range.
Definition: BitFlags.hpp:278