uLib-0.2
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Flags.h
Go to the documentation of this file.
1 #ifndef FLAGS_H
2 #define FLAGS_H
3 
4 #include <Core/Types.h>
5 
6 namespace uLib {
7 
8 template<typename Enum>
9 class Flags
10 {
11  int i;
12 public:
13  typedef Enum enum_type;
14  CONSTEXPR inline Flags(const Flags &f) : i(f.i) {}
15  CONSTEXPR inline Flags(Enum f) : i(f) {}
16  CONSTEXPR inline Flags() : i(0) {}
17 
18  inline Flags &operator=(const Flags &f) { i = f.i; return *this; }
19  inline Flags &operator&=(int mask) { i &= mask; return *this; }
20  inline Flags &operator&=(uint mask) { i &= mask; return *this; }
21  inline Flags &operator|=(Flags f) { i |= f.i; return *this; }
22  inline Flags &operator|=(Enum f) { i |= f; return *this; }
23  inline Flags &operator^=(Flags f) { i ^= f.i; return *this; }
24  inline Flags &operator^=(Enum f) { i ^= f; return *this; }
25 
26  CONSTEXPR inline operator int() const { return i; }
27 
28  CONSTEXPR inline Flags operator|(Flags f) const { return Flags(Enum(i | f.i)); }
29  CONSTEXPR inline Flags operator|(Enum f) const { return Flags(Enum(i | f)); }
30  CONSTEXPR inline Flags operator^(Flags f) const { return Flags(Enum(i ^ f.i)); }
31  CONSTEXPR inline Flags operator^(Enum f) const { return Flags(Enum(i ^ f)); }
32  CONSTEXPR inline Flags operator&(int mask) const { return Flags(Enum(i & mask)); }
33  CONSTEXPR inline Flags operator&(uint mask) const { return Flags(Enum(i & mask)); }
34  CONSTEXPR inline Flags operator&(Enum f) const { return Flags(Enum(i & f)); }
35  CONSTEXPR inline Flags operator~() const { return Flags(Enum(~i)); }
36 
37  CONSTEXPR inline bool operator!() const { return !i; }
38 
39  inline bool testFlag(Enum f) const { return (i & f) == f && (f != 0 || i == int(f) ); }
40 };
41 
42 #define ULIB_OPERATORS_FOR_FLAGS(Flags) \
43 CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) \
44 { return QFlags<Flags::enum_type>(f1) | f2; } \
45 CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) \
46 { return f2 | f1; }
47 
48 
49 } // uLib
50 
51 
52 
53 
54 #endif // FLAGS_H
CONSTEXPR Flags operator^(Flags f) const
Definition: Flags.h:30
bool testFlag(Enum f) const
Definition: Flags.h:39
Flags & operator^=(Enum f)
Definition: Flags.h:24
Flags & operator=(const Flags &f)
Definition: Flags.h:18
Flags & operator|=(Flags f)
Definition: Flags.h:21
Flags & operator&=(uint mask)
Definition: Flags.h:20
CONSTEXPR Flags operator&(int mask) const
Definition: Flags.h:32
Enum enum_type
Definition: Flags.h:13
CONSTEXPR Flags operator|(Flags f) const
Definition: Flags.h:28
#define CONSTEXPR
Definition: Types.h:161
CONSTEXPR Flags(Enum f)
Definition: Flags.h:15
CONSTEXPR Flags operator|(Enum f) const
Definition: Flags.h:29
CONSTEXPR Flags operator^(Enum f) const
Definition: Flags.h:31
Flags & operator&=(int mask)
Definition: Flags.h:19
CONSTEXPR Flags(const Flags &f)
Definition: Flags.h:14
Flags & operator^=(Flags f)
Definition: Flags.h:23
CONSTEXPR bool operator!() const
Definition: Flags.h:37
CONSTEXPR Flags operator~() const
Definition: Flags.h:35
CONSTEXPR Flags operator&(uint mask) const
Definition: Flags.h:33
Definition: Flags.h:9
CONSTEXPR Flags()
Definition: Flags.h:16
Flags & operator|=(Enum f)
Definition: Flags.h:22
CONSTEXPR Flags operator&(Enum f) const
Definition: Flags.h:34