aboutsummaryrefslogtreecommitdiffstats
path: root/common/alnumeric.h
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2020-08-13 14:04:29 -0700
committerChris Robinson <[email protected]>2020-08-13 14:04:29 -0700
commit8e7199cbb60a4682a3d4c28d5746c1890c40e983 (patch)
tree7344fb64ad696c0f1252c8d0e06ad3305fd9b9f5 /common/alnumeric.h
parentfd52c828a9c4f4bb7ed3a4dcfe4a5b4ed5664246 (diff)
Avoid a cmake check for determining the size of long
Diffstat (limited to 'common/alnumeric.h')
-rw-r--r--common/alnumeric.h26
1 files changed, 19 insertions, 7 deletions
diff --git a/common/alnumeric.h b/common/alnumeric.h
index df05b966..61bfff8b 100644
--- a/common/alnumeric.h
+++ b/common/alnumeric.h
@@ -96,15 +96,27 @@ inline size_t RoundUp(size_t value, size_t r) noexcept
*/
#ifdef __GNUC__
+template<typename T>
+struct NumericDetail64 { };
+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); }
+};
+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); }
+};
+
#define POPCNT32 __builtin_popcount
#define CTZ32 __builtin_ctz
-#if SIZEOF_LONG == 8
-#define POPCNT64 __builtin_popcountl
-#define CTZ64 __builtin_ctzl
-#else
-#define POPCNT64 __builtin_popcountll
-#define CTZ64 __builtin_ctzll
-#endif
+#define POPCNT64 NumericDetail64<uint64_t>::popcnt64
+#define CTZ64 NumericDetail64<uint64_t>::ctz64
#else