0
0
mirror of https://github.com/OpenVPN/openvpn3.git synced 2024-09-20 12:12:15 +02:00

ffs.hpp: support additional numeric types

Signed-off-by: James Yonan <james@openvpn.net>
This commit is contained in:
James Yonan 2018-10-07 17:07:15 +03:00
parent dcb0c94520
commit c8bdf5a348

View File

@ -32,6 +32,18 @@ namespace openvpn {
#if defined(__GNUC__) #if defined(__GNUC__)
template <typename T>
inline constexpr int n_bits_type()
{
return sizeof(T) * 8;
}
template <typename T>
inline constexpr int n_bits_type(T& v)
{
return sizeof(v) * 8;
}
inline int find_first_set(unsigned int v) inline int find_first_set(unsigned int v)
{ {
if (!v) if (!v)
@ -43,7 +55,35 @@ namespace openvpn {
{ {
if (!v) if (!v)
return 0; return 0;
return 32 - __builtin_clz(v); return n_bits_type(v) - __builtin_clz(v);
}
inline int find_first_set(unsigned long v)
{
if (!v)
return 0;
return __builtin_ffsl(v);
}
inline int find_last_set(unsigned long v)
{
if (!v)
return 0;
return n_bits_type(v) - __builtin_clzl(v);
}
inline int find_first_set(unsigned long long v)
{
if (!v)
return 0;
return __builtin_ffsll(v);
}
inline int find_last_set(unsigned long long v)
{
if (!v)
return 0;
return n_bits_type(v) - __builtin_clzll(v);
} }
#elif defined(_MSC_VER) #elif defined(_MSC_VER)