#ifndef PASTELSYS_HIGHEST_BIT_HPP
#define PASTELSYS_HIGHEST_BIT_HPP
#include "pastel/sys/bit/highest_bit.h"
#include "pastel/sys/mytypes.h"
#include "pastel/sys/sequence/binary_search.h"
namespace Pastel
{
    template <typename Finite_Integer>
    integer highestBit(const Finite_Integer& data)
    {
        PASTEL_CONCEPT_CHECK(Finite_Integer, Finite_Integer_Concept);
        if (zero(data))
        {
            return -1;
        }
        integer bits = SizeInBits<Finite_Integer>::value;
        return (bits - 1) - 
            binarySearch(
            (integer)0, bits,
            [&](integer i)
            {
                return !zero(data & bitMask<Finite_Integer>(bits - (i + 1), bits));
            });
    }
}
#endif