Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion libcxx/include/bitset
Original file line number Diff line number Diff line change
Expand Up @@ -867,7 +867,16 @@ bitset<_Size>::to_string(char __zero, char __one) const {

template <size_t _Size>
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 size_t bitset<_Size>::count() const _NOEXCEPT {
return static_cast<size_t>(std::count(__base::__make_iter(0), __base::__make_iter(_Size), true));
# if defined(_LIBCPP_COMPILER_CLANG_BASED) && !defined(_LIBCPP_CXX03_LANG)
if constexpr (_Size == 0) {
return 0;
} else if constexpr (_Size <= __base::__bits_per_word) {
return __builtin_popcountg(static_cast<unsigned _BitInt(_Size)>(__base::__first_));
} else
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need this else? Can't we have

#if defined(CLANG)
if constexpr (...) {
  // A
} else if constexpr (...) {
 // B
}
#endif

return std::count(...);

Seems a bit simpler and equivalent. Are you worried about the mere presence of return std::count(...) preventing inlining?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need the else, but it improves compile times quite a bit, since we avoid instantiating std::count altogether with it. IMO the tiny simplification isn't worth the compile time increase.

# endif
{
return static_cast<size_t>(std::count(__base::__make_iter(0), __base::__make_iter(_Size), true));
}
}

template <size_t _Size>
Expand Down
Loading