31#ifndef ETL_BINARY_INCLUDED
32#define ETL_BINARY_INCLUDED
42#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>
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 ^= value & mask;
261 folded_value ^= value & mask;
271 template <
typename TReturn,
size_t NBits,
typename TValue>
274 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
275 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
280 signed value : NBits;
283 return (s.value = value);
292 template <
typename TReturn,
size_t NBits,
size_t SHIFT,
typename TValue>
295 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
296 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
302 signed value : NBits;
305 return (s.value = (value >> SHIFT));
313 template <
typename TReturn,
typename TValue>
316 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
317 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
321 TReturn mask = TReturn(1) << (NBits - 1);
322 value = value & TValue((TValue(1) << NBits) - 1);
324 return TReturn((value ^ mask) - mask);
333 template <
typename TReturn,
typename TValue>
334 ETL_CONSTEXPR14 TReturn
sign_extend(TValue value,
size_t NBits,
size_t SHIFT)
336 ETL_STATIC_ASSERT(etl::is_integral<TValue>::value,
"TValue not an integral type");
337 ETL_STATIC_ASSERT(etl::is_integral<TReturn>::value,
"TReturn not an integral type");
341 TReturn mask = TReturn(1) << (NBits - 1);
342 value = (value >> SHIFT) & TValue((TValue(1) << NBits) - 1);
344 return TReturn((value ^ mask) - mask);
352 template <
size_t POSITION>
355 typedef typename etl::smallest_uint_for_bits<POSITION + 1U>::type value_type;
356 static ETL_CONSTANT value_type value = value_type(1) << POSITION;
359 template <
size_t POSITION>
360 ETL_CONSTANT
typename bit<POSITION>::value_type bit<POSITION>::value;
363 template <
size_t POSITION>
364 using bit_t =
typename etl::bit<POSITION>::value_type;
368 template <
size_t POSITION>
369 inline constexpr bit_t<POSITION> bit_v = etl::bit<POSITION>::value;
376 template <
typename TResult,
typename TValue>
379 ETL_STATIC_ASSERT(
sizeof(TResult) >=
sizeof(TValue),
"Result must be at least as large as the fill value");
384 return TResult(unsigned_v_t(value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
391 template <
typename TResult,
typename TValue, TValue Value>
394 ETL_STATIC_ASSERT(
sizeof(TResult) >=
sizeof(TValue),
"Result must be at least as large as the fill value");
399 return TResult(unsigned_v_t(Value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
402#if ETL_USING_8BIT_TYPES
407 template <
typename TValue>
408 ETL_CONSTEXPR14
bool has_zero_byte(TValue value)
412 const unsigned_t temp = unsigned_t(~((((unsigned_t(value) & mask) + mask) | unsigned_t(value)) | mask));
421 template <
typename TValue, TValue Value>
422 ETL_CONSTEXPR14
bool has_zero_byte()
424 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
426 const unsigned_t temp = unsigned_t(~((((unsigned_t(Value) & mask) + mask) | unsigned_t(Value)) | mask));
435 template <
typename TValue>
436 ETL_CONSTEXPR14
bool has_byte_n(TValue value, uint8_t n)
445 template <
typename TValue, TValue Value>
446 ETL_CONSTEXPR14
bool has_byte_n(TValue value)
458 template <
typename T>
461 return second ^ ((second ^ first) & mask);
470 template <
typename T, T MASK>
473 return second ^ ((second ^ first) & MASK);
480 template <
typename T, T Value>
483#if ETL_USING_8BIT_TYPES
488 template <
typename T>
493 value = ((value & 0xAAU) >> 1U) | ((value & 0x55U) << 1U);
494 value = ((value & 0xCCU) >> 2U) | ((value & 0x33U) << 2U);
495 value = (value >> 4U) | ((value & 0x0FU) << 4U);
501 template <u
int8_t Value>
506 static ETL_CONSTANT uint8_t value1 = uint8_t(((Value & 0xAAU) >> 1U) | ((Value & 0x55U) << 1U));
507 static ETL_CONSTANT uint8_t value2 = uint8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
511 static ETL_CONSTANT uint8_t value = uint8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
514 template <u
int8_t Value>
515 ETL_CONSTANT uint8_t reverse_bits_const<uint8_t, Value>::value;
518 template <
int8_t Value>
519 struct reverse_bits_const<int8_t, Value>
523 static ETL_CONSTANT int8_t value1 = int8_t(((Value & 0xAAU) >> 1U) | ((Value & 0x55U) << 1U));
524 static ETL_CONSTANT int8_t value2 = int8_t(((value1 & 0xCCU) >> 2U) | ((value1 & 0x33U) << 2U));
528 static ETL_CONSTANT int8_t value = int8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
531 template <
int8_t Value>
539 template <
typename T>
541 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(((Value & 0xAAAAU) >> 1U) | ((Value & 0x5555U) << 1U));
577 static ETL_CONSTANT int16_t value2 = int16_t(((value1 & 0xCCCCU) >> 2U) | ((value1 & 0x3333U) << 2U));
578 static ETL_CONSTANT int16_t value3 = int16_t(((value2 & 0xF0F0U) >> 4U) | ((value2 & 0x0F0FU) << 4U));
582 static ETL_CONSTANT int16_t value = int16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
585 template <
int16_t Value>
592 template <
typename T>
597 value = ((value & 0xAAAAAAAAUL) >> 1U) | ((value & 0x55555555UL) << 1U);
598 value = ((value & 0xCCCCCCCCUL) >> 2U) | ((value & 0x33333333UL) << 2U);
599 value = ((value & 0xF0F0F0F0UL) >> 4U) | ((value & 0x0F0F0F0FUL) << 4U);
600 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
601 value = (value >> 16U) | ((value & 0xFFFFU) << 16U);
607 template <u
int32_t Value>
612 static ETL_CONSTANT uint32_t value1 = uint32_t(((Value & 0xAAAAAAAAUL) >> 1U) | ((Value & 0x55555555UL) << 1U));
613 static ETL_CONSTANT uint32_t value2 = uint32_t(((value1 & 0xCCCCCCCCUL) >> 2U) | ((value1 & 0x33333333UL) << 2U));
614 static ETL_CONSTANT uint32_t value3 = uint32_t(((value2 & 0xF0F0F0F0UL) >> 4U) | ((value2 & 0x0F0F0F0FUL) << 4U));
615 static ETL_CONSTANT uint32_t value4 = uint32_t(((value3 & 0xFF00FF00UL) >> 8U) | ((value3 & 0x00FF00FFUL) << 8U));
619 static ETL_CONSTANT uint32_t value = uint32_t((value4 >> 16U) | ((value4 & 0xFFFFU) << 16U));
622 template <u
int32_t Value>
626 template <
int32_t Value>
631 static ETL_CONSTANT int32_t value1 = int32_t(((Value & 0xAAAAAAAAUL) >> 1U) | ((Value & 0x55555555UL) << 1U));
632 static ETL_CONSTANT int32_t value2 = int32_t(((value1 & 0xCCCCCCCCUL) >> 2U) | ((value1 & 0x33333333UL) << 2U));
633 static ETL_CONSTANT int32_t value3 = int32_t(((value2 & 0xF0F0F0F0UL) >> 4U) | ((value2 & 0x0F0F0F0FUL) << 4U));
634 static ETL_CONSTANT int32_t value4 = int32_t(((value3 & 0xFF00FF00UL) >> 8U) | ((value3 & 0x00FF00FFUL) << 8U));
638 static ETL_CONSTANT int32_t value = int32_t((value4 >> 16U) | ((value4 & 0xFFFFUL) << 16U));
641 template <
int32_t Value>
644#if ETL_USING_64BIT_TYPES
649 template <
typename T>
654 value = ((value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((value & 0x5555555555555555ULL) << 1U);
655 value = ((value & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value & 0x3333333333333333ULL) << 2U);
656 value = ((value & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value & 0x0F0F0F0F0F0F0F0FULL) << 4U);
657 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
658 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
659 value = (value >> 32U) | ((value & 0xFFFFFFFFULL) << 32U);
665 template <u
int64_t Value>
670 static ETL_CONSTANT uint64_t value1 = uint64_t(((Value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((Value & 0x5555555555555555ULL) << 1U));
671 static ETL_CONSTANT uint64_t value2 = uint64_t(((value1 & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value1 & 0x3333333333333333ULL) << 2U));
672 static ETL_CONSTANT uint64_t value3 = uint64_t(((value2 & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value2 & 0x0F0F0F0F0F0F0F0FULL) << 4U));
673 static ETL_CONSTANT uint64_t value4 = uint64_t(((value3 & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value3 & 0x00FF00FF00FF00FFULL) << 8U));
674 static ETL_CONSTANT uint64_t value5 = uint64_t(((value4 & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value4 & 0x0000FFFF0000FFFFULL) << 16U));
678 static ETL_CONSTANT uint64_t value = uint64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
681 template <u
int64_t Value>
685 template <
int64_t Value>
690 static ETL_CONSTANT int64_t value1 = int64_t(((Value & 0xAAAAAAAAAAAAAAAAULL) >> 1U) | ((Value & 0x5555555555555555ULL) << 1U));
691 static ETL_CONSTANT int64_t value2 = int64_t(((value1 & 0xCCCCCCCCCCCCCCCCULL) >> 2U) | ((value1 & 0x3333333333333333ULL) << 2U));
692 static ETL_CONSTANT int64_t value3 = int64_t(((value2 & 0xF0F0F0F0F0F0F0F0ULL) >> 4U) | ((value2 & 0x0F0F0F0F0F0F0F0FULL) << 4U));
693 static ETL_CONSTANT int64_t value4 = int64_t(((value3 & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value3 & 0x00FF00FF00FF00FFULL) << 8U));
694 static ETL_CONSTANT int64_t value5 = int64_t(((value4 & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value4 & 0x0000FFFF0000FFFFULL) << 16U));
698 static ETL_CONSTANT int64_t value = int64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
701 template <
int64_t Value>
709 template <
typename T>
716 return static_cast<T
>(
reverse_bits(
static_cast<unsigned_t
>(value)));
723#if ETL_USING_8BIT_TYPES
724 template <
typename T>
737 template <
typename T>
739 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
742#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
743 return std::byteswap(value);
745 return (value >> 8U) | (value << 8U);
753 template <
typename T>
758#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
759 return std::byteswap(value);
761 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
762 value = (value >> 16U) | (value << 16U);
768#if ETL_USING_64BIT_TYPES
773 template <
typename T>
778#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
779 return std::byteswap(value);
781 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
782 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
783 value = (value >> 32U) | (value << 32U);
794 template <
typename T>
801 return static_cast<T
>(
reverse_bytes(
static_cast<unsigned_t
>(value)));
804#if ETL_USING_8BIT_TYPES
809 template <
typename T>
814 value ^= (value >> 4U);
815 value ^= (value >> 2U);
816 value ^= (value >> 1U);
826 template <
typename T>
828 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), T>::type
831 value ^= (value >> 8U);
832 value ^= (value >> 4U);
833 value ^= (value >> 2U);
834 value ^= (value >> 1U);
843 template <
typename T>
848 value ^= (value >> 16U);
849 value ^= (value >> 8U);
850 value ^= (value >> 4U);
851 value ^= (value >> 2U);
852 value ^= (value >> 1U);
857#if ETL_USING_64BIT_TYPES
862 template <
typename T>
867 value ^= (value >> 32U);
868 value ^= (value >> 16U);
869 value ^= (value >> 8U);
870 value ^= (value >> 4U);
871 value ^= (value >> 2U);
872 value ^= (value >> 1U);
882 template <
typename T>
889 return static_cast<T
>(
gray_to_binary(
static_cast<unsigned_t
>(value)));
892#if ETL_USING_8BIT_TYPES
897 template <
typename T>
902#if ETL_CPP23_SUPPORTED && ETL_USING_STL
903 return std::popcount(value);
907 count = value - ((value >> 1U) & 0x55U);
908 count = ((count >> 2U) & 0x33U) + (count & 0x33U);
909 count = ((count >> 4U) + count) & 0x0FU;
911 return uint_least8_t(count);
920 template <
typename T>
922 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
925#if ETL_USING_CPP20 && ETL_USING_STL
926 return std::popcount(value);
930 count = value - ((value >> 1U) & 0x5555U);
931 count = ((count >> 2U) & 0x3333U) + (count & 0x3333U);
932 count = ((count >> 4U) + count) & 0x0F0FU;
933 count = ((count >> 8U) + count) & 0x00FFU;
935 return static_cast<uint_least8_t
>(count);
943 template <
typename T>
948#if ETL_USING_CPP20 && ETL_USING_STL
949 return std::popcount(value);
953 count = value - ((value >> 1U) & 0x55555555UL);
954 count = ((count >> 2U) & 0x33333333UL) + (count & 0x33333333UL);
955 count = ((count >> 4U) + count) & 0x0F0F0F0FUL;
956 count = ((count >> 8U) + count) & 0x00FF00FFUL;
957 count = ((count >> 16U) + count) & 0x0000FFUL;
959 return static_cast<uint_least8_t
>(count);
963#if ETL_USING_64BIT_TYPES
968 template <
typename T>
973#if ETL_USING_CPP20 && ETL_USING_STL
974 return std::popcount(value);
978 count = value - ((value >> 1U) & 0x5555555555555555ULL);
979 count = ((count >> 2U) & 0x3333333333333333ULL) + (count & 0x3333333333333333ULL);
980 count = ((count >> 4U) + count) & 0x0F0F0F0F0F0F0F0FULL;
981 count = ((count >> 8U) + count) & 0x00FF00FF00FF00FFULL;
982 count = ((count >> 16U) + count) & 0x0000FFFF0000FFFFULL;
983 count = ((count >> 32U) + count) & 0x00000000FFFFFFFFULL;
985 return static_cast<uint_least8_t
>(count);
994 template <
typename T>
1001 return static_cast<T
>(
count_bits(
static_cast<unsigned_t
>(value)));
1004#if ETL_USING_8BIT_TYPES
1009 template <
typename T>
1014 value ^= value >> 4U;
1016 return (0x6996U >> value) & 1U;
1024 template <
typename T>
1026 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1029 value ^= value >> 8U;
1030 value ^= value >> 4U;
1032 return (0x6996U >> value) & 1U;
1039 template <
typename T>
1044 value ^= value >> 16U;
1045 value ^= value >> 8U;
1046 value ^= value >> 4U;
1048 return (0x6996U >> value) & 1U;
1051#if ETL_USING_64BIT_TYPES
1056 template <
typename T>
1061 value ^= value >> 32U;
1062 value ^= value >> 16U;
1063 value ^= value >> 8U;
1064 value ^= value >> 4U;
1066 return (0x69966996UL >> value) & 1U;
1074 template <
typename T>
1081 return static_cast<T
>(
parity(
static_cast<unsigned_t
>(value)));
1084#if ETL_USING_8BIT_TYPES
1090 template <
typename T>
1095#if ETL_USING_CPP20 && ETL_USING_STL
1096 return std::countr_zero(value);
1098 uint_least8_t count = 0U;
1108 if ((value & 0xFU) == 0U)
1114 if ((value & 0x3U) == 0U)
1120 if ((value & 0x1U) == 0U)
1126 count -= (value & 0x1U);
1139 template <
typename T>
1141 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1144#if ETL_USING_CPP20 && ETL_USING_STL
1145 return std::countr_zero(value);
1147 uint_least8_t count = 0U;
1157 if ((value & 0xFFU) == 0U)
1163 if ((value & 0xFU) == 0U)
1169 if ((value & 0x3U) == 0U)
1175 if ((value & 0x1U) == 0U)
1181 count -= value & 0x1U;
1193 template <
typename T>
1198#if ETL_USING_CPP20 && ETL_USING_STL
1199 return std::countr_zero(value);
1201 uint_least8_t count = 0U;
1211 if ((value & 0xFFFFUL) == 0UL)
1217 if ((value & 0xFFUL) == 0UL)
1223 if ((value & 0xFUL) == 0UL)
1229 if ((value & 0x3UL) == 0UL)
1235 if ((value & 0x1U) == 0U)
1241 count -= value & 0x1UL;
1248#if ETL_USING_64BIT_TYPES
1254 template <
typename T>
1259#if ETL_USING_CPP20 && ETL_USING_STL
1260 return std::countr_zero(value);
1262 uint_least8_t count = 0U;
1272 if ((value & 0xFFFFFFFFULL) == 0ULL)
1278 if ((value & 0xFFFFULL) == 0ULL)
1284 if ((value & 0xFFULL) == 0ULL)
1290 if ((value & 0xFULL) == 0ULL)
1296 if ((value & 0x3ULL) == 0ULL)
1302 if ((value & 0x1U) == 0U)
1308 count -= value & 0x1ULL;
1320 template <
typename T>
1330#if ETL_USING_8BIT_TYPES
1336 template <
typename T>
1341#if ETL_USING_CPP20 && ETL_USING_STL
1342 return std::countr_one(value);
1344 uint_least8_t count = 0U;
1346 if ((value & 0x1U) == 0x0U)
1354 if ((value & 0xFU) == 0xFU)
1360 if ((value & 0x3U) == 0x3U)
1366 if ((value & 0x1U) == 0x1U)
1372 count -= ((value & 0x1U) == 0x0U);
1385 template <
typename T>
1387 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1390#if ETL_USING_CPP20 && ETL_USING_STL
1391 return std::countr_one(value);
1393 uint_least8_t count = 0U;
1395 if ((value & 0x1U) == 0x0U)
1403 if ((value & 0xFFU) == 0xFFU)
1409 if ((value & 0xFU) == 0xFU)
1415 if ((value & 0x3U) == 0x3U)
1421 if ((value & 0x1U) == 0x1U)
1427 count -= ((value & 0x1U) == 0x0U);
1439 template <
typename T>
1444#if ETL_USING_CPP20 && ETL_USING_STL
1445 return std::countr_one(value);
1447 uint_least8_t count = 0U;
1449 if ((value & 0x1UL) == 0x0UL)
1457 if ((value & 0xFFFFUL) == 0xFFFFUL)
1463 if ((value & 0xFFUL) == 0xFFUL)
1469 if ((value & 0xFUL) == 0xFUL)
1475 if ((value & 0x3UL) == 0x3UL)
1481 if ((value & 0x1UL) == 0x1UL)
1487 count -= ((value & 0x1UL) == 0x0UL);
1494#if ETL_USING_64BIT_TYPES
1500 template <
typename T>
1505#if ETL_USING_CPP20 && ETL_USING_STL
1506 return std::countr_one(value);
1508 uint_least8_t count = 0U;
1510 if ((value & 0x1ULL) == 0x0ULL)
1518 if ((value & 0xFFFFULL) == 0xFFFFULL)
1524 if ((value & 0xFFULL) == 0xFFULL)
1530 if ((value & 0xFULL) == 0xFULL)
1536 if ((value & 0x3ULL) == 0x3ULL)
1542 if ((value & 0x1ULL) == 0x1ULL)
1548 count -= ((value & 0x1ULL) == 0x0ULL);
1560 template <
typename T>
1570#if ETL_USING_8BIT_TYPES
1576 template <
typename T>
1581#if ETL_USING_CPP20 && ETL_USING_STL
1582 return std::countl_zero(value);
1584 uint_least8_t count = 0U;
1594 if ((value & 0xF0U) == 0U)
1600 if ((value & 0xC0U) == 0U)
1606 if ((value & 0x80U) == 0U)
1612 count -= ((value & 0x80U) == 0x80U);
1625 template <
typename T>
1627 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1630#if ETL_USING_CPP20 && ETL_USING_STL
1631 return std::countl_zero(value);
1633 uint_least8_t count = 0U;
1635 if (value & 0x8000U)
1643 if ((value & 0xFF00U) == 0U)
1649 if ((value & 0xF000U) == 0U)
1655 if ((value & 0xC000U) == 0U)
1661 if ((value & 0x8000U) == 0U)
1667 count -= ((value & 0x8000U) == 0x8000U);
1679 template <
typename T>
1684#if ETL_USING_CPP20 && ETL_USING_STL
1685 return std::countl_zero(value);
1687 uint_least8_t count = 0U;
1689 if (value & 0x80000000UL)
1697 if ((value & 0xFFFF0000UL) == 0U)
1703 if ((value & 0xFF000000UL) == 0U)
1709 if ((value & 0xF0000000UL) == 0U)
1715 if ((value & 0xC0000000UL) == 0U)
1721 if ((value & 0x80000000UL) == 0U)
1727 count -= ((value & 0x80000000UL) == 0x80000000UL);
1734#if ETL_USING_64BIT_TYPES
1740 template <
typename T>
1745#if ETL_USING_CPP20 && ETL_USING_STL
1746 return std::countl_zero(value);
1748 uint_least8_t count = 0U;
1750 if (value & 0x8000000000000000ULL)
1758 if ((value & 0xFFFFFFFFF0000000ULL) == 0U)
1764 if ((value & 0xFFFF000000000000ULL) == 0U)
1770 if ((value & 0xFF00000000000000ULL) == 0U)
1776 if ((value & 0xF000000000000000ULL) == 0U)
1782 if ((value & 0xC000000000000000ULL) == 0U)
1788 if ((value & 0x8000000000000000ULL) == 0U)
1794 count -= ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL);
1806 template <
typename T>
1816#if ETL_USING_8BIT_TYPES
1822 template <
typename T>
1827#if ETL_USING_CPP20 && ETL_USING_STL
1828 return std::countl_one(value);
1830 uint_least8_t count = 0U;
1832 if ((value & 0x80U) == 0U)
1840 if ((value & 0xF0U) == 0xF0U)
1846 if ((value & 0xC0U) == 0xC0U)
1852 if ((value & 0x80U) == 0x80U)
1858 count -= ((value & 0x80U) == 0x0U);
1871 template <
typename T>
1873 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint_least8_t>::type
1876#if ETL_USING_CPP20 && ETL_USING_STL
1877 return std::countl_one(value);
1879 uint_least8_t count = 0U;
1881 if ((value & 0x8000U) == 0U)
1889 if ((value & 0xFF00U) == 0xFF00U)
1895 if ((value & 0xF000U) == 0xF000U)
1901 if ((value & 0xC000U) == 0xC000U)
1907 if ((value & 0x8000U) == 0x8000U)
1913 count -= ((value & 0x8000U) == 0U);
1925 template <
typename T>
1930#if ETL_USING_CPP20 && ETL_USING_STL
1931 return std::countl_one(value);
1933 uint_least8_t count = 0U;
1935 if ((value & 0x80000000UL) == 0UL)
1943 if ((value & 0xFFFF0000UL) == 0xFFFF0000UL)
1949 if ((value & 0xFF000000UL) == 0xFF000000UL)
1955 if ((value & 0xF0000000UL) == 0xF0000000UL)
1961 if ((value & 0xC0000000UL) == 0xC0000000UL)
1967 if ((value & 0x80000000UL) == 0x80000000UL)
1973 count -= ((value & 0x80000000UL) == 0UL);
1980#if ETL_USING_64BIT_TYPES
1986 template <
typename T>
1991#if ETL_USING_CPP20 && ETL_USING_STL
1992 return std::countl_one(value);
1994 uint_least8_t count = 0U;
1996 if ((value & 0x8000000000000000ULL) == 0ULL)
2004 if ((value & 0xFFFFFFFF00000000ULL) == 0xFFFFFFFF00000000ULL)
2010 if ((value & 0xFFFF000000000000ULL) == 0xFFFF000000000000ULL)
2016 if ((value & 0xFF00000000000000ULL) == 0xFF00000000000000ULL)
2022 if ((value & 0xF000000000000000ULL) == 0xF000000000000000ULL)
2028 if ((value & 0xC000000000000000ULL) == 0xC000000000000000ULL)
2034 if ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL)
2040 count -= ((value & 0x8000000000000000ULL) == 0ULL);
2052 template <
typename T>
2067 template <
typename T>
2078 template <
typename T>
2090 template <
typename T>
2101#if ETL_USING_8BIT_TYPES
2106 template <
typename T>
2111 uint16_t f = uint16_t(first);
2112 uint16_t s = uint16_t(second);
2114 f = (f | (f << 4U)) & 0x0F0FU;
2115 f = (f | (f << 2U)) & 0x3333U;
2116 f = (f | (f << 1U)) & 0x5555U;
2118 s = (s | (s << 4U)) & 0x0F0FU;
2119 s = (s | (s << 2U)) & 0x3333U;
2120 s = (s | (s << 1U)) & 0x5555U;
2122 return (f | (s << 1U));
2130 template <
typename T>
2132 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint32_t>::type
2135 uint32_t f = uint32_t(first);
2136 uint32_t s = uint32_t(second);
2138 f = (f | (f << 8U)) & 0x00FF00FFUL;
2139 f = (f | (f << 4U)) & 0x0F0F0F0FUL;
2140 f = (f | (f << 2U)) & 0x33333333UL;
2141 f = (f | (f << 1U)) & 0x55555555UL;
2143 s = (s | (s << 8U)) & 0x00FF00FFUL;
2144 s = (s | (s << 4U)) & 0x0F0F0F0FUL;
2145 s = (s | (s << 2U)) & 0x33333333UL;
2146 s = (s | (s << 1U)) & 0x55555555UL;
2148 return (f | (s << 1U));
2151#if ETL_USING_64BIT_TYPES
2156 template <
typename T>
2161 uint64_t f = uint64_t(first);
2162 uint64_t s = uint64_t(second);
2164 f = (f | (f << 16U)) & 0x0000FFFF0000FFFFULL;
2165 f = (f | (f << 8U)) & 0x00FF00FF00FF00FFULL;
2166 f = (f | (f << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2167 f = (f | (f << 2U)) & 0x3333333333333333ULL;
2168 f = (f | (f << 1U)) & 0x5555555555555555ULL;
2170 s = (s | (s << 16U)) & 0x0000FFFF0000FFFFULL;
2171 s = (s | (s << 8U)) & 0x00FF00FF00FF00FFULL;
2172 s = (s | (s << 4U)) & 0x0F0F0F0F0F0F0F0FULL;
2173 s = (s | (s << 2U)) & 0x3333333333333333ULL;
2174 s = (s | (s << 1U)) & 0x5555555555555555ULL;
2176 return (f | (s << 1U));
2184 template <
typename T>
2196 template <
typename T>
2207 template <
typename T>
2215 template <
typename T,
size_t NBits>
2222 static ETL_CONSTANT T value =
static_cast<T
>(etl::max_value_for_nbits<NBits>::value);
2225 template <
typename T,
size_t NBits>
2226 ETL_CONSTANT T lsb_mask<T, NBits>::value;
2229 template <
typename T,
size_t NBits>
2230 ETL_CONSTEXPR T make_lsb_mask()
2234 return lsb_mask<T, NBits>::value;
2238 template <
typename T>
2239 ETL_CONSTEXPR T make_lsb_mask(
size_t nbits)
2243 return (nbits == 0U) ?
static_cast<T
>(0)
2244 : static_cast<T>(static_cast<type>(~0) >> (
etl::integral_limits<type>::bits - nbits));
2248 template <
typename T,
size_t NBits>
2258 template <
typename T,
size_t NBits>
2259 ETL_CONSTANT T msb_mask<T, NBits>::value;
2262 template <
typename T>
2263 ETL_CONSTEXPR T make_msb_mask(
size_t nbits)
2267 return (nbits == 0U) ?
static_cast<T
>(0)
2272 template <
typename T,
size_t NBits>
2273 ETL_CONSTEXPR T make_msb_mask()
2277 return msb_mask<T, NBits>::value;
2284 template <
typename T>
2290 T operator ()(T value)
const ETL_NOEXCEPT
2292 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2302 template <
typename T>
2307 explicit binary_and(T parameter_) ETL_NOEXCEPT
2308 : parameter(parameter_)
2315 T operator ()(T value)
const ETL_NOEXCEPT
2317 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2319 return value & parameter;
2331 template <
typename T>
2336 explicit binary_or(T parameter_) ETL_NOEXCEPT
2337 : parameter(parameter_)
2344 T operator ()(T value)
const ETL_NOEXCEPT
2346 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2348 return value | parameter;
2360 template <
typename T>
2365 explicit binary_xor(T parameter_) ETL_NOEXCEPT
2366 : parameter(parameter_)
2373 T operator ()(T value)
const ETL_NOEXCEPT
2375 ETL_STATIC_ASSERT(etl::is_integral<T>::value,
"Not an integral type");
2377 return value ^ parameter;
ETL_CONSTEXPR14 uint_least8_t first_set_bit_position(T value)
Definition binary.h:2068
ETL_CONSTEXPR T binary_merge(T first, T second, T mask)
Definition binary.h:459
binary_constant
Definition binary.h:2390
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:1388
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:829
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:1027
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:2133
ETL_CONSTEXPR etl::enable_if< etl::is_integral< T >::value, bool >::type is_even(T value)
Definition binary.h:2209
ETL_CONSTEXPR14 uint_least8_t first_clear_bit_position(T value)
Definition binary.h:2079
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:923
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:1142
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:1874
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:1628
ETL_CONSTEXPR TResult binary_fill()
Definition binary.h:392
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:740
ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
Definition binary.h:272
bit_constant
Definition binary.h:2654
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:2198
ETL_CONSTEXPR14 uint_least8_t first_bit_position(bool state, T value)
Definition binary.h:2091
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:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
Definition integral_limits.h:516
enable_if
Definition type_traits_generator.h:1254
is_unsigned
Definition type_traits_generator.h:1084
make_signed
Definition type_traits_generator.h:1234
make_unsigned
Definition type_traits_generator.h:1244
bitset_ext
Definition absolute.h:39
unary_function
Definition functional.h:151