diff options
author | Chris Robinson <[email protected]> | 2020-09-01 15:55:48 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2020-09-01 15:55:48 -0700 |
commit | fe329c2af28a3fc6dc5c792c4edccb01d1e90379 (patch) | |
tree | 7787836dd31d146ab34fe4a89b5a35f537607f09 /common/alnumeric.h | |
parent | 1968136c98e062009904fca20e48ea847f03fefa (diff) |
Avoid class templates for the POPCNT64/CTZ64 macros
Diffstat (limited to 'common/alnumeric.h')
-rw-r--r-- | common/alnumeric.h | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/common/alnumeric.h b/common/alnumeric.h index 61bfff8b..af8e7b2e 100644 --- a/common/alnumeric.h +++ b/common/alnumeric.h @@ -96,27 +96,28 @@ inline size_t RoundUp(size_t value, size_t r) noexcept */ #ifdef __GNUC__ +namespace detail_ { + +template<typename T> +constexpr inline auto popcnt64(T val) = delete; +template<> +constexpr inline auto popcnt64(unsigned long long val) { return __builtin_popcountll(val); } +template<> +constexpr inline auto popcnt64(unsigned long val) { return __builtin_popcountl(val); } + template<typename T> -struct NumericDetail64 { }; +constexpr inline auto ctz64(T val) = delete; template<> -struct NumericDetail64<unsigned long long> { - constexpr static inline auto popcnt64(unsigned long long val) noexcept - { return __builtin_popcountll(val); } - constexpr static inline auto ctz64(unsigned long long val) noexcept - { return __builtin_ctzll(val); } -}; +constexpr inline auto ctz64(unsigned long long val) { return __builtin_ctzll(val); } template<> -struct NumericDetail64<unsigned long> { - constexpr static inline auto popcnt64(unsigned long val) noexcept - { return __builtin_popcountl(val); } - constexpr static inline auto ctz64(unsigned long val) noexcept - { return __builtin_ctzl(val); } -}; +constexpr inline auto ctz64(unsigned long val) { return __builtin_ctzl(val); } + +} // namespace detail_ #define POPCNT32 __builtin_popcount #define CTZ32 __builtin_ctz -#define POPCNT64 NumericDetail64<uint64_t>::popcnt64 -#define CTZ64 NumericDetail64<uint64_t>::ctz64 +#define POPCNT64 detail_::popcnt64<uint64_t> +#define CTZ64 detail_::ctz64<uint64_t> #else |