aboutsummaryrefslogtreecommitdiffstats
path: root/common/alnumeric.h
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2020-09-01 15:55:48 -0700
committerChris Robinson <[email protected]>2020-09-01 15:55:48 -0700
commitfe329c2af28a3fc6dc5c792c4edccb01d1e90379 (patch)
tree7787836dd31d146ab34fe4a89b5a35f537607f09 /common/alnumeric.h
parent1968136c98e062009904fca20e48ea847f03fefa (diff)
Avoid class templates for the POPCNT64/CTZ64 macros
Diffstat (limited to 'common/alnumeric.h')
-rw-r--r--common/alnumeric.h31
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