Embedded Template Library 1.0
Loading...
Searching...
No Matches
binary.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2015 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_BINARY_INCLUDED
32#define ETL_BINARY_INCLUDED
33
37
38#include "platform.h"
39#include "error_handler.h"
40#include "exception.h"
41#include "functional.h"
42#include "integral_limits.h"
43#include "limits.h"
44#include "log.h"
45#include "power.h"
46#include "smallest.h"
47#include "static_assert.h"
48#include "type_traits.h"
49
50#if ETL_USING_CPP20 && ETL_USING_STL
51 #include <bit>
52#endif
53
54namespace etl
55{
56 //***************************************************************************
59 //***************************************************************************
60 class binary_exception : public etl::exception
61 {
62 public:
63
64 binary_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
65 : exception(reason_, file_name_, line_number_)
66 {
67 }
68 };
69
70 //***************************************************************************
73 //***************************************************************************
74 class binary_out_of_range : public etl::binary_exception
75 {
76 public:
77
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_)
80 {
81 }
82 };
83
84 //***************************************************************************
87 //***************************************************************************
89 template <size_t NBits>
91 {
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;
94 };
95
97 template <>
99 {
100 typedef etl::smallest_uint_for_bits<0>::type value_type;
101 static ETL_CONSTANT value_type value = 0;
102 };
103
104 template <size_t NBits>
105 ETL_CONSTANT typename max_value_for_nbits<NBits>::value_type max_value_for_nbits<NBits>::value;
106
107#if ETL_USING_CPP17
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;
110#endif
111
112 //***************************************************************************
115 //***************************************************************************
116 template <typename T>
117 ETL_CONSTEXPR14 T rotate_left(T value)
118 {
119#if ETL_USING_CPP20 && ETL_USING_STL
120 return std::rotl(value, 1);
121#else
122 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
123
124 ETL_CONSTANT size_t SHIFT = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits - 1U;
125
126 return (value << 1U) | (value >> SHIFT);
127#endif
128 }
129
130 //***************************************************************************
133 //***************************************************************************
134 template <typename T>
135 ETL_CONSTEXPR14 T rotate_left(T value, size_t distance)
136 {
137#if ETL_USING_CPP20 && ETL_USING_STL
138 return std::rotl(value, distance);
139#else
140 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
141
142 ETL_CONSTANT size_t BITS = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits;
143 distance %= BITS;
144 const size_t SHIFT = BITS - distance;
145
146 if (SHIFT == BITS)
147 {
148 return value;
149 }
150 else
151 {
152 return (value << distance) | (value >> SHIFT);
153 }
154#endif
155 }
156
157 //***************************************************************************
160 //***************************************************************************
161 template <typename T>
162 ETL_CONSTEXPR14 T rotate_right(T value)
163 {
164#if ETL_USING_CPP20 && ETL_USING_STL
165 return std::rotr(value, 1);
166#else
167 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
168
169 ETL_CONSTANT size_t SHIFT = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits - 1U;
170
171 return (value >> 1U) | (value << SHIFT);
172#endif
173 }
174
175 //***************************************************************************
178 //***************************************************************************
179 template <typename T>
180 ETL_CONSTEXPR14 T rotate_right(T value, size_t distance)
181 {
182#if ETL_USING_CPP20 && ETL_USING_STL
183 return std::rotr(value, distance);
184#else
185 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
186
187 ETL_CONSTANT size_t BITS = etl::integral_limits<typename etl::make_unsigned<T>::type>::bits;
188 distance %= BITS;
189 const size_t SHIFT = BITS - distance;
190
191 if (SHIFT == BITS)
192 {
193 return value;
194 }
195 else
196 {
197 return (value >> distance) | (value << SHIFT);
198 }
199#endif
200 }
201
202 //***************************************************************************
206 //***************************************************************************
207 template <typename T>
208 ETL_CONSTEXPR14 T rotate(T value, typename etl::make_signed<size_t>::type distance)
209 {
210 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
211
212 T result = T();
213
214 if (distance > 0)
215 {
216 result = rotate_left(value, size_t(distance));
217 }
218 else
219 {
220 result = rotate_right(value, size_t(-distance));
221 }
222
223 return result;
224 }
225
226 //***************************************************************************
229 //***************************************************************************
230 template <typename T>
231 ETL_CONSTEXPR T binary_to_gray(T value)
232 {
233 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
234
235 return (value >> 1U) ^ value;
236 }
237
238 //***************************************************************************
241 //***************************************************************************
242 template <typename TReturn, size_t NBits, typename TValue>
243 ETL_CONSTEXPR14 TReturn fold_bits(TValue value)
244 {
245 ETL_STATIC_ASSERT(integral_limits<TReturn>::bits >= NBits, "Return type too small to hold result");
246
247 ETL_CONSTANT TValue mask = etl::power<2, NBits>::value - 1U;
248 ETL_CONSTANT size_t shift = NBits;
249
250 // Fold the value down to fit the width.
251 TReturn folded_value = 0;
252
253 // Keep shifting down and XORing the lower bits.
254 while (value >= etl::max_value_for_nbits<NBits>::value)
255 {
256 folded_value ^= static_cast<TReturn>(value & mask);
257 value >>= shift;
258 }
259
260 // Fold the remaining bits.
261 folded_value ^= static_cast<TReturn>(value & mask);
262
263 return folded_value;
264 }
265
266 //***************************************************************************
271 //***************************************************************************
272 template <typename TReturn, size_t NBits, typename TValue>
273 ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
274 {
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");
277 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<TReturn>::bits, "NBits too large for return type");
278
279 struct S
280 {
281 signed value : NBits;
282 } s = {0};
283
284 return (s.value = static_cast<int>(static_cast<TReturn>(value)));
285 }
286
287 //***************************************************************************
292 //***************************************************************************
293 template <typename TReturn, size_t NBits, size_t SHIFT, typename TValue>
294 ETL_CONSTEXPR14 TReturn sign_extend(TValue value)
295 {
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");
298 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<TReturn>::bits, "NBits too large for return type");
299 ETL_STATIC_ASSERT(SHIFT <= etl::integral_limits<TReturn>::bits, "SHIFT too large");
300
301 struct S
302 {
303 signed value : NBits;
304 } s = {0};
305
306 return (s.value = static_cast<int>(static_cast<TReturn>(value >> SHIFT)));
307 }
308
309 //***************************************************************************
314 //***************************************************************************
315 template <typename TReturn, typename TValue>
316 ETL_CONSTEXPR14 TReturn sign_extend(TValue value, size_t NBits)
317 {
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");
320
322
323 TReturn mask = TReturn(1) << (NBits - 1);
324 value = value & TValue((TValue(1) << NBits) - 1);
325
326 return static_cast<TReturn>(static_cast<TReturn>(value ^ static_cast<TValue>(mask)) - mask);
327 }
328
329 //***************************************************************************
334 //***************************************************************************
335 template <typename TReturn, typename TValue>
336 ETL_CONSTEXPR14 TReturn sign_extend(TValue value, size_t NBits, size_t SHIFT)
337 {
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");
340
342
343 TReturn mask = TReturn(1) << (NBits - 1);
344 value = (value >> SHIFT) & TValue((TValue(1) << NBits) - 1);
345
346 return static_cast<TReturn>(static_cast<TReturn>(value ^ static_cast<TValue>(mask)) - mask);
347 }
348
349 //***************************************************************************
353 //***************************************************************************
354 template <size_t POSITION>
355 struct bit
356 {
357 typedef typename etl::smallest_uint_for_bits<POSITION + 1U>::type value_type;
358 static ETL_CONSTANT value_type value = value_type(1) << POSITION;
359 };
360
361 template <size_t POSITION>
362 ETL_CONSTANT typename bit<POSITION>::value_type bit<POSITION>::value;
363
364#if ETL_USING_CPP11
365 template <size_t POSITION>
366 using bit_t = typename etl::bit<POSITION>::value_type;
367#endif
368
369#if ETL_USING_CPP17
370 template <size_t POSITION>
371 inline constexpr bit_t<POSITION> bit_v = etl::bit<POSITION>::value;
372#endif
373
374 //***************************************************************************
377 //***************************************************************************
378 template <typename TResult, typename TValue>
379 ETL_CONSTEXPR TResult binary_fill(TValue value)
380 {
381 ETL_STATIC_ASSERT(sizeof(TResult) >= sizeof(TValue), "Result must be at least as large as the fill value");
382
383 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
384 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
385
386 return TResult(unsigned_v_t(value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
387 }
388
389 //***************************************************************************
392 //***************************************************************************
393 template <typename TResult, typename TValue, TValue Value>
394 ETL_CONSTEXPR TResult binary_fill()
395 {
396 ETL_STATIC_ASSERT(sizeof(TResult) >= sizeof(TValue), "Result must be at least as large as the fill value");
397
398 typedef typename etl::make_unsigned<TResult>::type unsigned_r_t;
399 typedef typename etl::make_unsigned<TValue>::type unsigned_v_t;
400
401 return TResult(unsigned_v_t(Value) * (unsigned_r_t(~unsigned_r_t(0U)) / unsigned_v_t(~unsigned_v_t(0U))));
402 }
403
404#if ETL_USING_8BIT_TYPES
405 //***************************************************************************
408 //***************************************************************************
409 template <typename TValue>
410 ETL_CONSTEXPR14 bool has_zero_byte(TValue value)
411 {
412 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
413 ETL_CONSTEXPR14 const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
414 const unsigned_t temp = unsigned_t(~((((unsigned_t(value) & mask) + mask) | unsigned_t(value)) | mask));
415
416 return (temp != 0U);
417 }
418
419 //***************************************************************************
422 //***************************************************************************
423 template <typename TValue, TValue Value>
424 ETL_CONSTEXPR14 bool has_zero_byte()
425 {
426 typedef typename etl::make_unsigned<TValue>::type unsigned_t;
427 ETL_CONSTEXPR14 const unsigned_t mask = etl::binary_fill<unsigned_t, uint8_t>(0x7FU);
428 const unsigned_t temp = unsigned_t(~((((unsigned_t(Value) & mask) + mask) | unsigned_t(Value)) | mask));
429
430 return (temp != 0U);
431 }
432
433 //***************************************************************************
436 //***************************************************************************
437 template <typename TValue>
438 ETL_CONSTEXPR14 bool has_byte_n(TValue value, uint8_t n)
439 {
440 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(n)));
441 }
442
443 //***************************************************************************
446 //***************************************************************************
447 template <typename TValue, TValue Value>
448 ETL_CONSTEXPR14 bool has_byte_n(TValue value)
449 {
450 return etl::has_zero_byte(TValue(value ^ etl::binary_fill<TValue, uint8_t>(Value)));
451 }
452#endif
453
454 //***************************************************************************
459 //***************************************************************************
460 template <typename T>
461 ETL_CONSTEXPR T binary_merge(T first, T second, T mask)
462 {
463 return second ^ ((second ^ first) & mask);
464 }
465
466 //***************************************************************************
471 //***************************************************************************
472 template <typename T, T MASK>
473 ETL_CONSTEXPR T binary_merge(T first, T second)
474 {
475 return second ^ ((second ^ first) & MASK);
476 }
477
478 //***************************************************************************
481 //***************************************************************************
482 template <typename T, T Value>
484
485#if ETL_USING_8BIT_TYPES
486 //***************************************************************************
489 //***************************************************************************
490 template <typename T>
491 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), T>::type
492 reverse_bits(T value)
493 {
494 value = ((value & 0xAAU) >> 1U) | ((value & 0x55U) << 1U);
495 value = ((value & 0xCCU) >> 2U) | ((value & 0x33U) << 2U);
496 value = (value >> 4U) | ((value & 0x0FU) << 4U);
497
498 return value;
499 }
500
501 //***********************************
502 template <uint8_t Value>
503 struct reverse_bits_const<uint8_t, Value>
504 {
505 private:
506
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));
509
510 public:
511
512 static ETL_CONSTANT uint8_t value = uint8_t((value2 >> 4U) | ((value2 & 0x0FU) << 4U));
513 };
514
515 template <uint8_t Value>
516 ETL_CONSTANT uint8_t reverse_bits_const<uint8_t, Value>::value;
517
518 //***********************************
519 template <int8_t Value>
520 struct reverse_bits_const<int8_t, Value>
521 {
522 private:
523
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));
526
527 public:
528
529 static ETL_CONSTANT int8_t value = int8_t((static_cast<uint8_t>(value2) >> 4U) | ((static_cast<uint8_t>(value2) & 0x0FU) << 4U));
530 };
531
532 template <int8_t Value>
534#endif
535
536 //***************************************************************************
539 //***************************************************************************
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
543 {
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);
548
549 return value;
550 }
551
552 //***********************************
553 template <uint16_t Value>
554 struct reverse_bits_const<uint16_t, Value>
555 {
556 private:
557
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));
561
562 public:
563
564 static ETL_CONSTANT uint16_t value = uint16_t((value3 >> 8U) | ((value3 & 0xFFU) << 8U));
565 };
566
567 template <uint16_t Value>
568 ETL_CONSTANT uint16_t reverse_bits_const<uint16_t, Value>::value;
569
570 //***********************************
571 template <int16_t Value>
572 struct reverse_bits_const<int16_t, Value>
573 {
574 private:
575
576 static ETL_CONSTANT int16_t value1 = int16_t(((static_cast<uint16_t>(Value) & 0xAAAAU) >> 1U) | ((static_cast<uint16_t>(Value) & 0x5555U) << 1U));
577 static
578 ETL_CONSTANT int16_t value2 = int16_t(((static_cast<uint16_t>(value1) & 0xCCCCU) >> 2U) | ((static_cast<uint16_t>(value1) & 0x3333U) << 2U));
579 static
580 ETL_CONSTANT int16_t value3 = int16_t(((static_cast<uint16_t>(value2) & 0xF0F0U) >> 4U) | ((static_cast<uint16_t>(value2) & 0x0F0FU) << 4U));
581
582 public:
583
584 static ETL_CONSTANT int16_t value = int16_t((static_cast<uint16_t>(value3) >> 8U) | ((static_cast<uint16_t>(value3) & 0xFFU) << 8U));
585 };
586
587 template <int16_t Value>
589
590 //***************************************************************************
593 //***************************************************************************
594 template <typename T>
595 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), T>::type
597 {
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);
603
604 return value;
605 }
606
607 //***********************************
608 template <uint32_t Value>
609 struct reverse_bits_const<uint32_t, Value>
610 {
611 private:
612
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));
617
618 public:
619
620 static ETL_CONSTANT uint32_t value = uint32_t((value4 >> 16U) | ((value4 & 0xFFFFU) << 16U));
621 };
622
623 template <uint32_t Value>
624 ETL_CONSTANT uint32_t reverse_bits_const<uint32_t, Value>::value;
625
626 //***********************************
627 template <int32_t Value>
628 struct reverse_bits_const<int32_t, Value>
629 {
630 private:
631
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));
640
641 public:
642
643 static ETL_CONSTANT int32_t value = int32_t((static_cast<uint32_t>(value4) >> 16U) | ((static_cast<uint32_t>(value4) & 0xFFFFUL) << 16U));
644 };
645
646 template <int32_t Value>
648
649#if ETL_USING_64BIT_TYPES
650 //***************************************************************************
653 //***************************************************************************
654 template <typename T>
655 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), T>::type
657 {
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);
664
665 return value;
666 }
667
668 //***********************************
669 template <uint64_t Value>
670 struct reverse_bits_const<uint64_t, Value>
671 {
672 private:
673
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));
679
680 public:
681
682 static ETL_CONSTANT uint64_t value = uint64_t((value5 >> 32U) | ((value5 & 0xFFFFFFFFULL) << 32U));
683 };
684
685 template <uint64_t Value>
686 ETL_CONSTANT uint64_t reverse_bits_const<uint64_t, Value>::value;
687
688 //***********************************
689 template <int64_t Value>
690 struct reverse_bits_const<int64_t, Value>
691 {
692 private:
693
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));
704
705 public:
706
707 static ETL_CONSTANT int64_t value = int64_t((static_cast<uint64_t>(value5) >> 32U) | ((static_cast<uint64_t>(value5) & 0xFFFFFFFFULL) << 32U));
708 };
709
710 template <int64_t Value>
712#endif
713
714 //***************************************************************************
717 //***************************************************************************
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)
720 {
721 typedef typename etl::make_unsigned<T>::type unsigned_t;
722
723 return static_cast<T>(reverse_bits(static_cast<unsigned_t>(value)));
724 }
725
726 //***************************************************************************
729 //***************************************************************************
730#if ETL_USING_8BIT_TYPES
731 template <typename T>
732 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), T>::type
733 reverse_bytes(T value)
734 {
735 return value;
736 }
737#endif
738
739 //***************************************************************************
742 //***************************************************************************
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
746 {
747#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
748 return std::byteswap(value);
749#else
750 return (value >> 8U) | (value << 8U);
751#endif
752 }
753
754 //***************************************************************************
757 //***************************************************************************
758 template <typename T>
759 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), T>::type
761 {
762#if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
763 return std::byteswap(value);
764#else
765 value = ((value & 0xFF00FF00UL) >> 8U) | ((value & 0x00FF00FFUL) << 8U);
766 value = (value >> 16U) | (value << 16U);
767
768 return value;
769#endif
770 }
771
772#if ETL_USING_64BIT_TYPES
773 //***************************************************************************
776 //***************************************************************************
777 template <typename T>
778 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), T>::type
780 {
781 #if ETL_CPP23_SUPPORTED && ETL_USING_STL && ETL_HAS_STD_BYTESWAP
782 return std::byteswap(value);
783 #else
784 value = ((value & 0xFF00FF00FF00FF00ULL) >> 8U) | ((value & 0x00FF00FF00FF00FFULL) << 8U);
785 value = ((value & 0xFFFF0000FFFF0000ULL) >> 16U) | ((value & 0x0000FFFF0000FFFFULL) << 16U);
786 value = (value >> 32U) | (value << 32U);
787
788 return value;
789 #endif
790 }
791#endif
792
793 //***************************************************************************
796 //***************************************************************************
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)
799 {
800 typedef typename etl::make_unsigned<T>::type unsigned_t;
801
802 return static_cast<T>(reverse_bytes(static_cast<unsigned_t>(value)));
803 }
804
805#if ETL_USING_8BIT_TYPES
806 //***************************************************************************
809 //***************************************************************************
810 template <typename T>
811 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), T>::type
812 gray_to_binary(T value)
813 {
814 value ^= (value >> 4U);
815 value ^= (value >> 2U);
816 value ^= (value >> 1U);
817
818 return value;
819 }
820#endif
821
822 //***************************************************************************
825 //***************************************************************************
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
829 {
830 value ^= (value >> 8U);
831 value ^= (value >> 4U);
832 value ^= (value >> 2U);
833 value ^= (value >> 1U);
834
835 return value;
836 }
837
838 //***************************************************************************
841 //***************************************************************************
842 template <typename T>
843 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), T>::type
845 {
846 value ^= (value >> 16U);
847 value ^= (value >> 8U);
848 value ^= (value >> 4U);
849 value ^= (value >> 2U);
850 value ^= (value >> 1U);
851
852 return value;
853 }
854
855#if ETL_USING_64BIT_TYPES
856 //***************************************************************************
859 //***************************************************************************
860 template <typename T>
861 ETL_CONSTEXPR14 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), T>::type
863 {
864 value ^= (value >> 32U);
865 value ^= (value >> 16U);
866 value ^= (value >> 8U);
867 value ^= (value >> 4U);
868 value ^= (value >> 2U);
869 value ^= (value >> 1U);
870
871 return value;
872 }
873#endif
874
875 //***************************************************************************
878 //***************************************************************************
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)
881 {
882 typedef typename etl::make_unsigned<T>::type unsigned_t;
883
884 return static_cast<T>(gray_to_binary(static_cast<unsigned_t>(value)));
885 }
886
887#if ETL_USING_8BIT_TYPES
888 //***************************************************************************
891 //***************************************************************************
892 template <typename T>
893 ETL_CONSTEXPR14
894 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), uint_least8_t>::type
895 count_bits(T value)
896 {
897 #if ETL_CPP23_SUPPORTED && ETL_USING_STL
898 return std::popcount(value);
899 #else
900 uint32_t count = 0U;
901
902 count = value - ((value >> 1U) & 0x55U);
903 count = ((count >> 2U) & 0x33U) + (count & 0x33U);
904 count = ((count >> 4U) + count) & 0x0FU;
905
906 return uint_least8_t(count);
907 #endif
908 }
909#endif
910
911 //***************************************************************************
914 //***************************************************************************
915 template <typename T>
916 ETL_CONSTEXPR14
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
918 count_bits(T value)
919 {
920#if ETL_USING_CPP20 && ETL_USING_STL
921 return std::popcount(value);
922#else
923 uint32_t count = 0U;
924
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;
929
930 return static_cast<uint_least8_t>(count);
931#endif
932 }
933
934 //***************************************************************************
937 //***************************************************************************
938 template <typename T>
939 ETL_CONSTEXPR14
940 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), uint_least8_t>::type
941 count_bits(T value)
942 {
943#if ETL_USING_CPP20 && ETL_USING_STL
944 return std::popcount(value);
945#else
946 uint32_t count = 0U;
947
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;
953
954 return static_cast<uint_least8_t>(count);
955#endif
956 }
957
958#if ETL_USING_64BIT_TYPES
959 //***************************************************************************
962 //***************************************************************************
963 template <typename T>
964 ETL_CONSTEXPR14
965 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), uint_least8_t>::type
966 count_bits(T value)
967 {
968 #if ETL_USING_CPP20 && ETL_USING_STL
969 return std::popcount(value);
970 #else
971 uint64_t count = 0U;
972
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;
979
980 return static_cast<uint_least8_t>(count);
981 #endif
982 }
983#endif
984
985 //***************************************************************************
988 //***************************************************************************
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)
991 {
992 typedef typename etl::make_unsigned<T>::type unsigned_t;
993
994 return static_cast<uint_least8_t>(count_bits(static_cast<unsigned_t>(value)));
995 }
996
997#if ETL_USING_8BIT_TYPES
998 //***************************************************************************
1001 //***************************************************************************
1002 template <typename T>
1003 ETL_CONSTEXPR14
1004 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), uint_least8_t>::type
1005 parity(T value)
1006 {
1007 value ^= value >> 4U;
1008 value &= 0x0FU;
1009 return (0x6996U >> value) & 1U;
1010 }
1011#endif
1012
1013 //***************************************************************************
1016 //***************************************************************************
1017 template <typename T>
1018 ETL_CONSTEXPR14
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
1020 parity(T value)
1021 {
1022 value ^= value >> 8U;
1023 value ^= value >> 4U;
1024 value &= 0x0FU;
1025 return (0x6996U >> value) & 1U;
1026 }
1027
1028 //***************************************************************************
1031 //***************************************************************************
1032 template <typename T>
1033 ETL_CONSTEXPR14
1034 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), uint_least8_t>::type
1035 parity(T value)
1036 {
1037 value ^= value >> 16U;
1038 value ^= value >> 8U;
1039 value ^= value >> 4U;
1040 value &= 0x0FU;
1041 return (0x6996U >> value) & 1U;
1042 }
1043
1044#if ETL_USING_64BIT_TYPES
1045 //***************************************************************************
1048 //***************************************************************************
1049 template <typename T>
1050 ETL_CONSTEXPR14
1051 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), uint_least8_t>::type
1052 parity(T value)
1053 {
1054 value ^= value >> 32U;
1055 value ^= value >> 16U;
1056 value ^= value >> 8U;
1057 value ^= value >> 4U;
1058 value &= 0x0FU;
1059 return (0x69966996UL >> value) & 1U;
1060 }
1061#endif
1062
1063 //***************************************************************************
1066 //***************************************************************************
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)
1069 {
1070 typedef typename etl::make_unsigned<T>::type unsigned_t;
1071
1072 return static_cast<uint_least8_t>(parity(static_cast<unsigned_t>(value)));
1073 }
1074
1075#if ETL_USING_8BIT_TYPES
1076 //***************************************************************************
1080 //***************************************************************************
1081 template <typename T>
1082 ETL_CONSTEXPR14
1083 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), uint_least8_t>::type
1084 count_trailing_zeros(T value)
1085 {
1086 #if ETL_USING_CPP20 && ETL_USING_STL
1087 return std::countr_zero(value);
1088 #else
1089 uint_least8_t count = 0U;
1090
1091 if (value & 0x1U)
1092 {
1093 count = 0U;
1094 }
1095 else
1096 {
1097 count = 1U;
1098
1099 if ((value & 0xFU) == 0U)
1100 {
1101 value >>= 4U;
1102 count += 4U;
1103 }
1104
1105 if ((value & 0x3U) == 0U)
1106 {
1107 value >>= 2U;
1108 count += 2U;
1109 }
1110
1111 if ((value & 0x1U) == 0U)
1112 {
1113 value >>= 1U;
1114 count += 1U;
1115 }
1116
1117 count -= (value & 0x1U);
1118 }
1119
1120 return count;
1121 #endif
1122 }
1123#endif
1124
1125 //***************************************************************************
1129 //***************************************************************************
1130 template <typename T>
1131 ETL_CONSTEXPR14
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
1134 {
1135#if ETL_USING_CPP20 && ETL_USING_STL
1136 return std::countr_zero(value);
1137#else
1138 uint_least8_t count = 0U;
1139
1140 if (value & 0x1U)
1141 {
1142 count = 0U;
1143 }
1144 else
1145 {
1146 count = 1U;
1147
1148 if ((value & 0xFFU) == 0U)
1149 {
1150 value >>= 8U;
1151 count += 8U;
1152 }
1153
1154 if ((value & 0xFU) == 0U)
1155 {
1156 value >>= 4U;
1157 count += 4U;
1158 }
1159
1160 if ((value & 0x3U) == 0U)
1161 {
1162 value >>= 2U;
1163 count += 2U;
1164 }
1165
1166 if ((value & 0x1U) == 0U)
1167 {
1168 value >>= 1U;
1169 count += 1U;
1170 }
1171
1172 count -= value & 0x1U;
1173 }
1174
1175 return count;
1176#endif
1177 }
1178
1179 //***************************************************************************
1183 //***************************************************************************
1184 template <typename T>
1185 ETL_CONSTEXPR14
1186 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), uint_least8_t>::type
1188 {
1189#if ETL_USING_CPP20 && ETL_USING_STL
1190 return std::countr_zero(value);
1191#else
1192 uint_least8_t count = 0U;
1193
1194 if (value & 0x1UL)
1195 {
1196 count = 0U;
1197 }
1198 else
1199 {
1200 count = 1U;
1201
1202 if ((value & 0xFFFFUL) == 0UL)
1203 {
1204 value >>= 16U;
1205 count += 16U;
1206 }
1207
1208 if ((value & 0xFFUL) == 0UL)
1209 {
1210 value >>= 8U;
1211 count += 8U;
1212 }
1213
1214 if ((value & 0xFUL) == 0UL)
1215 {
1216 value >>= 4U;
1217 count += 4U;
1218 }
1219
1220 if ((value & 0x3UL) == 0UL)
1221 {
1222 value >>= 2U;
1223 count += 2U;
1224 }
1225
1226 if ((value & 0x1U) == 0U)
1227 {
1228 value >>= 1U;
1229 count += 1U;
1230 }
1231
1232 count -= value & 0x1UL;
1233 }
1234
1235 return count;
1236#endif
1237 }
1238
1239#if ETL_USING_64BIT_TYPES
1240 //***************************************************************************
1244 //***************************************************************************
1245 template <typename T>
1246 ETL_CONSTEXPR14
1247 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), uint_least8_t>::type
1249 {
1250 #if ETL_USING_CPP20 && ETL_USING_STL
1251 return std::countr_zero(value);
1252 #else
1253 uint_least8_t count = 0U;
1254
1255 if (value & 0x1ULL)
1256 {
1257 count = 0U;
1258 }
1259 else
1260 {
1261 count = 1U;
1262
1263 if ((value & 0xFFFFFFFFULL) == 0ULL)
1264 {
1265 value >>= 32U;
1266 count += 32U;
1267 }
1268
1269 if ((value & 0xFFFFULL) == 0ULL)
1270 {
1271 value >>= 16U;
1272 count += 16U;
1273 }
1274
1275 if ((value & 0xFFULL) == 0ULL)
1276 {
1277 value >>= 8U;
1278 count += 8U;
1279 }
1280
1281 if ((value & 0xFULL) == 0ULL)
1282 {
1283 value >>= 4U;
1284 count += 4U;
1285 }
1286
1287 if ((value & 0x3ULL) == 0ULL)
1288 {
1289 value >>= 2U;
1290 count += 2U;
1291 }
1292
1293 if ((value & 0x1U) == 0U)
1294 {
1295 value >>= 1U;
1296 count += 1U;
1297 }
1298
1299 count -= value & 0x1ULL;
1300 }
1301
1302 return count;
1303 #endif
1304 }
1305#endif
1306
1307 //***************************************************************************
1310 //***************************************************************************
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)
1313 {
1314 typedef typename etl::make_unsigned<T>::type unsigned_t;
1315
1316 return static_cast<T>(count_trailing_zeros(static_cast<unsigned_t>(value)));
1317 }
1318
1319#if ETL_USING_8BIT_TYPES
1320 //***************************************************************************
1324 //***************************************************************************
1325 template <typename T>
1326 ETL_CONSTEXPR14
1327 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), uint_least8_t>::type
1328 count_trailing_ones(T value)
1329 {
1330 #if ETL_USING_CPP20 && ETL_USING_STL
1331 return std::countr_one(value);
1332 #else
1333 uint_least8_t count = 0U;
1334
1335 if ((value & 0x1U) == 0x0U)
1336 {
1337 count = 0U;
1338 }
1339 else
1340 {
1341 count = 1U;
1342
1343 if ((value & 0xFU) == 0xFU)
1344 {
1345 value >>= 4U;
1346 count += 4U;
1347 }
1348
1349 if ((value & 0x3U) == 0x3U)
1350 {
1351 value >>= 2U;
1352 count += 2U;
1353 }
1354
1355 if ((value & 0x1U) == 0x1U)
1356 {
1357 value >>= 1U;
1358 count += 1U;
1359 }
1360
1361 count -= ((value & 0x1U) == 0x0U);
1362 }
1363
1364 return count;
1365 #endif
1366 }
1367#endif
1368
1369 //***************************************************************************
1373 //***************************************************************************
1374 template <typename T>
1375 ETL_CONSTEXPR14
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
1378 {
1379#if ETL_USING_CPP20 && ETL_USING_STL
1380 return std::countr_one(value);
1381#else
1382 uint_least8_t count = 0U;
1383
1384 if ((value & 0x1U) == 0x0U)
1385 {
1386 count = 0U;
1387 }
1388 else
1389 {
1390 count = 1U;
1391
1392 if ((value & 0xFFU) == 0xFFU)
1393 {
1394 value >>= 8U;
1395 count += 8U;
1396 }
1397
1398 if ((value & 0xFU) == 0xFU)
1399 {
1400 value >>= 4U;
1401 count += 4U;
1402 }
1403
1404 if ((value & 0x3U) == 0x3U)
1405 {
1406 value >>= 2U;
1407 count += 2U;
1408 }
1409
1410 if ((value & 0x1U) == 0x1U)
1411 {
1412 value >>= 1U;
1413 count += 1U;
1414 }
1415
1416 count -= ((value & 0x1U) == 0x0U);
1417 }
1418
1419 return count;
1420#endif
1421 }
1422
1423 //***************************************************************************
1427 //***************************************************************************
1428 template <typename T>
1429 ETL_CONSTEXPR14
1430 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), uint_least8_t>::type
1432 {
1433#if ETL_USING_CPP20 && ETL_USING_STL
1434 return std::countr_one(value);
1435#else
1436 uint_least8_t count = 0U;
1437
1438 if ((value & 0x1UL) == 0x0UL)
1439 {
1440 count = 0U;
1441 }
1442 else
1443 {
1444 count = 1U;
1445
1446 if ((value & 0xFFFFUL) == 0xFFFFUL)
1447 {
1448 value >>= 16U;
1449 count += 16U;
1450 }
1451
1452 if ((value & 0xFFUL) == 0xFFUL)
1453 {
1454 value >>= 8U;
1455 count += 8U;
1456 }
1457
1458 if ((value & 0xFUL) == 0xFUL)
1459 {
1460 value >>= 4U;
1461 count += 4U;
1462 }
1463
1464 if ((value & 0x3UL) == 0x3UL)
1465 {
1466 value >>= 2U;
1467 count += 2U;
1468 }
1469
1470 if ((value & 0x1UL) == 0x1UL)
1471 {
1472 value >>= 1U;
1473 count += 1U;
1474 }
1475
1476 count -= ((value & 0x1UL) == 0x0UL);
1477 }
1478
1479 return count;
1480#endif
1481 }
1482
1483#if ETL_USING_64BIT_TYPES
1484 //***************************************************************************
1488 //***************************************************************************
1489 template <typename T>
1490 ETL_CONSTEXPR14
1491 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), uint_least8_t>::type
1493 {
1494 #if ETL_USING_CPP20 && ETL_USING_STL
1495 return std::countr_one(value);
1496 #else
1497 uint_least8_t count = 0U;
1498
1499 if ((value & 0x1ULL) == 0x0ULL)
1500 {
1501 count = 0U;
1502 }
1503 else
1504 {
1505 count = 1U;
1506
1507 if ((value & 0xFFFFULL) == 0xFFFFULL)
1508 {
1509 value >>= 16U;
1510 count += 16U;
1511 }
1512
1513 if ((value & 0xFFULL) == 0xFFULL)
1514 {
1515 value >>= 8U;
1516 count += 8U;
1517 }
1518
1519 if ((value & 0xFULL) == 0xFULL)
1520 {
1521 value >>= 4U;
1522 count += 4U;
1523 }
1524
1525 if ((value & 0x3ULL) == 0x3ULL)
1526 {
1527 value >>= 2U;
1528 count += 2U;
1529 }
1530
1531 if ((value & 0x1ULL) == 0x1ULL)
1532 {
1533 value >>= 1U;
1534 count += 1U;
1535 }
1536
1537 count -= ((value & 0x1ULL) == 0x0ULL);
1538 }
1539
1540 return count;
1541 #endif
1542 }
1543#endif
1544
1545 //***************************************************************************
1548 //***************************************************************************
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)
1551 {
1552 typedef typename etl::make_unsigned<T>::type unsigned_t;
1553
1554 return static_cast<T>(count_trailing_ones(static_cast<unsigned_t>(value)));
1555 }
1556
1557#if ETL_USING_8BIT_TYPES
1558 //***************************************************************************
1562 //***************************************************************************
1563 template <typename T>
1564 ETL_CONSTEXPR14
1565 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), uint_least8_t>::type
1566 count_leading_zeros(T value)
1567 {
1568 #if ETL_USING_CPP20 && ETL_USING_STL
1569 return std::countl_zero(value);
1570 #else
1571 uint_least8_t count = 0U;
1572
1573 if (value & 0x80U)
1574 {
1575 count = 0U;
1576 }
1577 else
1578 {
1579 count = 1U;
1580
1581 if ((value & 0xF0U) == 0U)
1582 {
1583 value <<= 4U;
1584 count += 4U;
1585 }
1586
1587 if ((value & 0xC0U) == 0U)
1588 {
1589 value <<= 2U;
1590 count += 2U;
1591 }
1592
1593 if ((value & 0x80U) == 0U)
1594 {
1595 value <<= 1U;
1596 count += 1U;
1597 }
1598
1599 count -= ((value & 0x80U) == 0x80U);
1600 }
1601
1602 return count;
1603 #endif
1604 }
1605#endif
1606
1607 //***************************************************************************
1611 //***************************************************************************
1612 template <typename T>
1613 ETL_CONSTEXPR14
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
1616 {
1617#if ETL_USING_CPP20 && ETL_USING_STL
1618 return std::countl_zero(value);
1619#else
1620 uint_least8_t count = 0U;
1621
1622 if (value & 0x8000U)
1623 {
1624 count = 0U;
1625 }
1626 else
1627 {
1628 count = 1U;
1629
1630 if ((value & 0xFF00U) == 0U)
1631 {
1632 value <<= 8U;
1633 count += 8U;
1634 }
1635
1636 if ((value & 0xF000U) == 0U)
1637 {
1638 value <<= 4U;
1639 count += 4U;
1640 }
1641
1642 if ((value & 0xC000U) == 0U)
1643 {
1644 value <<= 2U;
1645 count += 2U;
1646 }
1647
1648 if ((value & 0x8000U) == 0U)
1649 {
1650 value <<= 1U;
1651 count += 1U;
1652 }
1653
1654 count -= ((value & 0x8000U) == 0x8000U);
1655 }
1656
1657 return count;
1658#endif
1659 }
1660
1661 //***************************************************************************
1665 //***************************************************************************
1666 template <typename T>
1667 ETL_CONSTEXPR14
1668 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), uint_least8_t>::type
1670 {
1671#if ETL_USING_CPP20 && ETL_USING_STL
1672 return std::countl_zero(value);
1673#else
1674 uint_least8_t count = 0U;
1675
1676 if (value & 0x80000000UL)
1677 {
1678 count = 0U;
1679 }
1680 else
1681 {
1682 count = 1U;
1683
1684 if ((value & 0xFFFF0000UL) == 0U)
1685 {
1686 value <<= 16U;
1687 count += 16U;
1688 }
1689
1690 if ((value & 0xFF000000UL) == 0U)
1691 {
1692 value <<= 8U;
1693 count += 8U;
1694 }
1695
1696 if ((value & 0xF0000000UL) == 0U)
1697 {
1698 value <<= 4U;
1699 count += 4U;
1700 }
1701
1702 if ((value & 0xC0000000UL) == 0U)
1703 {
1704 value <<= 2U;
1705 count += 2U;
1706 }
1707
1708 if ((value & 0x80000000UL) == 0U)
1709 {
1710 value <<= 1U;
1711 count += 1U;
1712 }
1713
1714 count -= ((value & 0x80000000UL) == 0x80000000UL);
1715 }
1716
1717 return count;
1718#endif
1719 }
1720
1721#if ETL_USING_64BIT_TYPES
1722 //***************************************************************************
1726 //***************************************************************************
1727 template <typename T>
1728 ETL_CONSTEXPR14
1729 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), uint_least8_t>::type
1731 {
1732 #if ETL_USING_CPP20 && ETL_USING_STL
1733 return std::countl_zero(value);
1734 #else
1735 uint_least8_t count = 0U;
1736
1737 if (value & 0x8000000000000000ULL)
1738 {
1739 count = 0U;
1740 }
1741 else
1742 {
1743 count = 1U;
1744
1745 if ((value & 0xFFFFFFFFF0000000ULL) == 0U)
1746 {
1747 value <<= 32U;
1748 count += 32U;
1749 }
1750
1751 if ((value & 0xFFFF000000000000ULL) == 0U)
1752 {
1753 value <<= 16U;
1754 count += 16U;
1755 }
1756
1757 if ((value & 0xFF00000000000000ULL) == 0U)
1758 {
1759 value <<= 8U;
1760 count += 8U;
1761 }
1762
1763 if ((value & 0xF000000000000000ULL) == 0U)
1764 {
1765 value <<= 4U;
1766 count += 4U;
1767 }
1768
1769 if ((value & 0xC000000000000000ULL) == 0U)
1770 {
1771 value <<= 2U;
1772 count += 2U;
1773 }
1774
1775 if ((value & 0x8000000000000000ULL) == 0U)
1776 {
1777 value <<= 1U;
1778 count += 1U;
1779 }
1780
1781 count -= ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL);
1782 }
1783
1784 return count;
1785 #endif
1786 }
1787#endif
1788
1789 //***************************************************************************
1792 //***************************************************************************
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)
1795 {
1796 typedef typename etl::make_unsigned<T>::type unsigned_t;
1797
1798 return static_cast<T>(count_trailing_ones(static_cast<unsigned_t>(value)));
1799 }
1800
1801#if ETL_USING_8BIT_TYPES
1802 //***************************************************************************
1806 //***************************************************************************
1807 template <typename T>
1808 ETL_CONSTEXPR14
1809 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), uint_least8_t>::type
1810 count_leading_ones(T value)
1811 {
1812 #if ETL_USING_CPP20 && ETL_USING_STL
1813 return std::countl_one(value);
1814 #else
1815 uint_least8_t count = 0U;
1816
1817 if ((value & 0x80U) == 0U)
1818 {
1819 count = 0U;
1820 }
1821 else
1822 {
1823 count = 1U;
1824
1825 if ((value & 0xF0U) == 0xF0U)
1826 {
1827 value <<= 4U;
1828 count += 4U;
1829 }
1830
1831 if ((value & 0xC0U) == 0xC0U)
1832 {
1833 value <<= 2U;
1834 count += 2U;
1835 }
1836
1837 if ((value & 0x80U) == 0x80U)
1838 {
1839 value <<= 1U;
1840 count += 1U;
1841 }
1842
1843 count -= ((value & 0x80U) == 0x0U);
1844 }
1845
1846 return count;
1847 #endif
1848 }
1849#endif
1850
1851 //***************************************************************************
1855 //***************************************************************************
1856 template <typename T>
1857 ETL_CONSTEXPR14
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
1860 {
1861#if ETL_USING_CPP20 && ETL_USING_STL
1862 return std::countl_one(value);
1863#else
1864 uint_least8_t count = 0U;
1865
1866 if ((value & 0x8000U) == 0U)
1867 {
1868 count = 0U;
1869 }
1870 else
1871 {
1872 count = 1U;
1873
1874 if ((value & 0xFF00U) == 0xFF00U)
1875 {
1876 value <<= 8U;
1877 count += 8U;
1878 }
1879
1880 if ((value & 0xF000U) == 0xF000U)
1881 {
1882 value <<= 4U;
1883 count += 4U;
1884 }
1885
1886 if ((value & 0xC000U) == 0xC000U)
1887 {
1888 value <<= 2U;
1889 count += 2U;
1890 }
1891
1892 if ((value & 0x8000U) == 0x8000U)
1893 {
1894 value <<= 1U;
1895 count += 1U;
1896 }
1897
1898 count -= ((value & 0x8000U) == 0U);
1899 }
1900
1901 return count;
1902#endif
1903 }
1904
1905 //***************************************************************************
1909 //***************************************************************************
1910 template <typename T>
1911 ETL_CONSTEXPR14
1912 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), uint_least8_t>::type
1914 {
1915#if ETL_USING_CPP20 && ETL_USING_STL
1916 return std::countl_one(value);
1917#else
1918 uint_least8_t count = 0U;
1919
1920 if ((value & 0x80000000UL) == 0UL)
1921 {
1922 count = 0U;
1923 }
1924 else
1925 {
1926 count = 1U;
1927
1928 if ((value & 0xFFFF0000UL) == 0xFFFF0000UL)
1929 {
1930 value <<= 8U;
1931 count += 8U;
1932 }
1933
1934 if ((value & 0xFF000000UL) == 0xFF000000UL)
1935 {
1936 value <<= 8U;
1937 count += 8U;
1938 }
1939
1940 if ((value & 0xF0000000UL) == 0xF0000000UL)
1941 {
1942 value <<= 4U;
1943 count += 4U;
1944 }
1945
1946 if ((value & 0xC0000000UL) == 0xC0000000UL)
1947 {
1948 value <<= 2U;
1949 count += 2U;
1950 }
1951
1952 if ((value & 0x80000000UL) == 0x80000000UL)
1953 {
1954 value <<= 1U;
1955 count += 1U;
1956 }
1957
1958 count -= ((value & 0x80000000UL) == 0UL);
1959 }
1960
1961 return count;
1962#endif
1963 }
1964
1965#if ETL_USING_64BIT_TYPES
1966 //***************************************************************************
1970 //***************************************************************************
1971 template <typename T>
1972 ETL_CONSTEXPR14
1973 typename etl::enable_if<etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 64U), uint_least8_t>::type
1975 {
1976 #if ETL_USING_CPP20 && ETL_USING_STL
1977 return std::countl_one(value);
1978 #else
1979 uint_least8_t count = 0U;
1980
1981 if ((value & 0x8000000000000000ULL) == 0ULL)
1982 {
1983 count = 0U;
1984 }
1985 else
1986 {
1987 count = 1U;
1988
1989 if ((value & 0xFFFFFFFF00000000ULL) == 0xFFFFFFFF00000000ULL)
1990 {
1991 value <<= 8U;
1992 count += 8U;
1993 }
1994
1995 if ((value & 0xFFFF000000000000ULL) == 0xFFFF000000000000ULL)
1996 {
1997 value <<= 8U;
1998 count += 8U;
1999 }
2000
2001 if ((value & 0xFF00000000000000ULL) == 0xFF00000000000000ULL)
2002 {
2003 value <<= 8U;
2004 count += 8U;
2005 }
2006
2007 if ((value & 0xF000000000000000ULL) == 0xF000000000000000ULL)
2008 {
2009 value <<= 4U;
2010 count += 4U;
2011 }
2012
2013 if ((value & 0xC000000000000000ULL) == 0xC000000000000000ULL)
2014 {
2015 value <<= 2U;
2016 count += 2U;
2017 }
2018
2019 if ((value & 0x8000000000000000ULL) == 0x8000000000000000ULL)
2020 {
2021 value <<= 1U;
2022 count += 1U;
2023 }
2024
2025 count -= ((value & 0x8000000000000000ULL) == 0ULL);
2026 }
2027
2028 return count;
2029 #endif
2030 }
2031#endif
2032
2033 //***************************************************************************
2036 //***************************************************************************
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)
2039 {
2040 typedef typename etl::make_unsigned<T>::type unsigned_t;
2041
2042 return static_cast<T>(count_leading_ones(static_cast<unsigned_t>(value)));
2043 }
2044
2045 //***************************************************************************
2049 //***************************************************************************
2050 template <typename T>
2051 ETL_CONSTEXPR14 uint_least8_t first_set_bit_position(T value)
2052 {
2053 return count_trailing_zeros(value);
2054 }
2055
2056 //***************************************************************************
2060 //***************************************************************************
2061 template <typename T>
2062 ETL_CONSTEXPR14 uint_least8_t first_clear_bit_position(T value)
2063 {
2064 value = ~value;
2065 return count_trailing_zeros(value);
2066 }
2067
2068 //***************************************************************************
2072 //***************************************************************************
2073 template <typename T>
2074 ETL_CONSTEXPR14 uint_least8_t first_bit_position(bool state, T value)
2075 {
2076 if (!state)
2077 {
2078 value = ~value;
2079 }
2080
2081 return count_trailing_zeros(value);
2082 }
2083
2084#if ETL_USING_8BIT_TYPES
2085 //*****************************************************************************
2088 //*****************************************************************************
2089 template <typename T>
2090 ETL_CONSTEXPR14
2091 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 8U), uint16_t>::type
2092 binary_interleave(T first, T second)
2093 {
2094 uint16_t f = uint16_t(first);
2095 uint16_t s = uint16_t(second);
2096
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);
2100
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);
2104
2105 return (f | (s << 1U));
2106 }
2107#endif
2108
2109 //*****************************************************************************
2112 //*****************************************************************************
2113 template <typename T>
2114 ETL_CONSTEXPR14
2115 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 16U), uint32_t>::type
2116 binary_interleave(T first, T second)
2117 {
2118 uint32_t f = uint32_t(first);
2119 uint32_t s = uint32_t(second);
2120
2121 f = (f | (f << 8U)) & 0x00FF00FFUL;
2122 f = (f | (f << 4U)) & 0x0F0F0F0FUL;
2123 f = (f | (f << 2U)) & 0x33333333UL;
2124 f = (f | (f << 1U)) & 0x55555555UL;
2125
2126 s = (s | (s << 8U)) & 0x00FF00FFUL;
2127 s = (s | (s << 4U)) & 0x0F0F0F0FUL;
2128 s = (s | (s << 2U)) & 0x33333333UL;
2129 s = (s | (s << 1U)) & 0x55555555UL;
2130
2131 return (f | (s << 1U));
2132 }
2133
2134#if ETL_USING_64BIT_TYPES
2135 //*****************************************************************************
2138 //*****************************************************************************
2139 template <typename T>
2140 ETL_CONSTEXPR14
2141 typename etl::enable_if< etl::is_integral<T>::value && etl::is_unsigned<T>::value && (etl::integral_limits<T>::bits == 32U), uint64_t>::type
2142 binary_interleave(T first, T second)
2143 {
2144 uint64_t f = uint64_t(first);
2145 uint64_t s = uint64_t(second);
2146
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;
2152
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;
2158
2159 return (f | (s << 1U));
2160 }
2161#endif
2162
2163 //*****************************************************************************
2166 //*****************************************************************************
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)
2169 {
2170 return int64_t(binary_interleave(uint16_t(first), uint16_t(second)));
2171 }
2172
2173 //***************************************************************************
2176 //***************************************************************************
2177 template <typename T>
2178 ETL_CONSTEXPR typename etl::enable_if<etl::is_integral<T>::value, bool>::type is_odd(T value)
2179 {
2180 return ((static_cast<typename etl::make_unsigned<T>::type>(value) & 1U) != 0U);
2181 }
2182
2183 //***************************************************************************
2186 //***************************************************************************
2187 template <typename T>
2188 ETL_CONSTEXPR typename etl::enable_if<etl::is_integral<T>::value, bool>::type is_even(T value)
2189 {
2190 return ((static_cast<typename etl::make_unsigned<T>::type>(value) & 1U) == 0U);
2191 }
2192
2193 //***********************************
2194 template <typename T, size_t NBits>
2196 {
2197 public:
2198
2199 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2200
2201 static ETL_CONSTANT T value = static_cast<T>(etl::max_value_for_nbits<NBits>::value);
2202 };
2203
2204 template <typename T, size_t NBits>
2205 ETL_CONSTANT T lsb_mask<T, NBits>::value;
2206
2207 //***********************************
2208 template <typename T, size_t NBits>
2209 ETL_CONSTEXPR T make_lsb_mask()
2210 {
2211 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2212
2213 return lsb_mask<T, NBits>::value;
2214 }
2215
2216 //***********************************
2217 template <typename T>
2218 ETL_CONSTEXPR T make_lsb_mask(size_t nbits)
2219 {
2220 typedef typename etl::make_unsigned<T>::type type;
2221
2222 return (nbits == 0U) ? static_cast<T>(0) : static_cast<T>(static_cast<type>(~0) >> (etl::integral_limits<type>::bits - nbits));
2223 }
2224
2225 //***********************************
2226 template <typename T, size_t NBits>
2228 {
2229 public:
2230
2231 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2232
2233 static ETL_CONSTANT T value = static_cast<T>(etl::reverse_bits_const<T, lsb_mask<T, NBits>::value>::value);
2234 };
2235
2236 template <typename T, size_t NBits>
2237 ETL_CONSTANT T msb_mask<T, NBits>::value;
2238
2239 //***********************************
2240 template <typename T>
2241 ETL_CONSTEXPR T make_msb_mask(size_t nbits)
2242 {
2243 typedef typename etl::make_unsigned<T>::type type;
2244
2245 return (nbits == 0U) ? static_cast<T>(0) : static_cast<T>(static_cast<type>(~0) << (etl::integral_limits<type>::bits - nbits));
2246 }
2247
2248 //***********************************
2249 template <typename T, size_t NBits>
2250 ETL_CONSTEXPR T make_msb_mask()
2251 {
2252 ETL_STATIC_ASSERT(NBits <= etl::integral_limits<T>::bits, "Mask exceeds type size");
2253
2254 return msb_mask<T, NBits>::value;
2255 }
2256
2257 //***************************************************************************
2260 //***************************************************************************
2261 template <typename T>
2262 struct binary_not : public etl::unary_function<T, T>
2263 {
2264 //***********************************
2265 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value) const ETL_NOEXCEPT
2266 {
2267 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2268
2269 return ~value;
2270 }
2271 };
2272
2273 //***************************************************************************
2276 //***************************************************************************
2277 template <typename T>
2278 struct binary_and : public etl::unary_function<T, T>
2279 {
2280 //***********************************
2281 ETL_CONSTEXPR explicit binary_and(T parameter_) ETL_NOEXCEPT
2282 : parameter(parameter_)
2283 {
2284 }
2285
2286 //***********************************
2287 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value) const ETL_NOEXCEPT
2288 {
2289 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2290
2291 return value & parameter;
2292 }
2293
2294 private:
2295
2296 T parameter;
2297 };
2298
2299 //***************************************************************************
2302 //***************************************************************************
2303 template <typename T>
2304 struct binary_or : public etl::unary_function<T, T>
2305 {
2306 //***********************************
2307 ETL_CONSTEXPR explicit binary_or(T parameter_) ETL_NOEXCEPT
2308 : parameter(parameter_)
2309 {
2310 }
2311
2312 //***********************************
2313 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value) const ETL_NOEXCEPT
2314 {
2315 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2316
2317 return value | parameter;
2318 }
2319
2320 private:
2321
2322 T parameter;
2323 };
2324
2325 //***************************************************************************
2328 //***************************************************************************
2329 template <typename T>
2330 struct binary_xor : public etl::unary_function<T, T>
2331 {
2332 //***********************************
2333 ETL_CONSTEXPR explicit binary_xor(T parameter_) ETL_NOEXCEPT
2334 : parameter(parameter_)
2335 {
2336 }
2337
2338 //***********************************
2339 ETL_NODISCARD ETL_CONSTEXPR T operator()(T value) const ETL_NOEXCEPT
2340 {
2341 ETL_STATIC_ASSERT(etl::is_integral<T>::value, "Not an integral type");
2342
2343 return value ^ parameter;
2344 }
2345
2346 private:
2347
2348 T parameter;
2349 };
2350
2351 //***************************************************************************
2354 //***************************************************************************
2356 {
2357 b00000000 = 0U,
2358 b00000001 = 1U,
2359 b00000010 = 2U,
2360 b00000011 = 3U,
2361 b00000100 = 4U,
2362 b00000101 = 5U,
2363 b00000110 = 6U,
2364 b00000111 = 7U,
2365 b00001000 = 8U,
2366 b00001001 = 9U,
2367 b00001010 = 10U,
2368 b00001011 = 11U,
2369 b00001100 = 12U,
2370 b00001101 = 13U,
2371 b00001110 = 14U,
2372 b00001111 = 15U,
2373 b00010000 = 16U,
2374 b00010001 = 17U,
2375 b00010010 = 18U,
2376 b00010011 = 19U,
2377 b00010100 = 20U,
2378 b00010101 = 21U,
2379 b00010110 = 22U,
2380 b00010111 = 23U,
2381 b00011000 = 24U,
2382 b00011001 = 25U,
2383 b00011010 = 26U,
2384 b00011011 = 27U,
2385 b00011100 = 28U,
2386 b00011101 = 29U,
2387 b00011110 = 30U,
2388 b00011111 = 31U,
2389 b00100000 = 32U,
2390 b00100001 = 33U,
2391 b00100010 = 34U,
2392 b00100011 = 35U,
2393 b00100100 = 36U,
2394 b00100101 = 37U,
2395 b00100110 = 38U,
2396 b00100111 = 39U,
2397 b00101000 = 40U,
2398 b00101001 = 41U,
2399 b00101010 = 42U,
2400 b00101011 = 43U,
2401 b00101100 = 44U,
2402 b00101101 = 45U,
2403 b00101110 = 46U,
2404 b00101111 = 47U,
2405 b00110000 = 48U,
2406 b00110001 = 49U,
2407 b00110010 = 50U,
2408 b00110011 = 51U,
2409 b00110100 = 52U,
2410 b00110101 = 53U,
2411 b00110110 = 54U,
2412 b00110111 = 55U,
2413 b00111000 = 56U,
2414 b00111001 = 57U,
2415 b00111010 = 58U,
2416 b00111011 = 59U,
2417 b00111100 = 60U,
2418 b00111101 = 61U,
2419 b00111110 = 62U,
2420 b00111111 = 63U,
2421 b01000000 = 64U,
2422 b01000001 = 65U,
2423 b01000010 = 66U,
2424 b01000011 = 67U,
2425 b01000100 = 68U,
2426 b01000101 = 69U,
2427 b01000110 = 70U,
2428 b01000111 = 71U,
2429 b01001000 = 72U,
2430 b01001001 = 73U,
2431 b01001010 = 74U,
2432 b01001011 = 75U,
2433 b01001100 = 76U,
2434 b01001101 = 77U,
2435 b01001110 = 78U,
2436 b01001111 = 79U,
2437 b01010000 = 80U,
2438 b01010001 = 81U,
2439 b01010010 = 82U,
2440 b01010011 = 83U,
2441 b01010100 = 84U,
2442 b01010101 = 85U,
2443 b01010110 = 86U,
2444 b01010111 = 87U,
2445 b01011000 = 88U,
2446 b01011001 = 89U,
2447 b01011010 = 90U,
2448 b01011011 = 91U,
2449 b01011100 = 92U,
2450 b01011101 = 93U,
2451 b01011110 = 94U,
2452 b01011111 = 95U,
2453 b01100000 = 96U,
2454 b01100001 = 97U,
2455 b01100010 = 98U,
2456 b01100011 = 99U,
2457 b01100100 = 100U,
2458 b01100101 = 101U,
2459 b01100110 = 102U,
2460 b01100111 = 103U,
2461 b01101000 = 104U,
2462 b01101001 = 105U,
2463 b01101010 = 106U,
2464 b01101011 = 107U,
2465 b01101100 = 108U,
2466 b01101101 = 109U,
2467 b01101110 = 110U,
2468 b01101111 = 111U,
2469 b01110000 = 112U,
2470 b01110001 = 113U,
2471 b01110010 = 114U,
2472 b01110011 = 115U,
2473 b01110100 = 116U,
2474 b01110101 = 117U,
2475 b01110110 = 118U,
2476 b01110111 = 119U,
2477 b01111000 = 120U,
2478 b01111001 = 121U,
2479 b01111010 = 122U,
2480 b01111011 = 123U,
2481 b01111100 = 124U,
2482 b01111101 = 125U,
2483 b01111110 = 126U,
2484 b01111111 = 127U,
2485 b10000000 = 128U,
2486 b10000001 = 129U,
2487 b10000010 = 130U,
2488 b10000011 = 131U,
2489 b10000100 = 132U,
2490 b10000101 = 133U,
2491 b10000110 = 134U,
2492 b10000111 = 135U,
2493 b10001000 = 136U,
2494 b10001001 = 137U,
2495 b10001010 = 138U,
2496 b10001011 = 139U,
2497 b10001100 = 140U,
2498 b10001101 = 141U,
2499 b10001110 = 142U,
2500 b10001111 = 143U,
2501 b10010000 = 144U,
2502 b10010001 = 145U,
2503 b10010010 = 146U,
2504 b10010011 = 147U,
2505 b10010100 = 148U,
2506 b10010101 = 149U,
2507 b10010110 = 150U,
2508 b10010111 = 151U,
2509 b10011000 = 152U,
2510 b10011001 = 153U,
2511 b10011010 = 154U,
2512 b10011011 = 155U,
2513 b10011100 = 156U,
2514 b10011101 = 157U,
2515 b10011110 = 158U,
2516 b10011111 = 159U,
2517 b10100000 = 160U,
2518 b10100001 = 161U,
2519 b10100010 = 162U,
2520 b10100011 = 163U,
2521 b10100100 = 164U,
2522 b10100101 = 165U,
2523 b10100110 = 166U,
2524 b10100111 = 167U,
2525 b10101000 = 168U,
2526 b10101001 = 169U,
2527 b10101010 = 170U,
2528 b10101011 = 171U,
2529 b10101100 = 172U,
2530 b10101101 = 173U,
2531 b10101110 = 174U,
2532 b10101111 = 175U,
2533 b10110000 = 176U,
2534 b10110001 = 177U,
2535 b10110010 = 178U,
2536 b10110011 = 179U,
2537 b10110100 = 180U,
2538 b10110101 = 181U,
2539 b10110110 = 182U,
2540 b10110111 = 183U,
2541 b10111000 = 184U,
2542 b10111001 = 185U,
2543 b10111010 = 186U,
2544 b10111011 = 187U,
2545 b10111100 = 188U,
2546 b10111101 = 189U,
2547 b10111110 = 190U,
2548 b10111111 = 191U,
2549 b11000000 = 192U,
2550 b11000001 = 193U,
2551 b11000010 = 194U,
2552 b11000011 = 195U,
2553 b11000100 = 196U,
2554 b11000101 = 197U,
2555 b11000110 = 198U,
2556 b11000111 = 199U,
2557 b11001000 = 200U,
2558 b11001001 = 201U,
2559 b11001010 = 202U,
2560 b11001011 = 203U,
2561 b11001100 = 204U,
2562 b11001101 = 205U,
2563 b11001110 = 206U,
2564 b11001111 = 207U,
2565 b11010000 = 208U,
2566 b11010001 = 209U,
2567 b11010010 = 210U,
2568 b11010011 = 211U,
2569 b11010100 = 212U,
2570 b11010101 = 213U,
2571 b11010110 = 214U,
2572 b11010111 = 215U,
2573 b11011000 = 216U,
2574 b11011001 = 217U,
2575 b11011010 = 218U,
2576 b11011011 = 219U,
2577 b11011100 = 220U,
2578 b11011101 = 221U,
2579 b11011110 = 222U,
2580 b11011111 = 223U,
2581 b11100000 = 224U,
2582 b11100001 = 225U,
2583 b11100010 = 226U,
2584 b11100011 = 227U,
2585 b11100100 = 228U,
2586 b11100101 = 229U,
2587 b11100110 = 230U,
2588 b11100111 = 231U,
2589 b11101000 = 232U,
2590 b11101001 = 233U,
2591 b11101010 = 234U,
2592 b11101011 = 235U,
2593 b11101100 = 236U,
2594 b11101101 = 237U,
2595 b11101110 = 238U,
2596 b11101111 = 239U,
2597 b11110000 = 240U,
2598 b11110001 = 241U,
2599 b11110010 = 242U,
2600 b11110011 = 243U,
2601 b11110100 = 244U,
2602 b11110101 = 245U,
2603 b11110110 = 246U,
2604 b11110111 = 247U,
2605 b11111000 = 248U,
2606 b11111001 = 249U,
2607 b11111010 = 250U,
2608 b11111011 = 251U,
2609 b11111100 = 252U,
2610 b11111101 = 253U,
2611 b11111110 = 254U,
2612 b11111111 = 255U
2613 };
2614
2615 //***************************************************************************
2618 //***************************************************************************
2620 {
2621 b0 = 0x1UL,
2622 b1 = 0x2UL,
2623 b2 = 0x4UL,
2624 b3 = 0x8UL,
2625 b4 = 0x10UL,
2626 b5 = 0x20UL,
2627 b6 = 0x40UL,
2628 b7 = 0x80UL,
2629 b8 = 0x100UL,
2630 b9 = 0x200UL,
2631 b10 = 0x400UL,
2632 b11 = 0x800UL,
2633 b12 = 0x1000UL,
2634 b13 = 0x2000UL,
2635 b14 = 0x4000UL,
2636 b15 = 0x8000UL,
2637 b16 = 0x10000UL,
2638 b17 = 0x20000UL,
2639 b18 = 0x40000UL,
2640 b19 = 0x80000UL,
2641 b20 = 0x100000UL,
2642 b21 = 0x200000UL,
2643 b22 = 0x400000UL,
2644 b23 = 0x800000UL,
2645 b24 = 0x1000000UL,
2646 b25 = 0x2000000UL,
2647 b26 = 0x4000000UL,
2648 b27 = 0x8000000UL,
2649 b28 = 0x10000000UL,
2650 b29 = 0x20000000UL,
2651 b30 = 0x40000000UL,
2652 b31 = 0x80000000UL
2653 };
2654} // namespace etl
2655
2656#endif
Definition binary.h:2196
Definition binary.h:2228
Definition binary.h:61
Definition binary.h:75
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 binary.h:2263
Definition binary.h:356
Definition for non-zero NBits.
Definition binary.h:91
Definition binary.h:483
#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