mirror of
https://github.com/OpenVPN/openvpn3.git
synced 2024-09-20 20:13:05 +02:00
ffs.hpp: support additional numeric types
Signed-off-by: James Yonan <james@openvpn.net>
This commit is contained in:
parent
dcb0c94520
commit
c8bdf5a348
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user