- std::array<uint32_t, I> mData;\r
-\r
- void Set()\r
- {\r
- }\r
-\r
- static constexpr bool Accepts()\r
- {\r
- return true;\r
- }\r
-\r
- template<typename T>\r
- static constexpr bool Accepts()\r
- {\r
- return std::is_enum<T>::value;\r
- }\r
-\r
- template<typename T, typename T2, typename... ARGS>\r
- static constexpr bool Accepts()\r
- {\r
- return std::is_enum<T>::value && Accepts<T2, ARGS...>();\r
- }\r
-\r
- template<typename T, typename... ARGS>\r
- void Set(T t, ARGS... args)\r
- {\r
- (*this)[t] = true;\r
- Set(args...);\r
- }\r
-\r
-public:\r
- BitSets()\r
- {\r
- for(auto& u : mData)\r
- {\r
- u = 0;\r
- }\r
- }\r
- BitSets(const BitSets&) = default;\r
- BitSets(BitSets&&) = default;\r
-\r
- template<typename T, typename... ARGS, typename std::enable_if<Accepts<T, ARGS...>()>::type* = nullptr>\r
- BitSets(T t, ARGS... args)\r
- {\r
- for(auto& u : mData)\r
- {\r
- u = 0;\r
- }\r
- Set(t, args...);\r
- }\r
-\r
- explicit BitSets(std::array<uint32_t, I> d)\r
- {\r
- for(auto i = 0u; i < I; ++i)\r
- {\r
- mData[i] = d[i];\r
- }\r
- }\r
-\r
- explicit BitSets(std::array<int32_t, I> d)\r
- {\r
- for(auto i = 0u; i < I; ++i)\r
- {\r
- mData[i] = static_cast<uint32_t>(d[i]);\r
- }\r
- }\r
-\r
- BitSets& operator=(const BitSets&) = default;\r
- BitSets& operator=(BitSets&&) = default;\r
-\r
- struct Reference\r
- {\r
- std::array<uint32_t, I>& data;\r
- size_t pos;\r
-\r
- Reference& operator=(Reference r)\r
- {\r
- (*this) = static_cast<bool>(r);\r
- return *this;\r
- }\r
-\r
- Reference& operator=(bool v)\r
- {\r
- if(v)\r
- {\r
- data[pos / 32] |= 1 << (pos & 31);\r
- }\r
- else\r
- {\r
- data[pos / 32] &= ~(1 << (pos & 31));\r
- }\r
- return *this;\r
- }\r
-\r
- operator bool() const\r
- {\r
- auto i = static_cast<size_t>(pos);\r
- return (data[i / 32] & (1 << (i & 31))) != 0;\r
- }\r
- }; // Reference struct\r
-\r
- Reference operator[](S index)\r
- {\r
- return {mData, static_cast<size_t>(index)};\r
- }\r
-\r
- bool operator[](S index) const\r
- {\r
- auto i = static_cast<size_t>(index);\r
- return (mData[i / 32] & (1 << (i & 31))) != 0;\r
- }\r
-\r
- std::array<uint32_t, I> GetRawData() const\r
- {\r
- return mData;\r
- }\r
-\r
- BitSets operator|(BitSets b) const\r
- {\r
- BitSets r;\r
- for(auto i = 0u; i < I; ++i)\r
- {\r
- r.mData[i] = mData[i] | b.mData[i];\r
- }\r
- return r;\r
- }\r
-\r
- BitSets operator^(BitSets b) const\r
- {\r
- BitSets r;\r
- for(auto i = 0u; i < I; ++i)\r
- {\r
- r.mData[i] = mData[i] ^ b.mData[i];\r
- }\r
- return r;\r
- }\r
-\r
- BitSets operator&(BitSets b) const\r
- {\r
- BitSets r;\r
- for(auto i = 0u; i < I; ++i)\r
- {\r
- r.mData[i] = mData[i] & b.mData[i];\r
- }\r
- return r;\r
- }\r