… | |
… | |
85 | =over 4 |
85 | =over 4 |
86 | |
86 | |
87 | =item ECB_C |
87 | =item ECB_C |
88 | |
88 | |
89 | True if the implementation defines the C<__STDC__> macro to a true value, |
89 | True if the implementation defines the C<__STDC__> macro to a true value, |
90 | while not claiming to be C++. |
90 | while not claiming to be C++, i..e C, but not C++. |
91 | |
91 | |
92 | =item ECB_C99 |
92 | =item ECB_C99 |
93 | |
93 | |
94 | True if the implementation claims to be compliant to C99 (ISO/IEC |
94 | True if the implementation claims to be compliant to C99 (ISO/IEC |
95 | 9899:1999) or any later version, while not claiming to be C++. |
95 | 9899:1999) or any later version, while not claiming to be C++. |
… | |
… | |
109 | |
109 | |
110 | =item ECB_CPP11, ECB_CPP14, ECB_CPP17 |
110 | =item ECB_CPP11, ECB_CPP14, ECB_CPP17 |
111 | |
111 | |
112 | True if the implementation claims to be compliant to C++11/C++14/C++17 |
112 | True if the implementation claims to be compliant to C++11/C++14/C++17 |
113 | (ISO/IEC 14882:2011, :2014, :2017) or any later version. |
113 | (ISO/IEC 14882:2011, :2014, :2017) or any later version. |
|
|
114 | |
|
|
115 | Note that many C++20 features will likely have their own feature test |
|
|
116 | macros (see e.g. L<http://eel.is/c++draft/cpp.predefined#1.8>). |
|
|
117 | |
|
|
118 | =item ECB_OPTIMIZE_SIZE |
|
|
119 | |
|
|
120 | Is C<1> when the compiler optimizes for size, C<0> otherwise. This symbol |
|
|
121 | can also be defined before including F<ecb.h>, in which case it will be |
|
|
122 | unchanged. |
114 | |
123 | |
115 | =item ECB_GCC_VERSION (major, minor) |
124 | =item ECB_GCC_VERSION (major, minor) |
116 | |
125 | |
117 | Expands to a true value (suitable for testing in by the preprocessor) |
126 | Expands to a true value (suitable for testing in by the preprocessor) |
118 | if the compiler used is GNU C and the version is the given version, or |
127 | if the compiler used is GNU C and the version is the given version, or |
… | |
… | |
408 | |
417 | |
409 | =head2 OPTIMISATION HINTS |
418 | =head2 OPTIMISATION HINTS |
410 | |
419 | |
411 | =over 4 |
420 | =over 4 |
412 | |
421 | |
413 | =item ECB_OPTIMIZE_SIZE |
|
|
414 | |
|
|
415 | Is C<1> when the compiler optimizes for size, C<0> otherwise. This symbol |
|
|
416 | can also be defined before including F<ecb.h>, in which case it will be |
|
|
417 | unchanged. |
|
|
418 | |
|
|
419 | =item bool ecb_is_constant (expr) |
422 | =item bool ecb_is_constant (expr) |
420 | |
423 | |
421 | Returns true iff the expression can be deduced to be a compile-time |
424 | Returns true iff the expression can be deduced to be a compile-time |
422 | constant, and false otherwise. |
425 | constant, and false otherwise. |
423 | |
426 | |
… | |
… | |
595 | |
598 | |
596 | =item int ecb_ctz32 (uint32_t x) |
599 | =item int ecb_ctz32 (uint32_t x) |
597 | |
600 | |
598 | =item int ecb_ctz64 (uint64_t x) |
601 | =item int ecb_ctz64 (uint64_t x) |
599 | |
602 | |
|
|
603 | =item int ecb_ctz (T x) [C++] |
|
|
604 | |
600 | Returns the index of the least significant bit set in C<x> (or |
605 | Returns the index of the least significant bit set in C<x> (or |
601 | equivalently the number of bits set to 0 before the least significant bit |
606 | equivalently the number of bits set to 0 before the least significant bit |
602 | set), starting from 0. If C<x> is 0 the result is undefined. |
607 | set), starting from 0. If C<x> is 0 the result is undefined. |
603 | |
608 | |
604 | For smaller types than C<uint32_t> you can safely use C<ecb_ctz32>. |
609 | For smaller types than C<uint32_t> you can safely use C<ecb_ctz32>. |
605 | |
610 | |
|
|
611 | The overloaded C++ C<ecb_ctz> function supports C<uint8_t>, C<uint16_t>, |
|
|
612 | C<uint32_t> and C<uint64_t> types. |
|
|
613 | |
606 | For example: |
614 | For example: |
607 | |
615 | |
608 | ecb_ctz32 (3) = 0 |
616 | ecb_ctz32 (3) = 0 |
609 | ecb_ctz32 (6) = 1 |
617 | ecb_ctz32 (6) = 1 |
610 | |
618 | |
611 | =item bool ecb_is_pot32 (uint32_t x) |
619 | =item bool ecb_is_pot32 (uint32_t x) |
612 | |
620 | |
613 | =item bool ecb_is_pot64 (uint32_t x) |
621 | =item bool ecb_is_pot64 (uint32_t x) |
614 | |
622 | |
|
|
623 | =item bool ecb_is_pot (T x) [C++] |
|
|
624 | |
615 | Returns true iff C<x> is a power of two or C<x == 0>. |
625 | Returns true iff C<x> is a power of two or C<x == 0>. |
616 | |
626 | |
617 | For smaller types than C<uint32_t> you can safely use C<ecb_is_pot32>. |
627 | For smaller types than C<uint32_t> you can safely use C<ecb_is_pot32>. |
618 | |
628 | |
|
|
629 | The overloaded C++ C<ecb_is_pot> function supports C<uint8_t>, C<uint16_t>, |
|
|
630 | C<uint32_t> and C<uint64_t> types. |
|
|
631 | |
619 | =item int ecb_ld32 (uint32_t x) |
632 | =item int ecb_ld32 (uint32_t x) |
620 | |
633 | |
621 | =item int ecb_ld64 (uint64_t x) |
634 | =item int ecb_ld64 (uint64_t x) |
|
|
635 | |
|
|
636 | =item int ecb_ld64 (T x) [C++] |
622 | |
637 | |
623 | Returns the index of the most significant bit set in C<x>, or the number |
638 | Returns the index of the most significant bit set in C<x>, or the number |
624 | of digits the number requires in binary (so that C<< 2**ld <= x < |
639 | of digits the number requires in binary (so that C<< 2**ld <= x < |
625 | 2**(ld+1) >>). If C<x> is 0 the result is undefined. A common use case is |
640 | 2**(ld+1) >>). If C<x> is 0 the result is undefined. A common use case is |
626 | to compute the integer binary logarithm, i.e. C<floor (log2 (n))>, for |
641 | to compute the integer binary logarithm, i.e. C<floor (log2 (n))>, for |
… | |
… | |
631 | the given data type), while C<ecb_ld> returns how many bits the number |
646 | the given data type), while C<ecb_ld> returns how many bits the number |
632 | itself requires. |
647 | itself requires. |
633 | |
648 | |
634 | For smaller types than C<uint32_t> you can safely use C<ecb_ld32>. |
649 | For smaller types than C<uint32_t> you can safely use C<ecb_ld32>. |
635 | |
650 | |
|
|
651 | The overloaded C++ C<ecb_ld> function supports C<uint8_t>, C<uint16_t>, |
|
|
652 | C<uint32_t> and C<uint64_t> types. |
|
|
653 | |
636 | =item int ecb_popcount32 (uint32_t x) |
654 | =item int ecb_popcount32 (uint32_t x) |
637 | |
655 | |
638 | =item int ecb_popcount64 (uint64_t x) |
656 | =item int ecb_popcount64 (uint64_t x) |
639 | |
657 | |
|
|
658 | =item int ecb_popcount (T x) [C++] |
|
|
659 | |
640 | Returns the number of bits set to 1 in C<x>. |
660 | Returns the number of bits set to 1 in C<x>. |
641 | |
661 | |
642 | For smaller types than C<uint32_t> you can safely use C<ecb_popcount32>. |
662 | For smaller types than C<uint32_t> you can safely use C<ecb_popcount32>. |
|
|
663 | |
|
|
664 | The overloaded C++ C<ecb_popcount> function supports C<uint8_t>, C<uint16_t>, |
|
|
665 | C<uint32_t> and C<uint64_t> types. |
643 | |
666 | |
644 | For example: |
667 | For example: |
645 | |
668 | |
646 | ecb_popcount32 (7) = 3 |
669 | ecb_popcount32 (7) = 3 |
647 | ecb_popcount32 (255) = 8 |
670 | ecb_popcount32 (255) = 8 |
… | |
… | |
650 | |
673 | |
651 | =item uint16_t ecb_bitrev16 (uint16_t x) |
674 | =item uint16_t ecb_bitrev16 (uint16_t x) |
652 | |
675 | |
653 | =item uint32_t ecb_bitrev32 (uint32_t x) |
676 | =item uint32_t ecb_bitrev32 (uint32_t x) |
654 | |
677 | |
|
|
678 | =item T ecb_bitrev (T x) [C++] |
|
|
679 | |
655 | Reverses the bits in x, i.e. the MSB becomes the LSB, MSB-1 becomes LSB+1 |
680 | Reverses the bits in x, i.e. the MSB becomes the LSB, MSB-1 becomes LSB+1 |
656 | and so on. |
681 | and so on. |
657 | |
682 | |
|
|
683 | The overloaded C++ C<ecb_bitrev> function supports C<uint8_t>, C<uint16_t> and C<uint32_t> types. |
|
|
684 | |
658 | Example: |
685 | Example: |
659 | |
686 | |
660 | ecb_bitrev8 (0xa7) = 0xea |
687 | ecb_bitrev8 (0xa7) = 0xea |
661 | ecb_bitrev32 (0xffcc4411) = 0x882233ff |
688 | ecb_bitrev32 (0xffcc4411) = 0x882233ff |
662 | |
689 | |
|
|
690 | =item T ecb_bitrev (T x) [C++] |
|
|
691 | |
|
|
692 | Overloaded C++ bitrev function. |
|
|
693 | |
|
|
694 | C<T> must be one of C<uint8_t>, C<uint16_t> or C<uint32_t>. |
|
|
695 | |
663 | =item uint32_t ecb_bswap16 (uint32_t x) |
696 | =item uint32_t ecb_bswap16 (uint32_t x) |
664 | |
697 | |
665 | =item uint32_t ecb_bswap32 (uint32_t x) |
698 | =item uint32_t ecb_bswap32 (uint32_t x) |
666 | |
699 | |
667 | =item uint64_t ecb_bswap64 (uint64_t x) |
700 | =item uint64_t ecb_bswap64 (uint64_t x) |
|
|
701 | |
|
|
702 | =item T ecb_bswap (T x) |
668 | |
703 | |
669 | These functions return the value of the 16-bit (32-bit, 64-bit) value |
704 | These functions return the value of the 16-bit (32-bit, 64-bit) value |
670 | C<x> after reversing the order of bytes (0x11223344 becomes 0x44332211 in |
705 | C<x> after reversing the order of bytes (0x11223344 becomes 0x44332211 in |
671 | C<ecb_bswap32>). |
706 | C<ecb_bswap32>). |
672 | |
707 | |
673 | =item T ecb_bswap (T x) [C++] |
708 | The overloaded C++ C<ecb_bswap> function supports C<uint8_t>, C<uint16_t>, |
674 | |
709 | C<uint32_t> and C<uint64_t> types. |
675 | For C++, an additional generic bswap function is provided. It supports |
|
|
676 | C<uint8_t>, C<uint16_t>, C<uint32_t> and C<uint64_t>. |
|
|
677 | |
710 | |
678 | =item uint8_t ecb_rotl8 (uint8_t x, unsigned int count) |
711 | =item uint8_t ecb_rotl8 (uint8_t x, unsigned int count) |
679 | |
712 | |
680 | =item uint16_t ecb_rotl16 (uint16_t x, unsigned int count) |
713 | =item uint16_t ecb_rotl16 (uint16_t x, unsigned int count) |
681 | |
714 | |
… | |
… | |
697 | |
730 | |
698 | Current GCC versions understand these functions and usually compile them |
731 | Current GCC versions understand these functions and usually compile them |
699 | to "optimal" code (e.g. a single C<rol> or a combination of C<shld> on |
732 | to "optimal" code (e.g. a single C<rol> or a combination of C<shld> on |
700 | x86). |
733 | x86). |
701 | |
734 | |
|
|
735 | =item T ecb_rotl (T x, unsigned int count) [C++] |
|
|
736 | |
|
|
737 | =item T ecb_rotr (T x, unsigned int count) [C++] |
|
|
738 | |
|
|
739 | Overloaded C++ rotl/rotr functions. |
|
|
740 | |
|
|
741 | C<T> must be one of C<uint8_t>, C<uint16_t>, C<uint32_t> or C<uint64_t>. |
|
|
742 | |
702 | =back |
743 | =back |
703 | |
744 | |
704 | =head2 HOST ENDIANNESS CONVERSION |
745 | =head2 HOST ENDIANNESS CONVERSION |
705 | |
746 | |
706 | =over 4 |
747 | =over 4 |
… | |
… | |
718 | =item uint_fast64_t ecb_le_u64_to_host (uint_fast64_t v) |
759 | =item uint_fast64_t ecb_le_u64_to_host (uint_fast64_t v) |
719 | |
760 | |
720 | Convert an unsigned 16, 32 or 64 bit value from big or little endian to host byte order. |
761 | Convert an unsigned 16, 32 or 64 bit value from big or little endian to host byte order. |
721 | |
762 | |
722 | The naming convention is C<ecb_>(C<be>|C<le>)C<_u>C<16|32|64>C<_to_host>, |
763 | The naming convention is C<ecb_>(C<be>|C<le>)C<_u>C<16|32|64>C<_to_host>, |
723 | where be and le stand for big endian and little endian, respectively. |
764 | where C<be> and C<le> stand for big endian and little endian, respectively. |
724 | |
765 | |
725 | =item uint_fast16_t ecb_host_to_be_u16 (uint_fast16_t v) |
766 | =item uint_fast16_t ecb_host_to_be_u16 (uint_fast16_t v) |
726 | |
767 | |
727 | =item uint_fast32_t ecb_host_to_be_u32 (uint_fast32_t v) |
768 | =item uint_fast32_t ecb_host_to_be_u32 (uint_fast32_t v) |
728 | |
769 | |
… | |
… | |
737 | Like above, but converts I<from> host byte order to the specified |
778 | Like above, but converts I<from> host byte order to the specified |
738 | endianness. |
779 | endianness. |
739 | |
780 | |
740 | =back |
781 | =back |
741 | |
782 | |
742 | In C++ the following additional functions are supported: |
783 | In C++ the following additional template functions are supported: |
743 | |
784 | |
744 | =over 4 |
785 | =over 4 |
745 | |
786 | |
746 | =item T ecb_be_to_host (T v) |
787 | =item T ecb_be_to_host (T v) |
747 | |
788 | |
… | |
… | |
749 | |
790 | |
750 | =item T ecb_host_to_be (T v) |
791 | =item T ecb_host_to_be (T v) |
751 | |
792 | |
752 | =item T ecb_host_to_le (T v) |
793 | =item T ecb_host_to_le (T v) |
753 | |
794 | |
754 | These work like their C counterparts, above, but use templates for the |
795 | These functions work like their C counterparts, above, but use templates, |
755 | type, which make them useful in generic code. |
796 | which make them useful in generic code. |
756 | |
797 | |
757 | C<T> must be one of C<uint8_t>, C<uint16_t>, C<uint32_t> or C<uint64_t> |
798 | C<T> must be one of C<uint8_t>, C<uint16_t>, C<uint32_t> or C<uint64_t> |
758 | (so unlike their C counterparts, there is a version for C<uint8_t>, which |
799 | (so unlike their C counterparts, there is a version for C<uint8_t>, which |
759 | again can be useful in generic code). |
800 | again can be useful in generic code). |
760 | |
801 | |
… | |
… | |
812 | Like above, but additionally convert from host byte order to big endian |
853 | Like above, but additionally convert from host byte order to big endian |
813 | (C<be>) or little endian (C<le>) byte order while doing so. |
854 | (C<be>) or little endian (C<le>) byte order while doing so. |
814 | |
855 | |
815 | =back |
856 | =back |
816 | |
857 | |
817 | In C++ the following additional functions are supported: |
858 | In C++ the following additional template functions are supported: |
818 | |
859 | |
819 | =over 4 |
860 | =over 4 |
820 | |
861 | |
821 | =item T ecb_peek (const void *ptr) |
862 | =item T ecb_peek<T> (const void *ptr) |
822 | |
863 | |
823 | =item T ecb_peek_be (const void *ptr) |
864 | =item T ecb_peek_be<T> (const void *ptr) |
824 | |
865 | |
825 | =item T ecb_peek_le (const void *ptr) |
866 | =item T ecb_peek_le<T> (const void *ptr) |
826 | |
867 | |
827 | =item T ecb_peek_u (const void *ptr) |
868 | =item T ecb_peek_u<T> (const void *ptr) |
828 | |
869 | |
829 | =item T ecb_peek_be_u (const void *ptr) |
870 | =item T ecb_peek_be_u<T> (const void *ptr) |
830 | |
871 | |
831 | =item T ecb_peek_le_u (const void *ptr) |
872 | =item T ecb_peek_le_u<T> (const void *ptr) |
832 | |
873 | |
833 | Similarly to their C counterparts, these functions load an unsigned 8, 16, |
874 | Similarly to their C counterparts, these functions load an unsigned 8, 16, |
834 | 32 or 64 bit value from memory, with optional conversion from big/little |
875 | 32 or 64 bit value from memory, with optional conversion from big/little |
835 | endian. |
876 | endian. |
836 | |
877 | |
837 | Since the type cannot be deduced, it has top be specified explicitly, e.g. |
878 | Since the type cannot be deduced, it has to be specified explicitly, e.g. |
838 | |
879 | |
839 | uint_fast16_t v = ecb_peek<uint16_t> (ptr); |
880 | uint_fast16_t v = ecb_peek<uint16_t> (ptr); |
840 | |
881 | |
841 | C<T> must be one of C<uint8_t>, C<uint16_t>, C<uint32_t> or C<uint64_t>. |
882 | C<T> must be one of C<uint8_t>, C<uint16_t>, C<uint32_t> or C<uint64_t>. |
842 | |
883 | |