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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
#ifndef INCLUDE_NCURSES_FLAGS_HPP_
#define INCLUDE_NCURSES_FLAGS_HPP_
#include <type_traits>
#include <ncurses/utils/preamble.hpp>
namespace NCURSES_CPP_NAMESPACE {
template <typename FlagBitsType> struct is_bitmask : public std::false_type {};
template <typename BitType, typename std::enable_if<is_bitmask<BitType>::value,
bool>::type = true>
class flags {
public:
using mask_type = typename std::underlying_type<BitType>::type;
// constructors
NCURSES_CPP_CONSTEXPR flags() NCURSES_CPP_NOEXCEPT : mask_(0) {}
NCURSES_CPP_CONSTEXPR flags(BitType bit) NCURSES_CPP_NOEXCEPT
: mask_(static_cast<mask_type>(bit)) {}
NCURSES_CPP_CONSTEXPR
flags(flags<BitType> const &rhs) NCURSES_CPP_NOEXCEPT : mask_(rhs.mask_) {}
NCURSES_CPP_CONSTEXPR explicit flags(mask_type flags) : mask_(flags) {}
// relational operators
#define NCURSES_CPP_RELATIONAL(op) \
NCURSES_CPP_CONSTEXPR bool operator op(flags<BitType> const &rhs) \
const NCURSES_CPP_NOEXCEPT { \
return mask_ op rhs.mask_; \
}
#define NCURSES_CPP_BITWISE(op) \
NCURSES_CPP_CONSTEXPR flags<BitType> operator op(flags<BitType> const &rhs) \
const NCURSES_CPP_NOEXCEPT { \
return flags<BitType>(mask_ op rhs.mask_); \
}
#define NCURSES_CPP_ASSIGNMENT(op) \
NCURSES_CPP_CONSTEXPR_14 flags<BitType> &operator op##=( \
flags<BitType> const &rhs) NCURSES_CPP_NOEXCEPT { \
mask_ op## = rhs.mask_; \
return *this; \
}
NCURSES_CPP_RELATIONAL(<)
NCURSES_CPP_RELATIONAL(<=)
NCURSES_CPP_RELATIONAL(>)
NCURSES_CPP_RELATIONAL(>=)
NCURSES_CPP_RELATIONAL(==)
NCURSES_CPP_RELATIONAL(!=)
// logical operator
NCURSES_CPP_CONSTEXPR bool operator!() const NCURSES_CPP_NOEXCEPT {
return !mask_;
}
// bitwise operators
NCURSES_CPP_BITWISE(&)
NCURSES_CPP_BITWISE(|)
NCURSES_CPP_BITWISE(^)
/*NCURSES_CPP_CONSTEXPR flags<BitType> operator~() const {*/
/* return flags<BitType>(m_mask ^ is_bitmask<BitType>::allflags.m_mask);*/
/*}*/
// assignment operators
NCURSES_CPP_CONSTEXPR_14 flags<BitType> &
operator=(flags<BitType> const &rhs) NCURSES_CPP_NOEXCEPT {
mask_ = rhs.mask_;
return *this;
}
NCURSES_CPP_ASSIGNMENT(&)
NCURSES_CPP_ASSIGNMENT(|)
NCURSES_CPP_ASSIGNMENT(^)
// cast operators
explicit NCURSES_CPP_CONSTEXPR operator bool() const NCURSES_CPP_NOEXCEPT {
return !!mask_;
}
explicit NCURSES_CPP_CONSTEXPR
operator mask_type() const NCURSES_CPP_NOEXCEPT {
return mask_;
}
#undef NCURSES_CPP_RELATIONAL
#undef NCURSES_CPP_BITWISE
#undef NCURSES_CPP_ASSIGNMENT
#if defined(NCURSES_CPP_FLAGS_MASK_TYPE_AS_PUBLIC)
public:
#else
private:
#endif
mask_type mask_;
};
// TODO:const BitType& - link may be not as good as copy
#define NPP_DEF_GLOB_OP(type_arg, op) \
template <typename BitType, \
typename std::enable_if<is_bitmask<BitType>::value, bool>::type = \
true> \
NCURSES_CPP_CONSTEXPR_INLINE type_arg operator op( \
const BitType &bit, flags<BitType> const &flags) NCURSES_CPP_NOEXCEPT { \
return flags.operator op(bit); \
}
#define NPP_DEF_GLOB_BITTYPE(op) \
template <typename BitType, \
typename std::enable_if<is_bitmask<BitType>::value, bool>::type = \
true> \
NCURSES_CPP_CONSTEXPR_INLINE flags<BitType> operator op( \
BitType lhs, BitType rhs) NCURSES_CPP_NOEXCEPT { \
return flags<BitType>(lhs) op rhs; \
}
#define NPP_DEF_GLOB_OP_BOOL(op) NPP_DEF_GLOB_OP(bool, op)
#define NPP_DEF_GLOB_OP_FLAG(op) NPP_DEF_GLOB_OP(flags<BitType>, op)
#if !defined(NCURSES_CPP_HAS_SPACESHIP_OPERATOR)
// relational operators only needed for pre C++20
NPP_DEF_GLOB_OP_BOOL(<)
NPP_DEF_GLOB_OP_BOOL(<=)
NPP_DEF_GLOB_OP_BOOL(>)
NPP_DEF_GLOB_OP_BOOL(>=)
NPP_DEF_GLOB_OP_BOOL(==)
NPP_DEF_GLOB_OP_BOOL(!=)
#endif
NPP_DEF_GLOB_OP_FLAG(&)
NPP_DEF_GLOB_OP_FLAG(|)
NPP_DEF_GLOB_OP_FLAG(^)
// bitwise operators on BitType
NPP_DEF_GLOB_BITTYPE(&)
NPP_DEF_GLOB_BITTYPE(|)
NPP_DEF_GLOB_BITTYPE(^)
#undef NPP_DEF_GLOB_OP
#undef NPP_DEF_GLOB_OP_BOOL
#undef NPP_DEF_GLOB_OP_FLAG
#undef NPP_DEF_GLOB_BITTYPE
template <typename BitType,
typename std::enable_if<is_bitmask<BitType>::value>::type>
NCURSES_CPP_CONSTEXPR_INLINE flags<BitType>
operator~(BitType bit) NCURSES_CPP_NOEXCEPT {
return ~(flags<BitType>(bit));
}
} // namespace NCURSES_CPP_NAMESPACE
#endif // INCLUDE_NCURSES_FLAGS_HPP_
|