nngn
Loading...
Searching...
No Matches
flags.h
Go to the documentation of this file.
1#ifndef NNGN_FLAGS_H
2#define NNGN_FLAGS_H
3
4#include <type_traits>
5#include <utility>
6
8#include "utils.h"
9
10namespace nngn {
11
17template<typename T>
18struct Flags {
20 using UT = std::underlying_type_t<T>;
22 using AT = std::conditional_t<scoped_enum<T>, T, UT>;
24 using PT = std::common_type_t<AT, int>;
26 static constexpr Flags cast(PT x) { return static_cast<UT>(x); }
27 // Constructors
28 constexpr Flags(void) = default;
29 constexpr Flags(UT u) : v{u} {}
30 constexpr Flags(AT a) requires(scoped_enum<T>) : Flags{to_underlying(a)} {}
31 // Conversion
32 constexpr operator T(void) const { return static_cast<T>(this->v); }
33 // Access
34 constexpr T operator*(void) const { return T{*this}; }
35 // Operations
36 constexpr Flags operator~(void) const { return Flags::cast(~this->v); }
37 constexpr Flags operator-(void) const { return Flags::cast(-this->v); }
38 constexpr Flags operator&(AT rhs) { return *this & Flags{rhs}; }
39 constexpr Flags operator|(AT rhs) { return *this | Flags{rhs}; }
40 constexpr Flags operator^(AT rhs) { return *this ^ Flags{rhs}; }
41 constexpr Flags &operator&=(Flags rhs) { return *this = *this & rhs; }
42 constexpr Flags &operator|=(Flags rhs) { return *this = *this | rhs; }
43 constexpr Flags &operator^=(Flags rhs) { return *this = *this ^ rhs; }
44 // Methods
45 constexpr bool is_set(AT a) const { return (*this & Flags{a}).v; }
46 constexpr Flags &comp(void) { return *this = ~*this; }
47 constexpr Flags &set(AT a) { return *this |= a; }
48 constexpr Flags &set(AT a, bool b);
49 constexpr Flags &clear(AT a) { return *this &= ~Flags{a}; }
50 constexpr Flags check_and_clear(AT a);
51 // Data
52 UT v = {};
53};
54
55template<typename T>
56constexpr Flags<T> operator&(Flags<T> lhs, Flags<T> rhs) {
57 return lhs.v & rhs.v;
58}
59
60template<typename T>
61constexpr Flags<T> operator|(Flags<T> lhs, Flags<T> rhs) {
62 return lhs.v | rhs.v;
63}
64
65template<typename T>
66constexpr Flags<T> operator^(Flags<T> lhs, Flags<T> rhs) {
67 return lhs.v ^ rhs.v;
68}
69
70template<typename T>
71constexpr auto Flags<T>::set(AT a, bool b) -> Flags& {
72 return *this = Flags::cast(set_bit(this->v, a, b));
73}
74
75template<typename T>
76constexpr auto Flags<T>::check_and_clear(AT a) -> Flags {
77 return std::exchange(*this, *this & ~Flags{a}) & a;
78}
79
80}
81
82#endif
Definition: fundamental.h:79
Definition: debug.h:45
constexpr Flags< T > operator|(Flags< T > lhs, Flags< T > rhs)
Definition: flags.h:61
constexpr Flags< T > operator^(Flags< T > lhs, Flags< T > rhs)
Definition: flags.h:66
constexpr Flags< T > operator&(Flags< T > lhs, Flags< T > rhs)
Definition: flags.h:56
constexpr auto to_underlying(T t)
Definition: utils.h:136
constexpr auto set_bit(T t, T mask, bool value)
Definition: utils.h:185
v[1]
Definition: math.lua:19
Wrapper for a small unsigned integral representing flags.
Definition: flags.h:18
constexpr Flags & clear(AT a)
Definition: flags.h:49
constexpr Flags & comp(void)
Definition: flags.h:46
constexpr Flags operator-(void) const
Definition: flags.h:37
static constexpr Flags cast(PT x)
Creates an object from the result of an expression.
Definition: flags.h:26
constexpr Flags(UT u)
Definition: flags.h:29
constexpr bool is_set(AT a) const
Definition: flags.h:45
constexpr Flags check_and_clear(AT a)
Definition: flags.h:76
UT v
Definition: flags.h:52
std::conditional_t< scoped_enum< T >, T, UT > AT
Accepted type for integral arguments.
Definition: flags.h:22
constexpr Flags operator^(AT rhs)
Definition: flags.h:40
constexpr T operator*(void) const
Definition: flags.h:34
constexpr Flags(void)=default
constexpr Flags & set(AT a)
Definition: flags.h:47
std::common_type_t< AT, int > PT
Promoted type after an operation involving Ts.
Definition: flags.h:24
std::underlying_type_t< T > UT
Value type stored in the object.
Definition: flags.h:20
constexpr Flags & operator&=(Flags rhs)
Definition: flags.h:41
constexpr Flags operator~(void) const
Definition: flags.h:36
constexpr Flags & operator|=(Flags rhs)
Definition: flags.h:42
constexpr Flags & operator^=(Flags rhs)
Definition: flags.h:43
constexpr Flags operator&(AT rhs)
Definition: flags.h:38
constexpr Flags(AT a)
Definition: flags.h:30
constexpr Flags operator|(AT rhs)
Definition: flags.h:39
constexpr Flags & set(AT a, bool b)
Definition: flags.h:71