14#include "comms/details/tag.h" 
   35template <
typename TResult>
 
   36using CrcInitTableType = std::array<TResult, 256>;
 
   38template <
typename TResult, TResult TPoly>
 
   41    using Table = CrcInitTableType<TResult>;
 
   42    static const Table& get()
 
   45        static bool tableFilled = 
false;
 
   56    static void fillTable(Table& table)
 
   58        static const std::size_t Width =
 
   59            sizeof(TResult) * std::numeric_limits<std::uint8_t>::digits;
 
   60        static const auto Msb =
 
   61            static_cast<TResult
>(1) << (Width - 1);
 
   63        for (
unsigned idx = 0U; idx < table.size(); ++idx)
 
   65            auto rem = 
static_cast<TResult
>(idx << (Width - 8));
 
   67            for (
auto bit = 8U; bit > 0U; --bit)
 
   71                    rem = (rem << 1) ^ TPoly;
 
   85struct CrcInitTable<
std::uint16_t, 0x1021>
 
   87    using Table = CrcInitTableType<std::uint16_t>;
 
   88    static const Table& get()
 
   90        static const Table table = {{
 
   91            0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
 
   92            0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
 
   93            0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
 
   94            0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
 
   95            0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
 
   96            0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
 
   97            0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
 
   98            0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
 
   99            0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
 
  100            0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
 
  101            0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
 
  102            0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
 
  103            0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
 
  104            0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
 
  105            0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
 
  106            0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
 
  107            0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
 
  108            0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
 
  109            0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
 
  110            0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
 
  111            0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
 
  112            0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
 
  113            0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
 
  114            0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
 
  115            0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
 
  116            0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
 
  117            0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
 
  118            0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
 
  119            0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
 
  120            0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
 
  121            0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
 
  122            0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
 
  129struct CrcInitTable<
std::uint16_t, 0x8005>
 
  131    using Table = CrcInitTableType<std::uint16_t>;
 
  132    static const Table& get()
 
  134        static const Table table = {{
 
  135            0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
 
  136            0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
 
  137            0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
 
  138            0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
 
  139            0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
 
  140            0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
 
  141            0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
 
  142            0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
 
  143            0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
 
  144            0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
 
  145            0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
 
  146            0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
 
  147            0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
 
  148            0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
 
  149            0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
 
  150            0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
 
  151            0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
 
  152            0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
 
  153            0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
 
  154            0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
 
  155            0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
 
  156            0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
 
  157            0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
 
  158            0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
 
  159            0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
 
  160            0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
 
  161            0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
 
  162            0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
 
  163            0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
 
  164            0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
 
  165            0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
 
  166            0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
 
  173struct CrcInitTable<
std::uint32_t, 0x04c11db7>
 
  175    using Table = CrcInitTableType<std::uint32_t>;
 
  176    static const Table& get()
 
  178        static const Table table = {{
 
  179            0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
 
  180            0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
 
  181            0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
 
  182            0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
 
  183            0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
 
  184            0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
 
  185            0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
 
  186            0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
 
  187            0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
 
  188            0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
 
  189            0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
 
  190            0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
 
  191            0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
 
  192            0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
 
  193            0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
 
  194            0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
 
  195            0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
 
  196            0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
 
  197            0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
 
  198            0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
 
  199            0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
 
  200            0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
 
  201            0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
 
  202            0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
 
  203            0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
 
  204            0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
 
  205            0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
 
  206            0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
 
  207            0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
 
  208            0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
 
  209            0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
 
  210            0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
 
  211            0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
 
  212            0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
 
  213            0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
 
  214            0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
 
  215            0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
 
  216            0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
 
  217            0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
 
  218            0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
 
  219            0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
 
  220            0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
 
  221            0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
 
  222            0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
 
  223            0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
 
  224            0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
 
  225            0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
 
  226            0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
 
  227            0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
 
  228            0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
 
  229            0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
 
  230            0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
 
  231            0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
 
  232            0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
 
  233            0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
 
  234            0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
 
  235            0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
 
  236            0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
 
  237            0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
 
  238            0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
 
  239            0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
 
  240            0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
 
  241            0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
 
  242            0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
 
  266    bool TReflect = 
false,
 
  267    bool TReflectRem = 
false 
  271    static_assert(std::is_unsigned<TResult>::value,
 
  272        "The TResult type is expected to be unsigned integral one");
 
  279    template <
typename TIter>
 
  282        static const std::size_t Width =
 
  283            sizeof(TResult) * std::numeric_limits<std::uint8_t>::digits;
 
  286        auto& initTable = details::CrcInitTable<TResult, TPoly>::get();
 
  288        for (std::size_t 
byte = 0U; 
byte < len; ++byte)
 
  290            using ByteType = 
typename std::make_unsigned<
 
  291                typename std::decay<
decltype(*iter)>::type
 
  294            auto val = 
static_cast<std::uint8_t
>(
static_cast<ByteType
>(*iter));
 
  295            comms::cast_assign(val) = reflect(val) ^ 
static_cast<decltype(val)
>(rem >> (Width - 8));
 
  300        return (reflectRem(rem) ^ TFin);
 
 
  304    template <
typename... TParams>
 
  305    using NoReflectTag = comms::details::tag::Tag1<>;
 
  307    template <
typename... TParams>
 
  308    using DoReflectTag = comms::details::tag::Tag2<>;
 
  310    template <
typename...>
 
  312        typename comms::util::LazyShallowConditional<
 
  319    template <
typename...>
 
  320    using ReflectRemTag = 
 
  321        typename comms::util::LazyShallowConditional<
 
  328    static std::uint8_t reflect(std::uint8_t 
byte)
 
  330        return reflectInternal(
byte, 8U, ReflectTag<>());
 
  333    static TResult reflectRem(TResult value)
 
  335        static const std::size_t Width =
 
  336            sizeof(TResult) * std::numeric_limits<std::uint8_t>::digits;
 
  338        return reflectInternal(value, Width, ReflectRemTag<>());
 
  341    template <
typename TVal, 
typename... TParams>
 
  342    static TVal reflectInternal(TVal value, std::size_t bitsCount, DoReflectTag<TParams...>)
 
  344        return static_cast<TVal
>(doReflect(value, bitsCount));
 
  347    template <
typename TVal, 
typename... TParams>
 
  348    static constexpr TVal reflectInternal(TVal value, std::size_t, NoReflectTag<TParams...>)
 
  353    static TResult doReflect(TResult value, std::size_t bitsCount)
 
  355        TResult reflection = 0U;
 
  356        for (
auto bit = 0U; bit < bitsCount; ++bit)
 
  362                    static_cast<decltype(reflection)
>(1 << ((bitsCount - 1) - bit));
 
  365            value = 
static_cast<decltype(value)
>(value >> 1);
 
 
Contains definition of various casts.
 
Calculate CRC values of all the bytes in the sequence.
Definition Crc.h:270
 
TResult operator()(TIter &iter, std::size_t len) const
Operator that is invoked to calculate the checksum value.
Definition Crc.h:280
 
Main namespace for all classes / functions of COMMS library.
 
details::ValueAssignWrapper< T > cast_assign(T &value)
Helper function to assign value with static_cast to appropriate type.
Definition cast.h:29
 
Replacement to some types from standard type_traits.