// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include namespace rocRoller { /** * Bitset which uses an enum (class) as an indexer. Has the interface of std::bitset, and can be * indexed by the enum. * * All new interfaces are constexpr so it can be used in concepts and to limit template instantiation. * * - The enum must declare a Count entry. * - All other entries must be >= 0 and < Count. * - Count must be <= 64. */ template class EnumBitset : public std::bitset(Enum::Count)> { public: static constexpr size_t Size = static_cast(Enum::Count); static_assert(Size <= 64); using Base = std::bitset; using Base::Base; using Base::operator[]; constexpr EnumBitset(std::initializer_list items); // cppcheck-suppress noExplicitConstructor constexpr EnumBitset(Base const& val); /** * Returns an object with all bits set. */ constexpr static EnumBitset All(); constexpr bool operator[](Enum val) const; /** * @brief Sets the taget enum to a value */ void set(Enum target, bool value = true); private: static constexpr size_t initialValue(std::initializer_list items); }; template std::string toString(EnumBitset const& bs); template std::string shortString(EnumBitset const& bs); template std::ostream& operator<<(std::ostream& stream, EnumBitset const& bs); } #include