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
7#include "concepts/fundamental.h"
8#include "utils.h"
9
10namespace nngn {
11
17template<typename T>
18struct Flags {
19 using UT = std::underlying_type_t<T>;
20 using AT = std::conditional_t<scoped_enum<T>, T, UT>;
21 UT t = {};
22 template<typename U> static constexpr Flags cast(U u);
23 constexpr Flags(void) = default;
24 constexpr Flags(UT u) : t{u} {}
25 constexpr Flags(AT a) requires(scoped_enum<T>) : Flags{to_underlying(a)} {}
26 constexpr bool is_set(AT a) const { return static_cast<bool>(*this & a); }
27 constexpr Flags &flip() { return *this = ~*this; }
28 constexpr Flags &set(AT a) { return *this |= a; }
29 constexpr Flags &set(AT a, bool b);
30 constexpr Flags &clear(AT a) { return *this &= ~Flags{a}; }
32 constexpr explicit operator bool() const { return t; }
33 constexpr Flags operator~() const { return Flags::cast(~this->t); }
34 constexpr Flags operator-() const { return Flags::cast(-this->t); }
35 constexpr Flags operator&(AT a) const;
36 constexpr Flags operator|(AT a) const;
37 constexpr Flags operator^(AT a) const;
38 constexpr Flags &operator&=(AT a) { return *this = *this & Flags{a}; }
39 constexpr Flags &operator|=(AT a) { return *this = *this | Flags{a}; }
40 constexpr Flags &operator^=(AT a) { return *this = *this ^ Flags{a}; }
41 constexpr Flags operator&(const Flags &f) const { return *this & f.t; }
42 constexpr Flags operator|(const Flags &f) const { return *this | f.t; }
43 constexpr Flags operator^(const Flags &f) const { return *this ^ f.t; }
44 constexpr Flags &operator&=(const Flags &f) { return *this = *this & f.t; }
45 constexpr Flags &operator|=(const Flags &f) { return *this = *this | f.t; }
46 constexpr Flags &operator^=(const Flags &f) { return *this = *this ^ f.t; }
47};
48
49template<typename T>
50template<typename U>
51constexpr auto Flags<T>::cast(U u) -> Flags {
52 return {static_cast<UT>(u)};
53}
54
55template<typename T>
56constexpr auto Flags<T>::set(AT a, bool b) -> Flags& {
57 return *this = Flags::cast(set_bit(this->t, a, b));
58}
59
60template<typename T>
61constexpr auto Flags<T>::check_and_clear(AT a) -> Flags {
62 return std::exchange(*this, *this & ~a) & a;
63}
64
65template<typename T>
66constexpr auto Flags<T>::operator&(AT a) const -> Flags {
67 return Flags::cast(this->t & static_cast<UT>(a));
68}
69
70template<typename T>
71constexpr auto Flags<T>::operator|(AT a) const -> Flags {
72 return Flags::cast(this->t | static_cast<UT>(a));
73}
74
75template<typename T>
76constexpr auto Flags<T>::operator^(AT a) const -> Flags {
77 return Flags::cast(this->t ^ static_cast<UT>(a));
78}
79
80}
81
82#endif
Definition: fundamental.h:79
function bool(title, init, text)
a
Definition: input.lua:31
function f()) end
#define T(f0, f1, f2)
Definition: audio.cpp:7
constexpr auto to_underlying(T t)
Definition: utils.h:138
constexpr auto set_bit(T t, T mask, bool value)
Definition: utils.h:187
Wrapper for an unsigned integral representing flags.
Definition: flags.h:18
constexpr Flags operator~() const
Definition: flags.h:33
constexpr Flags & clear(AT a)
Definition: flags.h:30
static constexpr Flags cast(U u)
constexpr Flags & operator^=(const Flags &f)
Definition: flags.h:46
constexpr Flags & operator&=(const Flags &f)
Definition: flags.h:44
constexpr Flags & operator|=(const Flags &f)
Definition: flags.h:45
constexpr Flags & operator|=(AT a)
Definition: flags.h:39
UT t
Definition: flags.h:21
constexpr Flags operator|(const Flags &f) const
Definition: flags.h:42
constexpr Flags(UT u)
Definition: flags.h:24
constexpr bool is_set(AT a) const
Definition: flags.h:26
constexpr Flags check_and_clear(AT a)
Definition: flags.h:61
constexpr Flags & flip()
Definition: flags.h:27
constexpr Flags operator^(const Flags &f) const
Definition: flags.h:43
constexpr Flags operator&(const Flags &f) const
Definition: flags.h:41
std::conditional_t< scoped_enum< T >, T, UT > AT
Definition: flags.h:20
constexpr Flags operator|(AT a) const
Definition: flags.h:71
constexpr Flags(void)=default
constexpr Flags & set(AT a)
Definition: flags.h:28
std::underlying_type_t< T > UT
Definition: flags.h:19
constexpr Flags & operator&=(AT a)
Definition: flags.h:38
constexpr Flags & operator^=(AT a)
Definition: flags.h:40
constexpr Flags operator^(AT a) const
Definition: flags.h:76
constexpr Flags operator-() const
Definition: flags.h:34
constexpr Flags(AT a)
Definition: flags.h:25
constexpr Flags operator&(AT a) const
Definition: flags.h:66
constexpr Flags & set(AT a, bool b)
Definition: flags.h:56