7 #ifndef _FCITX_UTILS_FLAG_H_ 8 #define _FCITX_UTILS_FLAG_H_ 10 #include <initializer_list> 11 #include <type_traits> 12 #include <fcitx-utils/macros.h> 32 template <
typename Enum>
35 using storage_type =
typename std::underlying_type_t<Enum>;
36 constexpr
Flags(Enum f) : flags_(static_cast<storage_type>(f)) {}
37 explicit Flags(storage_type i = 0) : flags_(i) {}
38 constexpr Flags(
const std::initializer_list<Enum> &l) : flags_(0) {
44 FCITX_INLINE_DEFINE_DEFAULT_DTOR_COPY_AND_MOVE(Flags)
46 constexpr
inline operator storage_type()
const {
return flags_; }
47 constexpr
inline storage_type toInteger()
const {
return flags_; }
49 Flags &operator=(Enum f) {
50 flags_ =
static_cast<storage_type
>(f);
53 Flags &operator=(storage_type f) {
58 constexpr
bool operator!()
const {
return !flags_; }
59 constexpr Flags &operator&=(Flags flag) {
60 flags_ &= flag.flags_;
63 Flags &operator&=(Enum flag) {
64 flags_ &=
static_cast<storage_type
>(flag);
67 Flags &operator|=(Flags flag) {
68 flags_ |= flag.flags_;
71 constexpr Flags &operator|=(Enum flag) {
72 flags_ |=
static_cast<storage_type
>(flag);
75 Flags &operator^=(Flags flag) {
76 flags_ ^= flag.flags_;
79 Flags &operator^=(Enum flag) {
80 flags_ ^=
static_cast<storage_type
>(flag);
83 constexpr
inline Flags operator|(Flags f)
const {
84 return Flags(flags_ | f.flags_);
86 constexpr
inline Flags operator|(Enum f)
const {
87 return Flags(flags_ | static_cast<storage_type>(f));
89 constexpr
inline Flags operator^(Flags f)
const {
90 return Flags(flags_ ^ f.flags_);
92 constexpr
inline Flags operator^(Enum f)
const {
93 return Flags(flags_ ^ static_cast<storage_type>(f));
95 constexpr
inline Flags operator&(Flags f)
const {
96 return Flags(flags_ & f.flags_);
98 constexpr
inline Flags operator&(Enum f)
const {
99 return Flags(flags_ & static_cast<storage_type>(f));
101 constexpr
inline Flags operator~()
const {
return Flags(~flags_); }
103 constexpr
inline Flags unset(Enum f)
const {
104 return Flags(flags_ & (~static_cast<storage_type>(f)));
107 constexpr
inline Flags unset(Flags f)
const {
108 return Flags(flags_ & (~f.flags_));
111 template <
typename T>
112 constexpr
inline bool test(T f)
const {
113 return (*
this & f) == f;
115 template <
typename T>
116 constexpr
inline bool testAny(T f)
const {
117 return (*
this & f) != 0;
120 constexpr
bool operator==(
const Flags &f)
const {
121 return flags_ == f.flags_;
123 constexpr
bool operator==(Enum f)
const {
124 return flags_ ==
static_cast<storage_type
>(f);
126 constexpr
bool operator!=(
const Flags &f)
const {
return !operator==(f); }
127 constexpr
bool operator!=(Enum f)
const {
return !operator==(f); }
134 #endif // _FCITX_UTILS_FLAG_H_
Class provides bit flag support for Enum.