20 using CFLAG_TYPE = CFLAG;
22 using CFLAG_INT = std::underlying_type_t<CFLAG_TYPE>;
28 constexpr c_flag() { m_cflag = (CFLAG) 0; }
29 constexpr c_flag(const ::std::initializer_list < CFLAG > &
list_base )
42 template <
typename THE_CFLAG >
43 constexpr c_flag(THE_CFLAG e)
44 requires (::std::is_same_v < THE_CFLAG, CFLAG >
46 { m_cflag = (CFLAG) e; }
49 constexpr c_flag(
const c_flag & e) { m_cflag = e.m_cflag; }
53 constexpr c_flag & operator |= (
const c_flag & e) { m_cflag = (CFLAG) ((CFLAG_INT)e.m_cflag | (CFLAG_INT)m_cflag);
return *
this; }
54 constexpr c_flag & operator &= (
const c_flag & e) { m_cflag = (CFLAG) ((CFLAG_INT)m_cflag & (CFLAG_INT)e.m_cflag);
return *
this; }
56 constexpr c_flag & operator += (
const c_flag & e) {
return operator |= (e); }
57 constexpr c_flag & operator -= (
const c_flag & e) {
return operator &= (~e); }
59 constexpr c_flag & operator ^= (
const c_flag & e) { toggle(e);
return *
this; }
62 constexpr CFLAG operator - (
const c_flag & e)
const {
return m_cflag & ~e; }
69 template <
typename TYPE > \
70 CFLAG operator + (
const TYPE & t)
const
77 constexpr CFLAG operator | (
const c_flag & e)
const {
return (CFLAG) ((CFLAG_INT) m_cflag | (CFLAG_INT) e.m_cflag); }
78 constexpr CFLAG operator & (
const c_flag & e)
const {
return (CFLAG) ((CFLAG_INT) m_cflag & (CFLAG_INT) e.m_cflag); }
80 constexpr CFLAG operator | (
const CFLAG & e)
const {
return (CFLAG) ((CFLAG_INT) m_cflag | (CFLAG_INT) e); }
81 constexpr CFLAG operator & (
const CFLAG & e)
const {
return (CFLAG) ((CFLAG_INT) m_cflag & (CFLAG_INT) e); }
83 constexpr bool is(
const c_flag & e)
const {
return (m_cflag & e) == e; }
84 constexpr bool has(c_flag e)
const {
return is(e); }
85 constexpr bool is_clear(
const c_flag & e)
const {
return !(m_cflag & e); }
86 constexpr bool is_null()
const {
return m_cflag == (CFLAG)0; }
87 constexpr bool is_set()
const {
return !is_null(); }
89 constexpr void erase(
const c_flag & e) { operator -= (e); }
90 constexpr void add(
const c_flag & e) { operator += (e); }
91 constexpr void unset(
const c_flag & e) { erase(e); }
92 constexpr void set(
const c_flag & e) { add(e); }
93 constexpr void clear() { m_cflag = (CFLAG) 0; }
95 constexpr void set(
const c_flag & e,
bool bSet) {
if(bSet) set(e);
else unset(e); }
96 constexpr void toggle(
const c_flag & e) {
if (is(e)) unset(e);
else set(e); }
98 constexpr c_flag & operator = (
const c_flag & e) { m_cflag = e.m_cflag;
return *
this; }
101 constexpr bool operator == (
const c_flag & e)
const {
return m_cflag == e.m_cflag; }
104 constexpr CFLAG & eflag() {
return (CFLAG &)m_cflag; }
105 constexpr CFLAG eflag()
const {
return (CFLAG)m_cflag; }
107 constexpr bool operator !()
110 return !((CFLAG)m_cflag);
114 constexpr explicit operator bool()
const {
115 return this->is_set();
118 constexpr explicit operator ::i64()
const {
119 return (::i64)m_cflag;
122 constexpr explicit operator ::i32()
const {
123 return (::i32)m_cflag;
126 constexpr explicit operator ::u64()
const {
127 return (::u64)m_cflag;
130 constexpr explicit operator ::u32()
const {
131 return (::u32)m_cflag;
133 constexpr explicit operator ::hash32()
const;
136 constexpr explicit operator ::i16()
const {
137 return (::i64)m_cflag;
140 constexpr explicit operator ::i8()
const {
141 return (::i32)m_cflag;
144 constexpr explicit operator ::u16()
const {
145 return (::u16)m_cflag;
148 constexpr explicit operator ::u8()
const {
149 return (::u32)m_cflag;
164 constexpr CFLAG operator ~()
const
167 return (CFLAG)(~(CFLAG_INT) m_cflag);
173 constexpr c_flag & operator ++(::i32)
176 m_cflag = (CFLAG)((CFLAG_INT) m_cflag + 1);
183 constexpr c_flag & operator %=(
const CFLAG & eenum)
186 m_cflag = (CFLAG)((CFLAG_INT) m_cflag % (CFLAG_INT) eenum);
192 constexpr c_flag& rotate(
const CFLAG& eenum)
195 if ((CFLAG_INT) m_cflag < 0)
202 this->operator ++(0);
204 return this->operator %=(eenum);
208 constexpr ::std::strong_ordering operator<=>(
const c_flag & e)
const
210 return (CFLAG_INT)m_cflag <=> (CFLAG_INT) e.m_cflag;
225 using ENUM_TYPE = ENUM;
227 using ENUM_INT = std::underlying_type_t<ENUM_TYPE>;
233 constexpr enumeration() { m_eenum = (ENUM) 0; }
234 constexpr enumeration(const ::std::initializer_list < ENUM > &
list_base )
247 template <
typename THE_ENUM >
248 constexpr enumeration(THE_ENUM e)
249 requires (::std::is_same_v < THE_ENUM, ENUM >
251 { m_eenum = (ENUM) e; }
254 constexpr enumeration(
const enumeration & e) { m_eenum = e.m_eenum; }
292 template < prototype_
integral INTEGRAL >
293 constexpr enumeration operator + (INTEGRAL i)
const {
return (ENUM)((::std::underlying_type_t<ENUM>) m_eenum + i); }
296 constexpr bool is(ENUM e)
const {
return m_eenum == e; }
299 constexpr bool is_null()
const {
return !is_set(); }
300 constexpr bool is_set()
const {
return !is_set(); }
305 constexpr void set(
const enumeration & e) { m_eenum = e; }
307 constexpr void clear() { m_eenum = (ENUM) 0; }
312 constexpr enumeration & operator = (
const enumeration & e) { m_eenum = e.m_eenum;
return *
this; }
315 constexpr bool operator == (
const enumeration & e)
const {
return m_eenum == e.m_eenum; }
319 constexpr ENUM & eflag() {
return (ENUM &)m_eenum; }
320 constexpr ENUM eflag()
const {
return (ENUM)m_eenum; }
322 constexpr bool operator !()
325 return !((ENUM)m_eenum);
331 constexpr explicit operator bool()
const {
332 return this->is_set();
335 constexpr explicit operator ::i64()
const {
336 return (::i64)m_eenum;
339 constexpr explicit operator ::i32()
const {
340 return (::i32)m_eenum;
343 constexpr explicit operator ::u64()
const {
344 return (::u64)m_eenum;
347 constexpr explicit operator ::u32()
const {
348 return (::u32)m_eenum;
351 constexpr explicit operator ::hash32()
const;
353 constexpr explicit operator ::i16()
const {
354 return (::i64)m_eenum;
357 constexpr explicit operator ::i8()
const {
358 return (::i32)m_eenum;
361 constexpr explicit operator ::u16()
const {
362 return (::u16)m_eenum;
365 constexpr explicit operator ::u8()
const {
366 return (::u32)m_eenum;
382 enumeration & operator ++(::i32)
385 m_eenum = (ENUM)((ENUM_INT) m_eenum + 1);
392 enumeration & operator %=(
const enumeration & eenum)
395 m_eenum = (ENUM)((ENUM_INT) m_eenum % (ENUM_INT) eenum.m_eenum);
401 enumeration& modulus(
const enumeration & eenumMin,
const enumeration & eenumMax)
404 m_eenum = (ENUM) ((ENUM_INT) eenumMin.m_eenum + ((m_eenum - eenumMin) % (eenumMax - eenumMin)));
408 enumeration& rotate(
const enumeration & eenumMin,
const enumeration & eenumMax)
411 return modulus(eenumMin, eenumMax);
415 enumeration& rotate(
const enumeration & eenumMax)
417 return rotate((ENUM) 0, eenumMax);
421 constexpr ENUM_INT operator-(
const enumeration & e)
const
424 return (ENUM_INT)m_eenum - (ENUM_INT) e.m_eenum;
428 constexpr ::std::strong_ordering operator<=>(
const enumeration & e)
const
431 return (ENUM_INT)m_eenum <=> (ENUM_INT) e.m_eenum;