// Copyright (C) 2023 Joel Rosdahl and other contributors // // See doc/AUTHORS.adoc for a complete list of contributors. // // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation; either version 3 of the License, or (at your option) // any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // // You should have received a copy of the GNU General Public License along with // this program; if not, write to the Free Software Foundation, Inc., 51 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #pragma once #include namespace util { template class BitSet { public: explicit BitSet(T value = {}); BitSet(const BitSet& set); BitSet& operator=(const BitSet& set); bool contains(T value) const; bool empty() const; void clear(); void insert(T value); void insert(const BitSet& set); void erase(T value); template static BitSet from_bitmask(U mask); typename std::underlying_type::type to_bitmask() const; private: typename std::underlying_type::type m_value; }; // --- Inline implementations --- template inline BitSet::BitSet(T value) : m_value(static_cast::type>(value)) { } template inline BitSet::BitSet(const BitSet& set) : m_value(set.m_value) { } template inline BitSet& BitSet::operator=(const BitSet& set) { m_value = set.m_value; return *this; } template inline bool BitSet::contains(T value) const { return m_value & static_cast::type>(value); } template inline bool BitSet::empty() const { return to_bitmask() == 0; } template inline void BitSet::insert(T value) { m_value |= static_cast::type>(value); } template inline void BitSet::insert(const BitSet& set) { m_value |= static_cast::type>(set.m_value); } template inline void BitSet::erase(T value) { m_value &= ~static_cast::type>(value); } template template inline BitSet BitSet::from_bitmask(U mask) { BitSet result; result.m_value = mask; return result; } template inline typename std::underlying_type::type BitSet::to_bitmask() const { return m_value; } } // namespace util