12#ifndef OPENVPN_COMMON_FFS_H
13#define OPENVPN_COMMON_FFS_H
26inline constexpr int n_bits_type()
32inline constexpr int n_bits_type(
const T &v)
37inline int find_first_set(
const unsigned int v)
41 return __builtin_ffs(v);
44inline int find_first_set(
const int v)
46 return find_first_set(
static_cast<unsigned int>(v));
49inline int find_last_set(
const unsigned int v)
53 return n_bits_type(v) - __builtin_clz(v);
56inline int find_last_set(
const int v)
58 return find_last_set(
static_cast<unsigned int>(v));
61inline int find_first_set(
const unsigned long v)
65 return __builtin_ffsl(v);
68inline int find_first_set(
const long v)
70 return find_first_set(
static_cast<unsigned long>(v));
73inline int find_last_set(
const unsigned long v)
77 return n_bits_type(v) - __builtin_clzl(v);
80inline int find_last_set(
const long v)
82 return find_last_set(
static_cast<unsigned long>(v));
85inline int find_first_set(
const unsigned long long v)
89 return __builtin_ffsll(v);
92inline int find_first_set(
const long long v)
94 return find_first_set(
static_cast<unsigned long long>(v));
97inline int find_last_set(
const unsigned long long v)
101 return n_bits_type(v) - __builtin_clzll(v);
104inline int find_last_set(
const long long v)
106 return find_last_set(
static_cast<unsigned long long>(v));
109#elif defined(_MSC_VER)
113inline int find_first_set(
unsigned int x)
118 _BitScanForward((
unsigned long *)&r, x);
122inline int find_last_set(
unsigned int x)
127 _BitScanReverse((
unsigned long *)&r, x);
132#error no find_first_set / find_last_set implementation for this platform
138 return v && find_first_set(v) == find_last_set(v);
144 return find_last_set(v) - 1;
Support deferred server-side state creation when client connects.