// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include namespace rocRoller { template inline constexpr size_t EnumBitset::initialValue(std::initializer_list items) { size_t rv = 0; for(auto const& entry : items) { // cppcheck-suppress useStlAlgorithm rv |= (1UL << static_cast(entry)); } return rv; } template inline constexpr EnumBitset::EnumBitset(std::initializer_list items) : Base(initialValue(items)) { } template inline constexpr EnumBitset::EnumBitset(Base const& val) : Base(val) { } template inline constexpr EnumBitset EnumBitset::All() { size_t rv = 0; for(size_t i = 0; i < Size; i++) rv |= (1UL << static_cast(i)); return EnumBitset(rv); } template inline constexpr bool EnumBitset::operator[](Enum val) const { return (*this)[static_cast(val)]; } template void EnumBitset::set(Enum target, bool value) { std::bitset(Enum::Count)>::set(static_cast(target), value); } template inline std::string toString(EnumBitset const& bs) { using myInt = std::underlying_type_t; std::ostringstream msg; for(myInt i = 0; i < static_cast(Enum::Count); ++i) { auto val = static_cast(i); bool set = bs[val]; msg << toString(val) << ": " << std::boolalpha << set << std::endl; } return msg.str(); } template std::string shortString(EnumBitset const& set) { std::string rv = "{"; bool first = true; for(int i = 0; i < static_cast(Enum::Count); i++) { auto enumValue = static_cast(i); if(set[enumValue]) { if(!first) rv += ", "; rv += toString(enumValue); first = false; } } return rv + "}"; } template std::ostream& operator<<(std::ostream& stream, EnumBitset const& bs) { return stream << toString(bs); } }