stl: std::popcount

This commit is contained in:
skypjack
2026-04-17 11:29:10 +02:00
parent adff45e6a3
commit 793d4a9738
3 changed files with 4 additions and 3 deletions

View File

@@ -74,7 +74,7 @@ concept entity_like = requires {
*/
template<typename Traits>
class basic_entt_traits {
static constexpr auto length = std::popcount(Traits::entity_mask);
static constexpr auto length = stl::popcount(Traits::entity_mask);
static_assert(Traits::entity_mask && ((Traits::entity_mask & (Traits::entity_mask + 1)) == 0), "Invalid entity mask");
static_assert((Traits::version_mask & (Traits::version_mask + 1)) == 0, "Invalid version mask");

View File

@@ -47,14 +47,14 @@ enum class meta_traits : stl::uint32_t {
template<typename Type>
requires stl::is_enum_v<Type>
[[nodiscard]] auto meta_to_user_traits(const meta_traits traits) noexcept {
constexpr auto shift = std::popcount(static_cast<stl::underlying_type_t<meta_traits>>(meta_traits::_user_defined_traits));
constexpr auto shift = stl::popcount(static_cast<stl::underlying_type_t<meta_traits>>(meta_traits::_user_defined_traits));
return Type{static_cast<stl::underlying_type_t<Type>>(static_cast<stl::underlying_type_t<meta_traits>>(traits) >> shift)};
}
template<typename Type>
requires stl::is_enum_v<Type>
[[nodiscard]] auto user_to_meta_traits(const Type value) noexcept {
constexpr auto shift = std::popcount(static_cast<stl::underlying_type_t<meta_traits>>(meta_traits::_user_defined_traits));
constexpr auto shift = stl::popcount(static_cast<stl::underlying_type_t<meta_traits>>(meta_traits::_user_defined_traits));
const auto traits = static_cast<stl::underlying_type_t<internal::meta_traits>>(static_cast<stl::underlying_type_t<Type>>(value));
ENTT_ASSERT(traits < ((~static_cast<stl::underlying_type_t<meta_traits>>(meta_traits::_user_defined_traits)) >> shift), "Invalid traits");
return meta_traits{traits << shift};

View File

@@ -8,6 +8,7 @@ namespace entt::stl {
using std::bit_ceil;
using std::has_single_bit;
using std::popcount;
} // namespace entt::stl
/*! @endcond */