31#ifndef ETL_BINARY_INCLUDED
32#define ETL_BINARY_INCLUDED
47#include "static_assert.h"
50#if ETL_USING_CPP20 && ETL_USING_STL
64 binary_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
65 :
exception(reason_, file_name_, line_number_)
78 binary_out_of_range(string_type file_name_, numeric_type line_number_)
79 :
etl::binary_exception(ETL_ERROR_TEXT(
"binary:out of range", ETL_BINARY_FILE_ID
"A"), file_name_, line_number_)
89 template <
size_t NBits>
92 typedef typename etl::smallest_uint_for_bits<NBits>::type value_type;
93 static ETL_CONSTANT value_type value = (value_type(1) << (NBits - 1)) |
max_value_for_nbits<NBits - 1>::value;
100 typedef etl::smallest_uint_for_bits<0>::type value_type;
101 static ETL_CONSTANT value_type value = 0;
104 template <
size_t NBits>
105 ETL_CONSTANT
typename max_value_for_nbits<NBits>::value_type max_value_for_nbits<NBits>::value;
108 template <
size_t NBits>
109 inline constexpr typename etl::max_value_for_nbits<NBits>::value_type max_value_for_nbits_v = max_value_for_nbits<NBits>::value;
116 template <
typename T>
119#if ETL_USING_CPP20 && ETL_USING_STL
120 return std::rotl(value, 1);
122 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
126 return (value << 1U) | (value >> SHIFT);
134 template <
typename T>
137#if ETL_USING_CPP20 && ETL_USING_STL
138 return std::rotl(value, distance);
140 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
144 const size_t SHIFT = BITS - distance;
152 return (value << distance) | (value >> SHIFT);
161 template <
typename T>
164#if ETL_USING_CPP20 && ETL_USING_STL
165 return std::rotr(value, 1);
167 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
171 return (value >> 1U) | (value << SHIFT);
179 template <
typename T>
182#if ETL_USING_CPP20 && ETL_USING_STL
183 return std::rotr(value, distance);
185 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
189 const size_t SHIFT = BITS - distance;
197 return (value >> distance) | (value << SHIFT);
207 template <
typename T>
208 ETL_CONSTEXPR14 T rotate(T value,
typename etl::make_signed<size_t>::type distance)
210 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
230 template <
typename T>
233 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
235 return (value >> 1U) ^ value;
242 template <
typename TReturn,
size_t NBits,
typename TValue>
247 ETL_CONSTANT TValue mask = etl::power<2, NBits>::value - 1U;
248 ETL_CONSTANT
size_t shift = NBits;
251 TReturn folded_value = 0;
254 while (value >= etl::max_value_for_nbits<NBits>::value)
256 folded_value ^=
static_cast<TReturn
>(value & mask);
261 folded_value ^=
static_cast<TReturn
>(value & mask);
272 template <
typename TReturn,
size_t NBits,
typename TValue>
275 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
276 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
281 signed value : NBits;
284 return (s.value =
static_cast<int>(
static_cast<TReturn
>(value)));
293 template <
typename TReturn,
size_t NBits,
size_t SHIFT,
typename TValue>
296 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
297 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
303 signed value : NBits;
306 return (s.value =
static_cast<int>(
static_cast<TReturn
>(value >> SHIFT)));
315 template <
typename TReturn,
typename TValue>
318 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
319 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
323 TReturn mask = TReturn(1) << (NBits - 1);
324 value = value & TValue((TValue(1) << NBits) - 1);
326 return static_cast<TReturn
>(
static_cast<TReturn
>(value ^
static_cast<TValue
>(mask)) - mask);
335 template <
typename TReturn,
typename TValue>
336 ETL_CONSTEXPR14 TReturn
sign_extend(TValue value,
size_t NBits,
size_t SHIFT)
338 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
339 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
343 TReturn mask = TReturn(1) << (NBits - 1);
344 value = (value >> SHIFT) & TValue((TValue(1) << NBits) - 1);
346 return static_cast<TReturn
>(
static_cast<TReturn
>(value ^
static_cast<TValue
>(mask)) - mask);
354 template <
size_t POSITION>
357 typedef typename etl::smallest_uint_for_bits<POSITION + 1U>::type value_type;
358 static ETL_CONSTANT value_type value = value_type(1) << POSITION;
361 template <
size_t POSITION>
362 ETL_CONSTANT
typename bit<POSITION>::value_type bit<POSITION>::value;
365 template <
size_t POSITION>
366 using bit_t =
typename etl::bit<POSITION>::value_type;
370 template <
size_t POSITION>
371 inline constexpr bit_t<POSITION> bit_v = etl::bit<POSITION>::value;
378 template <
typename TResult,
typename TValue>
381 ETL_STATIC_ASSERT(
sizeof(TResult) >=
sizeof(TValue),
"Result must be at least as large as the fill value");
383 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
384 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
386 return TResult(unsigned_v_t(value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
393 template <
typename TResult,
typename TValue, TValue Value>
396 ETL_STATIC_ASSERT(
sizeof(TResult) >=
sizeof(TValue),
"Result must be at least as large as the fill value");
398 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
399 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
401 return TResult(unsigned_v_t(Value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
404#if ETL_USING_8BIT_TYPES
409 template <
typename TValue>
410 ETL_CONSTEXPR14
bool has_zero_byte(TValue value)
412 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
414 const unsigned_t temp = unsigned_t(~((((unsigned_t(value) & mask) + mask) | unsigned_t(value)) | mask));
423 template <
typename TValue, TValue Value>
424 ETL_CONSTEXPR14
bool has_zero_byte()
426 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
428 const unsigned_t temp = unsigned_t(~((((unsigned_t(Value) & mask) + mask) | unsigned_t(Value)) | mask));
437 template <
typename TValue>
438 ETL_CONSTEXPR14
bool has_byte_n(TValue value, uint8_t n)
447 template <
typename TValue, TValue Value>
448 ETL_CONSTEXPR14
bool has_byte_n(TValue value)
460 template <
typename T>
463 return second ^ ((second ^ first) & mask);
472 template <
typename T, T MASK>
475 return second ^ ((second ^ first) & MASK);
482 template <
typename T, T Value>
485#if ETL_USING_8BIT_TYPES
490 template <
typename T>
494 value = ((value & 0xAAU) >> 1U) | ((value & 0x55U) << 1U);
495 value = ((value & 0xCCU) >> 2U) | ((value & 0x33U) << 2U);
496 value = (value >> 4U) | ((value & 0x0FU) << 4U);
502 template <u
int8_t Value>
507 static ETL_CONSTANT uint8_t value1 = uint8_t(((Value & 0xAAU) >> 1U) | ((Value & 0x55U) << 1U));
508 static ETL_CONSTANT uint8_t value2 = uint8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
512 static ETL_CONSTANT uint8_t value = uint8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
515 template <u
int8_t Value>
516 ETL_CONSTANT uint8_t reverse_bits_const<uint8_t, Value>::value;
519 template <
int8_t Value>
520 struct reverse_bits_const<int8_t, Value>
524 static ETL_CONSTANT int8_t value1 = int8_t(((
static_cast<uint8_t
>(Value) & 0xAAU) >> 1U) | ((
static_cast<uint8_t
>(Value) & 0x55U) << 1U));
525 static ETL_CONSTANT int8_t value2 = int8_t(((
static_cast<uint8_t
>(value1) & 0xCCU) >> 2U) | ((
static_cast<uint8_t
>(value1) & 0x33U) << 2U));
529 static ETL_CONSTANT int8_t value = int8_t((
static_cast<uint8_t
>(value2) >> 4U) | ((
static_cast<uint8_t
>(value2) & 0x0FU) << 4U));
532 template <
int8_t Value>
540 template <
typename T>
541 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
544 value = ((value & 0xAAAAU) >> 1U) | ((value & 0x5555U) << 1U);
545 value = ((value & 0xCCCCU) >> 2U) | ((value & 0x3333U) << 2U);
546 value = ((value & 0xF0F0U) >> 4U) | ((value & 0x0F0FU) << 4U);
547 value = (value >> 8U) | ((value & 0xFFU) << 8U);
553 template <u
int16_t Value>
558 static ETL_CONSTANT uint16_t value1 = uint16_t(((Value & 0xAAAAU) >> 1U) | ((Value & 0x5555U) << 1U));
559 static ETL_CONSTANT uint16_t value2 = uint16_t(((value1 & 0xCCCCU) >> 2U) | ((value1 & 0x3333U) << 2U));
560 static ETL_CONSTANT uint16_t value3 = uint16_t(((value2 & 0xF0F0U) >> 4U) | ((value2 & 0x0F0FU) << 4U));
564 static ETL_CONSTANT uint16_t value = uint16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
567 template <u
int16_t Value>
571 template <
int16_t Value>
576 static ETL_CONSTANT int16_t value1 = int16_t(((
static_cast<uint16_t
>(Value) & 0xAAAAU) >> 1U) | ((
static_cast<uint16_t
>(Value) & 0x5555U) << 1U));
578 ETL_CONSTANT int16_t value2 = int16_t(((
static_cast<uint16_t
>(value1) & 0xCCCCU) >> 2U) | ((
static_cast<uint16_t
>(value1) & 0x3333U) << 2U));
580 ETL_CONSTANT int16_t value3 = int16_t(((
static_cast<uint16_t
>(value2) & 0xF0F0U) >> 4U) | ((
static_cast<uint16_t
>(value2) & 0x0F0FU) << 4U));
584 static ETL_CONSTANT int16_t value = int16_t((
static_cast<uint16_t
>(value3) >> 8U) | ((
static_cast<uint16_t
>(value3) & 0xFFU) << 8U));
587 template <
int16_t Value>
594 template <
typename T>
598 value = ((value & 0xAAAAAAAAUL) >> 1U) | ((value & 0x55555555UL) << 1U);
599 value = ((value & 0xCCCCCCCCUL) >> 2U) | ((value & 0x33333333UL) << 2U);
600 value = ((value & 0xF0F0F0F0UL) >> 4U) | ((value & 0x0F0F0F0FUL) << 4U);
601 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
602 value = (value >> 16U) | ((value & 0xFFFFU) << 16U);
608 template <u
int32_t Value>
613 static ETL_CONSTANT uint32_t value1 = uint32_t(((Value & 0xAAAAAAAAUL) >> 1U) | ((Value & 0x55555555UL) << 1U));
614 static ETL_CONSTANT uint32_t value2 = uint32_t(((value1 & 0xCCCCCCCCUL) >> 2U) | ((value1 & 0x33333333UL) << 2U));
615 static ETL_CONSTANT uint32_t value3 = uint32_t(((value2 & 0xF0F0F0F0UL) >> 4U) | ((value2 & 0x0F0F0F0FUL) << 4U));
616 static ETL_CONSTANT uint32_t value4 = uint32_t(((value3 & 0xFF00FF00UL) >> 8U) | ((value3 & 0x00FF00FFUL) << 8U));
620 static ETL_CONSTANT uint32_t value = uint32_t((value4 >> 16U) | ((value4 & 0xFFFFU) << 16U));
623 template <u
int32_t Value>
627 template <
int32_t Value>
632 static ETL_CONSTANT int32_t value1 =
633 int32_t(((
static_cast<uint32_t
>(Value) & 0xAAAAAAAAUL) >> 1U) | ((
static_cast<uint32_t
>(Value) & 0x55555555UL) << 1U));
634 static ETL_CONSTANT int32_t value2 =
635 int32_t(((
static_cast<uint32_t
>(value1) & 0xCCCCCCCCUL) >> 2U) | ((
static_cast<uint32_t
>(value1) & 0x33333333UL) << 2U));
636 static ETL_CONSTANT int32_t value3 =
637 int32_t(((
static_cast<uint32_t
>(value2) & 0xF0F0F0F0UL) >> 4U) | ((
static_cast<uint32_t
>(value2) & 0x0F0F0F0FUL) << 4U));
638 static ETL_CONSTANT int32_t value4 =
639 int32_t(((
static_cast<uint32_t
>(value3) & 0xFF00FF00UL) >> 8U) | ((
static_cast<uint32_t
>(value3) & 0x00FF00FFUL) << 8U));
643 static ETL_CONSTANT int32_t value = int32_t((
static_cast<uint32_t
>(value4) >> 16U) | ((
static_cast<uint32_t
>(value4) & 0xFFFFUL) << 16U));
646 template <
int32_t Value>
649#if ETL_USING_64BIT_TYPES
654 template <
typename T>
658 value = ((value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((value & 0x5555555555555555ULL) << 1U);
659 value = ((value & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value & 0x3333333333333333ULL) << 2U);
660 value = ((value & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value & 0x0F0F0F0F0F0F0F0FULL) << 4U);
661 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
662 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
663 value = (value >> 32U) | ((value & 0xFFFFFFFFULL) << 32U);
669 template <u
int64_t Value>
674 static ETL_CONSTANT uint64_t value1 = uint64_t(((Value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((Value & 0x5555555555555555ULL) << 1U));
675 static ETL_CONSTANT uint64_t value2 = uint64_t(((value1 & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value1 & 0x3333333333333333ULL) << 2U));
676 static ETL_CONSTANT uint64_t value3 = uint64_t(((value2 & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value2 & 0x0F0F0F0F0F0F0F0FULL) << 4U));
677 static ETL_CONSTANT uint64_t value4 = uint64_t(((value3 & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value3 & 0x00FF00FF00FF00FFULL) << 8U));
678 static ETL_CONSTANT uint64_t value5 = uint64_t(((value4 & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value4 & 0x0000FFFF0000FFFFULL) << 16U));
682 static ETL_CONSTANT uint64_t value = uint64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
685 template <u
int64_t Value>
689 template <
int64_t Value>
694 static ETL_CONSTANT int64_t value1 =
695 int64_t(((
static_cast<uint64_t
>(Value) & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((
static_cast<uint64_t
>(Value) & 0x5555555555555555ULL) << 1U));
696 static ETL_CONSTANT int64_t value2 =
697 int64_t(((
static_cast<uint64_t
>(value1) & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((
static_cast<uint64_t
>(value1) & 0x3333333333333333ULL) << 2U));
698 static ETL_CONSTANT int64_t value3 =
699 int64_t(((
static_cast<uint64_t
>(value2) & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((
static_cast<uint64_t
>(value2) & 0x0F0F0F0F0F0F0F0FULL) << 4U));
700 static ETL_CONSTANT int64_t value4 =
701 int64_t(((
static_cast<uint64_t
>(value3) & 0xFF00FF00FF00FF00ULL) >> 8U) | ((
static_cast<uint64_t
>(value3) & 0x00FF00FF00FF00FFULL) << 8U));
702 static ETL_CONSTANT int64_t value5 =
703 int64_t(((
static_cast<uint64_t
>(value4) & 0xFFFF0000FFFF0000ULL) >> 16U) | ((
static_cast<uint64_t
>(value4) & 0x0000FFFF0000FFFFULL) << 16U));
707 static ETL_CONSTANT int64_t value = int64_t((
static_cast<uint64_t
>(value5) >> 32U) | ((
static_cast<uint64_t
>(value5) & 0xFFFFFFFFULL) << 32U));
710 template <
int64_t Value>
718 template <
typename T>
719 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, T>
::type reverse_bits(T value)
721 typedef typename etl::make_unsigned<T>::type unsigned_t;
723 return static_cast<T
>(
reverse_bits(
static_cast<unsigned_t
>(value)));
730#if ETL_USING_8BIT_TYPES
731 template <
typename T>
743 template <
typename T>
744 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
747#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
748 return std::byteswap(value);
750 return (value >> 8U) | (value << 8U);
758 template <
typename T>
762#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
763 return std::byteswap(value);
765 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
766 value = (value >> 16U) | (value << 16U);
772#if ETL_USING_64BIT_TYPES
777 template <
typename T>
781 #if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
782 return std::byteswap(value);
784 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
785 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
786 value = (value >> 32U) | (value << 32U);
797 template <
typename T>
798 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, T>
::type reverse_bytes(T value)
800 typedef typename etl::make_unsigned<T>::type unsigned_t;
802 return static_cast<T
>(
reverse_bytes(
static_cast<unsigned_t
>(value)));
805#if ETL_USING_8BIT_TYPES
810 template <
typename T>
814 value ^= (value >> 4U);
815 value ^= (value >> 2U);
816 value ^= (value >> 1U);
826 template <
typename T>
827 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
830 value ^= (value >> 8U);
831 value ^= (value >> 4U);
832 value ^= (value >> 2U);
833 value ^= (value >> 1U);
842 template <
typename T>
846 value ^= (value >> 16U);
847 value ^= (value >> 8U);
848 value ^= (value >> 4U);
849 value ^= (value >> 2U);
850 value ^= (value >> 1U);
855#if ETL_USING_64BIT_TYPES
860 template <
typename T>
864 value ^= (value >> 32U);
865 value ^= (value >> 16U);
866 value ^= (value >> 8U);
867 value ^= (value >> 4U);
868 value ^= (value >> 2U);
869 value ^= (value >> 1U);
879 template <
typename T>
880 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, T>
::type gray_to_binary(T value)
882 typedef typename etl::make_unsigned<T>::type unsigned_t;
884 return static_cast<T
>(
gray_to_binary(
static_cast<unsigned_t
>(value)));
887#if ETL_USING_8BIT_TYPES
892 template <
typename T>
897 #if ETL_CPP23_SUPPORTED && ETL_USING_STL
898 return std::popcount(value);
902 count = value - ((value >> 1U) & 0x55U);
903 count = ((count >> 2U) & 0x33U) + (count & 0x33U);
904 count = ((count >> 4U) + count) & 0x0FU;
906 return uint_least8_t(count);
915 template <
typename T>
917 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
920#if ETL_USING_CPP20 && ETL_USING_STL
921 return std::popcount(value);
925 count = value - ((value >> 1U) & 0x5555U);
926 count = ((count >> 2U) & 0x3333U) + (count & 0x3333U);
927 count = ((count >> 4U) + count) & 0x0F0FU;
928 count = ((count >> 8U) + count) & 0x00FFU;
930 return static_cast<uint_least8_t
>(count);
938 template <
typename T>
943#if ETL_USING_CPP20 && ETL_USING_STL
944 return std::popcount(value);
948 count = value - ((value >> 1U) & 0x55555555UL);
949 count = ((count >> 2U) & 0x33333333UL) + (count & 0x33333333UL);
950 count = ((count >> 4U) + count) & 0x0F0F0F0FUL;
951 count = ((count >> 8U) + count) & 0x00FF00FFUL;
952 count = ((count >> 16U) + count) & 0x0000FFUL;
954 return static_cast<uint_least8_t
>(count);
958#if ETL_USING_64BIT_TYPES
963 template <
typename T>
968 #if ETL_USING_CPP20 && ETL_USING_STL
969 return std::popcount(value);
973 count = value - ((value >> 1U) & 0x5555555555555555ULL);
974 count = ((count >> 2U) & 0x3333333333333333ULL) + (count & 0x3333333333333333ULL);
975 count = ((count >> 4U) + count) & 0x0F0F0F0F0F0F0F0FULL;
976 count = ((count >> 8U) + count) & 0x00FF00FF00FF00FFULL;
977 count = ((count >> 16U) + count) & 0x0000FFFF0000FFFFULL;
978 count = ((count >> 32U) + count) & 0x00000000FFFFFFFFULL;
980 return static_cast<uint_least8_t
>(count);
989 template <
typename T>
990 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>
::type count_bits(T value)
992 typedef typename etl::make_unsigned<T>::type unsigned_t;
994 return static_cast<uint_least8_t
>(
count_bits(
static_cast<unsigned_t
>(value)));
997#if ETL_USING_8BIT_TYPES
1002 template <
typename T>
1007 value ^= value >> 4U;
1009 return (0x6996U >> value) & 1U;
1017 template <
typename T>
1019 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1022 value ^= value >> 8U;
1023 value ^= value >> 4U;
1025 return (0x6996U >> value) & 1U;
1032 template <
typename T>
1037 value ^= value >> 16U;
1038 value ^= value >> 8U;
1039 value ^= value >> 4U;
1041 return (0x6996U >> value) & 1U;
1044#if ETL_USING_64BIT_TYPES
1049 template <
typename T>
1054 value ^= value >> 32U;
1055 value ^= value >> 16U;
1056 value ^= value >> 8U;
1057 value ^= value >> 4U;
1059 return (0x69966996UL >> value) & 1U;
1067 template <
typename T>
1068 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>
::type parity(T value)
1070 typedef typename etl::make_unsigned<T>::type unsigned_t;
1072 return static_cast<uint_least8_t
>(
parity(
static_cast<unsigned_t
>(value)));
1075#if ETL_USING_8BIT_TYPES
1081 template <
typename T>
1086 #if ETL_USING_CPP20 && ETL_USING_STL
1087 return std::countr_zero(value);
1089 uint_least8_t count = 0U;
1099 if ((value & 0xFU) == 0U)
1105 if ((value & 0x3U) == 0U)
1111 if ((value & 0x1U) == 0U)
1117 count -= (value & 0x1U);
1130 template <
typename T>
1132 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1135#if ETL_USING_CPP20 && ETL_USING_STL
1136 return std::countr_zero(value);
1138 uint_least8_t count = 0U;
1148 if ((value & 0xFFU) == 0U)
1154 if ((value & 0xFU) == 0U)
1160 if ((value & 0x3U) == 0U)
1166 if ((value & 0x1U) == 0U)
1172 count -= value & 0x1U;
1184 template <
typename T>
1189#if ETL_USING_CPP20 && ETL_USING_STL
1190 return std::countr_zero(value);
1192 uint_least8_t count = 0U;
1202 if ((value & 0xFFFFUL) == 0UL)
1208 if ((value & 0xFFUL) == 0UL)
1214 if ((value & 0xFUL) == 0UL)
1220 if ((value & 0x3UL) == 0UL)
1226 if ((value & 0x1U) == 0U)
1232 count -= value & 0x1UL;
1239#if ETL_USING_64BIT_TYPES
1245 template <
typename T>
1250 #if ETL_USING_CPP20 && ETL_USING_STL
1251 return std::countr_zero(value);
1253 uint_least8_t count = 0U;
1263 if ((value & 0xFFFFFFFFULL) == 0ULL)
1269 if ((value & 0xFFFFULL) == 0ULL)
1275 if ((value & 0xFFULL) == 0ULL)
1281 if ((value & 0xFULL) == 0ULL)
1287 if ((value & 0x3ULL) == 0ULL)
1293 if ((value & 0x1U) == 0U)
1299 count -= value & 0x1ULL;
1311 template <
typename T>
1312 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>
::type count_trailing_zeros(T value)
1314 typedef typename etl::make_unsigned<T>::type unsigned_t;
1319#if ETL_USING_8BIT_TYPES
1325 template <
typename T>
1330 #if ETL_USING_CPP20 && ETL_USING_STL
1331 return std::countr_one(value);
1333 uint_least8_t count = 0U;
1335 if ((value & 0x1U) == 0x0U)
1343 if ((value & 0xFU) == 0xFU)
1349 if ((value & 0x3U) == 0x3U)
1355 if ((value & 0x1U) == 0x1U)
1361 count -= ((value & 0x1U) == 0x0U);
1374 template <
typename T>
1376 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1379#if ETL_USING_CPP20 && ETL_USING_STL
1380 return std::countr_one(value);
1382 uint_least8_t count = 0U;
1384 if ((value & 0x1U) == 0x0U)
1392 if ((value & 0xFFU) == 0xFFU)
1398 if ((value & 0xFU) == 0xFU)
1404 if ((value & 0x3U) == 0x3U)
1410 if ((value & 0x1U) == 0x1U)
1416 count -= ((value & 0x1U) == 0x0U);
1428 template <
typename T>
1433#if ETL_USING_CPP20 && ETL_USING_STL
1434 return std::countr_one(value);
1436 uint_least8_t count = 0U;
1438 if ((value & 0x1UL) == 0x0UL)
1446 if ((value & 0xFFFFUL) == 0xFFFFUL)
1452 if ((value & 0xFFUL) == 0xFFUL)
1458 if ((value & 0xFUL) == 0xFUL)
1464 if ((value & 0x3UL) == 0x3UL)
1470 if ((value & 0x1UL) == 0x1UL)
1476 count -= ((value & 0x1UL) == 0x0UL);
1483#if ETL_USING_64BIT_TYPES
1489 template <
typename T>
1494 #if ETL_USING_CPP20 && ETL_USING_STL
1495 return std::countr_one(value);
1497 uint_least8_t count = 0U;
1499 if ((value & 0x1ULL) == 0x0ULL)
1507 if ((value & 0xFFFFULL) == 0xFFFFULL)
1513 if ((value & 0xFFULL) == 0xFFULL)
1519 if ((value & 0xFULL) == 0xFULL)
1525 if ((value & 0x3ULL) == 0x3ULL)
1531 if ((value & 0x1ULL) == 0x1ULL)
1537 count -= ((value & 0x1ULL) == 0x0ULL);
1549 template <
typename T>
1550 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>
::type count_trailing_ones(T value)
1552 typedef typename etl::make_unsigned<T>::type unsigned_t;
1557#if ETL_USING_8BIT_TYPES
1563 template <
typename T>
1568 #if ETL_USING_CPP20 && ETL_USING_STL
1569 return std::countl_zero(value);
1571 uint_least8_t count = 0U;
1581 if ((value & 0xF0U) == 0U)
1587 if ((value & 0xC0U) == 0U)
1593 if ((value & 0x80U) == 0U)
1599 count -= ((value & 0x80U) == 0x80U);
1612 template <
typename T>
1614 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1617#if ETL_USING_CPP20 && ETL_USING_STL
1618 return std::countl_zero(value);
1620 uint_least8_t count = 0U;
1622 if (value & 0x8000U)
1630 if ((value & 0xFF00U) == 0U)
1636 if ((value & 0xF000U) == 0U)
1642 if ((value & 0xC000U) == 0U)
1648 if ((value & 0x8000U) == 0U)
1654 count -= ((value & 0x8000U) == 0x8000U);
1666 template <
typename T>
1671#if ETL_USING_CPP20 && ETL_USING_STL
1672 return std::countl_zero(value);
1674 uint_least8_t count = 0U;
1676 if (value & 0x80000000UL)
1684 if ((value & 0xFFFF0000UL) == 0U)
1690 if ((value & 0xFF000000UL) == 0U)
1696 if ((value & 0xF0000000UL) == 0U)
1702 if ((value & 0xC0000000UL) == 0U)
1708 if ((value & 0x80000000UL) == 0U)
1714 count -= ((value & 0x80000000UL) == 0x80000000UL);
1721#if ETL_USING_64BIT_TYPES
1727 template <
typename T>
1732 #if ETL_USING_CPP20 && ETL_USING_STL
1733 return std::countl_zero(value);
1735 uint_least8_t count = 0U;
1737 if (value & 0x8000000000000000ULL)
1745 if ((value & 0xFFFFFFFFF0000000ULL) == 0U)
1751 if ((value & 0xFFFF000000000000ULL) == 0U)
1757 if ((value & 0xFF00000000000000ULL) == 0U)
1763 if ((value & 0xF000000000000000ULL) == 0U)
1769 if ((value & 0xC000000000000000ULL) == 0U)
1775 if ((value & 0x8000000000000000ULL) == 0U)
1781 count -= ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL);
1793 template <
typename T>
1794 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>
::type count_leading_zeros(T value)
1796 typedef typename etl::make_unsigned<T>::type unsigned_t;
1801#if ETL_USING_8BIT_TYPES
1807 template <
typename T>
1812 #if ETL_USING_CPP20 && ETL_USING_STL
1813 return std::countl_one(value);
1815 uint_least8_t count = 0U;
1817 if ((value & 0x80U) == 0U)
1825 if ((value & 0xF0U) == 0xF0U)
1831 if ((value & 0xC0U) == 0xC0U)
1837 if ((value & 0x80U) == 0x80U)
1843 count -= ((value & 0x80U) == 0x0U);
1856 template <
typename T>
1858 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1861#if ETL_USING_CPP20 && ETL_USING_STL
1862 return std::countl_one(value);
1864 uint_least8_t count = 0U;
1866 if ((value & 0x8000U) == 0U)
1874 if ((value & 0xFF00U) == 0xFF00U)
1880 if ((value & 0xF000U) == 0xF000U)
1886 if ((value & 0xC000U) == 0xC000U)
1892 if ((value & 0x8000U) == 0x8000U)
1898 count -= ((value & 0x8000U) == 0U);
1910 template <
typename T>
1915#if ETL_USING_CPP20 && ETL_USING_STL
1916 return std::countl_one(value);
1918 uint_least8_t count = 0U;
1920 if ((value & 0x80000000UL) == 0UL)
1928 if ((value & 0xFFFF0000UL) == 0xFFFF0000UL)
1934 if ((value & 0xFF000000UL) == 0xFF000000UL)
1940 if ((value & 0xF0000000UL) == 0xF0000000UL)
1946 if ((value & 0xC0000000UL) == 0xC0000000UL)
1952 if ((value & 0x80000000UL) == 0x80000000UL)
1958 count -= ((value & 0x80000000UL) == 0UL);
1965#if ETL_USING_64BIT_TYPES
1971 template <
typename T>
1976 #if ETL_USING_CPP20 && ETL_USING_STL
1977 return std::countl_one(value);
1979 uint_least8_t count = 0U;
1981 if ((value & 0x8000000000000000ULL) == 0ULL)
1989 if ((value & 0xFFFFFFFF00000000ULL) == 0xFFFFFFFF00000000ULL)
1995 if ((value & 0xFFFF000000000000ULL) == 0xFFFF000000000000ULL)
2001 if ((value & 0xFF00000000000000ULL) == 0xFF00000000000000ULL)
2007 if ((value & 0xF000000000000000ULL) == 0xF000000000000000ULL)
2013 if ((value & 0xC000000000000000ULL) == 0xC000000000000000ULL)
2019 if ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL)
2025 count -= ((value & 0x8000000000000000ULL) == 0ULL);
2037 template <
typename T>
2038 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, uint_least8_t>
::type count_leading_ones(T value)
2040 typedef typename etl::make_unsigned<T>::type unsigned_t;
2050 template <
typename T>
2061 template <
typename T>
2073 template <
typename T>
2084#if ETL_USING_8BIT_TYPES
2089 template <
typename T>
2094 uint16_t f = uint16_t(first);
2095 uint16_t s = uint16_t(second);
2097 f =
static_cast<uint16_t
>((
static_cast<uint32_t
>(f) | (
static_cast<uint32_t
>(f) << 4U)) & 0x0F0FU);
2098 f =
static_cast<uint16_t
>((
static_cast<uint32_t
>(f) | (
static_cast<uint32_t
>(f) << 2U)) & 0x3333U);
2099 f =
static_cast<uint16_t
>((
static_cast<uint32_t
>(f) | (
static_cast<uint32_t
>(f) << 1U)) & 0x5555U);
2101 s =
static_cast<uint16_t
>((
static_cast<uint32_t
>(s) | (
static_cast<uint32_t
>(s) << 4U)) & 0x0F0FU);
2102 s =
static_cast<uint16_t
>((
static_cast<uint32_t
>(s) | (
static_cast<uint32_t
>(s) << 2U)) & 0x3333U);
2103 s =
static_cast<uint16_t
>((
static_cast<uint32_t
>(s) | (
static_cast<uint32_t
>(s) << 1U)) & 0x5555U);
2105 return (f | (s << 1U));
2113 template <
typename T>
2115 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint32_t>::type
2118 uint32_t f = uint32_t(first);
2119 uint32_t s = uint32_t(second);
2121 f = (f | (f << 8U)) & 0x00FF00FFUL;
2122 f = (f | (f << 4U)) & 0x0F0F0F0FUL;
2123 f = (f | (f << 2U)) & 0x33333333UL;
2124 f = (f | (f << 1U)) & 0x55555555UL;
2126 s = (s | (s << 8U)) & 0x00FF00FFUL;
2127 s = (s | (s << 4U)) & 0x0F0F0F0FUL;
2128 s = (s | (s << 2U)) & 0x33333333UL;
2129 s = (s | (s << 1U)) & 0x55555555UL;
2131 return (f | (s << 1U));
2134#if ETL_USING_64BIT_TYPES
2139 template <
typename T>
2144 uint64_t f = uint64_t(first);
2145 uint64_t s = uint64_t(second);
2147 f = (f | (f << 16U)) & 0x0000FFFF0000FFFFULL;
2148 f = (f | (f << 8U)) & 0x00FF00FF00FF00FFULL;
2149 f = (f | (f << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2150 f = (f | (f << 2U)) & 0x3333333333333333ULL;
2151 f = (f | (f << 1U)) & 0x5555555555555555ULL;
2153 s = (s | (s << 16U)) & 0x0000FFFF0000FFFFULL;
2154 s = (s | (s << 8U)) & 0x00FF00FF00FF00FFULL;
2155 s = (s | (s << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2156 s = (s | (s << 2U)) & 0x3333333333333333ULL;
2157 s = (s | (s << 1U)) & 0x5555555555555555ULL;
2159 return (f | (s << 1U));
2167 template <
typename T>
2168 ETL_CONSTEXPR14
typename etl::enable_if< etl::is_integral<T>::value && etl::is_signed<T>::value, T>
::type binary_interleave(T first, T second)
2177 template <
typename T>
2178 ETL_CONSTEXPR
typename etl::enable_if<etl::is_integral<T>::value,
bool>
::type is_odd(T value)
2180 return ((
static_cast<typename etl::make_unsigned<T>::type
>(value) & 1U) != 0U);
2187 template <
typename T>
2188 ETL_CONSTEXPR
typename etl::enable_if<etl::is_integral<T>::value,
bool>
::type is_even(T value)
2190 return ((
static_cast<typename etl::make_unsigned<T>::type
>(value) & 1U) == 0U);
2194 template <
typename T,
size_t NBits>
2201 static ETL_CONSTANT T value =
static_cast<T
>(etl::max_value_for_nbits<NBits>::value);
2204 template <
typename T,
size_t NBits>
2205 ETL_CONSTANT T lsb_mask<T, NBits>::value;
2208 template <
typename T,
size_t NBits>
2209 ETL_CONSTEXPR T make_lsb_mask()
2213 return lsb_mask<T, NBits>::value;
2217 template <
typename T>
2218 ETL_CONSTEXPR T make_lsb_mask(
size_t nbits)
2220 typedef typename etl::make_unsigned<T>::type
type;
2222 return (nbits == 0U) ?
static_cast<T
>(0) : static_cast<T>(static_cast<
type>(~0) >> (
etl::integral_limits<
type>::bits - nbits));
2226 template <
typename T,
size_t NBits>
2236 template <
typename T,
size_t NBits>
2237 ETL_CONSTANT T msb_mask<T, NBits>::value;
2240 template <
typename T>
2241 ETL_CONSTEXPR T make_msb_mask(
size_t nbits)
2243 typedef typename etl::make_unsigned<T>::type
type;
2245 return (nbits == 0U) ?
static_cast<T
>(0) : static_cast<T>(static_cast<
type>(~0) << (
etl::
integral_limits<
type>::bits - nbits));
2249 template <
typename T,
size_t NBits>
2250 ETL_CONSTEXPR T make_msb_mask()
2254 return msb_mask<T, NBits>::value;
2261 template <
typename T>
2265 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value)
const ETL_NOEXCEPT
2267 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2277 template <
typename T>
2281 ETL_CONSTEXPR
explicit binary_and(T parameter_) ETL_NOEXCEPT
2282 : parameter(parameter_)
2287 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value)
const ETL_NOEXCEPT
2289 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2291 return value & parameter;
2303 template <
typename T>
2307 ETL_CONSTEXPR
explicit binary_or(T parameter_) ETL_NOEXCEPT
2308 : parameter(parameter_)
2313 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value)
const ETL_NOEXCEPT
2315 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2317 return value | parameter;
2329 template <
typename T>
2333 ETL_CONSTEXPR
explicit binary_xor(T parameter_) ETL_NOEXCEPT
2334 : parameter(parameter_)
2339 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value)
const ETL_NOEXCEPT
2341 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2343 return value ^ parameter;
ETL_CONSTEXPR14 uint_least8_t first_set_bit_position(T value)
Definition binary.h:2051
ETL_CONSTEXPR T binary_merge(T first, T second, T mask)
Definition binary.h:461
binary_constant
Definition binary.h:2356
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_trailing_ones(T value)
Definition binary.h:1377
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type reverse_bits(T value)
Definition binary.h:542
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type gray_to_binary(T value)
Definition binary.h:828
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type parity(T value)
Definition binary.h:1020
ETL_CONSTEXPR14 T rotate_left(T value)
Definition binary.h:117
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint32_t >::type binary_interleave(T first, T second)
Definition binary.h:2116
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_even(T value)
Definition binary.h:2188
ETL_CONSTEXPR14 uint_least8_t first_clear_bit_position(T value)
Definition binary.h:2062
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_bits(T value)
Definition binary.h:918
ETL_CONSTEXPR14 TReturn fold_bits(TValue value)
Definition binary.h:243
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_trailing_zeros(T value)
Definition binary.h:1133
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_leading_ones(T value)
Definition binary.h:1859
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_leading_zeros(T value)
Definition binary.h:1615
ETL_CONSTEXPR TResult binary_fill()
Definition binary.h:394
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type reverse_bytes(T value)
Definition binary.h:745
ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
Definition binary.h:273
bit_constant
Definition binary.h:2620
ETL_CONSTEXPR T binary_to_gray(T value)
Definition binary.h:231
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_odd(T value)
Definition binary.h:2178
ETL_CONSTEXPR14 uint_least8_t first_bit_position(bool state, T value)
Definition binary.h:2074
ETL_CONSTEXPR14 T rotate_right(T value)
Definition binary.h:162
Definition for non-zero NBits.
Definition binary.h:91
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition exception.h:59
Definition integral_limits.h:518
bitset_ext
Definition absolute.h:40
unary_function
Definition functional.h:182