annotate C++/modules/Flags/Flags.h @ 334:0b576ee64d45

* Create brand new hierarchy * Rename DynLib to Dynlib * Remove some warnings
author David Demelier <markand@malikania.fr>
date Sun, 08 Mar 2015 14:26:33 +0100
parents C++/Flags.h@a9946b5ca0cb
children d5ec1174b707
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
261
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * Flags.h -- safe wrapper for enum flags
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr>
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _FLAGS_H_
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _FLAGS_H_
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * @file Flags.h
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 * @brief Provide template class Flags and operators for enum classes
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <type_traits>
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 * @class Flags
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 * @brief Wrapper that store enum flags
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 * This class is used to store an enum and make bitwise operations on it. User do not need
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 * to supply these operators because they are implemented in the class.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 * This class is very cheap and store the real underlying type from the enum and all functions
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 * are inlined.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 template <typename Enum, typename Type = std::underlying_type_t<Enum>>
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 class Flags final {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 private:
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 Type m_value { 0 };
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 public:
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 * Construct flags to 0.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 constexpr Flags() noexcept = default;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 * Construct flags with the enum value.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 constexpr Flags(Enum m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 : m_value(static_cast<Type>(m))
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 * Construct flags with the enum value.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 constexpr Flags(Type m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 : m_value(m)
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 * Move constructor.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * @param other the other
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 inline Flags(Flags &&other) noexcept = default;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 * Copy constructor.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * @param other the other
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 inline Flags(const Flags &other) noexcept = default;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * Move operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * @param other the other
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 inline Flags &operator=(Flags &&other) noexcept = default;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 * Copy operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * @param other the other
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 inline Flags &operator=(const Flags &other) noexcept = default;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 * &= operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 * @return *this
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 inline Flags &operator&=(Enum m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 m_value &= static_cast<Type>(m);
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 return *this;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 * &= operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 * @return *this
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 inline Flags &operator&=(Type m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 m_value &= m;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 return *this;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 * |= operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 * @return *this
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 inline Flags &operator|=(Enum m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 m_value |= static_cast<Type>(m);
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 return *this;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 * |= operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 * @return *this
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 inline Flags &operator|=(Type m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 m_value |= m;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 return *this;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 * ^= operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 * @return *this
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 inline Flags &operator^=(Enum m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 m_value ^= static_cast<Type>(m);
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 return *this;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 * ^= operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 * @return *this
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 inline Flags &operator^=(Type m) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 m_value ^= m;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 return *this;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 * & operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 * @return & combination
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 constexpr Flags operator&(Enum m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 return m_value & static_cast<Type>(m);
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
186
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 * & operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 * @return & combination
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 constexpr Flags operator&(Type m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 return m_value & m;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
197
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 * | operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 * @return | combination
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 constexpr Flags operator|(Enum m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 return m_value | static_cast<Type>(m);
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
208
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 * | operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 * @return | combination
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 constexpr Flags operator|(Type m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 return m_value | m;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 * ^ operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 * @return ^ combination
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 constexpr Flags operator^(Enum m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 return m_value & static_cast<Type>(m);
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 * ^ operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 * @param m the mask
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 * @return ^ combination
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 constexpr Flags operator^(Type m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 return m_value & m;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 * ~ unary operator.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 * @return ~
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 constexpr Flags operator~() const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 return ~m_value;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
251
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 * Convert to bool. Simply check if value is not 0.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 * @return true if value != 0
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 constexpr operator bool() const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 return m_value != 0;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
261
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 * Operator !. Simply check if value is 0.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 * @return true if value == 0
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 */
262
a9946b5ca0cb Flags: forgot bool
David Demelier <markand@malikania.fr>
parents: 261
diff changeset
267 constexpr bool operator!() const noexcept
261
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 return m_value == 0;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 * Test comparison with other mask.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 * @return true if this value == m
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 constexpr bool operator==(Enum m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 return m_value == static_cast<Type>(m);
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
281
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 * Test comparison with other mask.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 * @return true if this value == m
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 constexpr bool operator==(Type m) const noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 return m_value == m;
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 };
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
292
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 * Apply & operator on the enum.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 * @param x1 the first value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 * @param x2 the second value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 template <typename Value, typename Type = std::enable_if_t<std::is_enum<Value>::value, std::underlying_type_t<Value>>>
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 constexpr Value operator&(Value x1, Value x2) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 return static_cast<Value>(static_cast<Type>(x1) & static_cast<Type>(x2));
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
304
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 * Apply | operator on the enum.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 * @param x1 the first value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 * @param x2 the second value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 template <typename Value, typename Type = std::enable_if_t<std::is_enum<Value>::value, std::underlying_type_t<Value>>>
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 constexpr Value operator|(Value x1, Value x2) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 return static_cast<Value>(static_cast<Type>(x1) | static_cast<Type>(x2));
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
316
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 * Apply ^ operator on the enum.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 * @param x1 the first value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 * @param x2 the second value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 template <typename Value, typename Type = std::enable_if_t<std::is_enum<Value>::value, std::underlying_type_t<Value>>>
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 constexpr Value operator^(Value x1, Value x2) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 return static_cast<Value>(static_cast<Type>(x1) ^ static_cast<Type>(x2));
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
328
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 /**
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 * Apply ~ operator on the enum.
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 *
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 * @param x1 the first value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 * @param x2 the second value
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 */
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 template <typename Value, typename Type = std::enable_if_t<std::is_enum<Value>::value, std::underlying_type_t<Value>>>
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 constexpr Value operator~(Value x) noexcept
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 {
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 return static_cast<Value>(~static_cast<Type>(x));
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 }
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
340
0c7bc55e0d36 Add Flags, a small wrapper for creating enum flags
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 #endif // !_FLAGS_H_