#ifndef LLARP_BITS_HPP
#define LLARP_BITS_HPP

namespace llarp
{
  namespace bits
  {
    template < typename Int_t >
    constexpr size_t
    count_bits(const Int_t& i)
    {
      return i == 0 ? 0
                    : ((i & 0x01) == 0x01) ? 1UL + count_bits(i >> 1)
                                           : count_bits(i >> 1);
    }

    template < typename T >
    constexpr size_t
    __count_array_bits(const T& array, size_t idx)
    {
      return idx < sizeof(T)
          ? count_bits(array[idx]) + __count_array_bits(array, idx + 1)
          : 0;
    }

    template < typename T >
    constexpr size_t
    count_array_bits(const T& array)
    {
      return __count_array_bits(array, 0);
    }
  }  // namespace bits
}  // namespace llarp

#endif
