-
Notifications
You must be signed in to change notification settings - Fork 0
/
uint_flags.hpp
51 lines (43 loc) · 1.11 KB
/
uint_flags.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// KT header-only library
// Requirements: C++17
#pragma once
#include "enum_flags_crtp.hpp"
namespace kt {
///
/// \brief Trivial wrapper for unsigned int as bit flags (union friendly)
///
template <typename Ty = std::uint32_t>
struct uint_flags : detail::t_enum_flags_<uint_flags<Ty>, Ty> {
static_assert(std::is_unsigned_v<Ty>, "Ty must be unsigned");
using type = Ty;
using value_type = Ty;
///
/// \brief Trivial storage (default initialized)
///
Ty bits;
///
/// \brief Conversion operator
///
constexpr explicit operator Ty() const noexcept { return bits; }
///
/// \brief Test if all bits in t are set
///
template <typename T>
constexpr bool operator[](T t) const noexcept {
return this->all(t);
}
///
/// \brief Add set bits and remove unset bits
///
template <typename T, typename U = T>
constexpr uint_flags<Ty>& update(T set, U unset = {}) noexcept {
bits |= static_cast<Ty>(set);
bits &= ~static_cast<Ty>(unset);
return *this;
}
private:
constexpr Ty& get_ty() noexcept { return bits; }
template <typename T, typename U>
friend struct kt::detail::t_enum_flags_;
};
} // namespace kt