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;