17#ifndef AEONGAMES_CRC_H
18#define AEONGAMES_CRC_H
36 DLL uint32_t
crc32i (
const char* message,
size_t size, uint32_t previous_crc = 0 );
47uint32_t crc_table32[256] =
49 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
50 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
51 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
52 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
53 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
54 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
55 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
56 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
57 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
58 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
59 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
60 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
61 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
62 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
63 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
64 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
65 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
66 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
67 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
68 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
69 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
70 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
71 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
72 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
73 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
74 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
75 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
76 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
77 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
78 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
79 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
80 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
81 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
82 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
83 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
84 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
85 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
86 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
87 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
88 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
89 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
90 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
91 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
92 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
93 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
94 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
95 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
96 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
97 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
98 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
99 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
100 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
101 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
102 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
103 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
104 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
105 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
106 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
107 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
108 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
109 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
110 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
111 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
112 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
119template <u
int32_t bits>
122 enum { value = 0x0 };
127template <u
int32_t bits>
130 enum { value = 0x0 };
136 enum { value = 0x55555555 };
142 enum { value = 0xAAAAAAAA };
148 enum { value = 0x33333333 };
154 enum { value = 0xCCCCCCCC };
160 enum { value = 0x0F0F0F0F };
166 enum { value = 0xF0F0F0F0};
172 enum { value = 0x00FF00FF };
178 enum { value = 0xFF00FF00 };
182struct mask_high32<16>
184 enum { value = 0x0000FFFF };
190 enum { value = 0xFFFF0000 };
197template <u
int32_t bits>
198constexpr uint32_t reflect32 ( uint32_t x )
200 return ( ( reflect32 < bits / 2 > ( x ) & mask_high32<bits>::value ) << bits |
201 ( reflect32 < bits / 2 > ( x ) & mask_low32<bits>::value ) >> bits );
205constexpr uint32_t reflect32<1> ( uint32_t x )
207 return ( ( x & 0x55555555 ) << 1 | ( x & 0xAAAAAAAA ) >> 1 );
215constexpr uint32_t crc32impl (
const char* message,
const std::size_t size, uint32_t crc )
217 return size == 0 ? reflect32<16> ( crc ) ^ 0xFFFFFFFF :
218 crc32impl ( message + 1, size - 1, crc_table32[reflect32<4> (
static_cast<uint8_t
> ( message[0] ) ) ^ ( crc >> ( 32 - 8 ) )] ^ ( crc << 8 ) );
222constexpr uint32_t crc32r (
const char* message,
const std::size_t size )
224 return crc32impl ( message, size, 0xFFFFFFFF );
231constexpr uint32_t
operator ""_crc32 (
const char* message,
const std::size_t size )
233 return crc32r ( message, size );
238constexpr uint32_t crc32r (
char const ( &message ) [N] )
240 return crc32r ( message, N - 1 );
243static_assert (
"AeonGames"_crc32 == 0x2B0C3B,
"CRC32 Operator Failure." );
244static_assert ( crc32r (
"AeonGames", 9 ) == 0x2B0C3B,
"CRC32 Failure." );
245static_assert ( crc32r (
"AeonGames" ) == 0x2B0C3B,
"CRC32 Failure." );
252 DLL uint64_t
crc64i (
const char* message,
size_t size, uint64_t previous_crc = 0 );
263uint64_t crc_table64[256] =
265 0x0000000000000000, 0x42F0E1EBA9EA3693, 0x85E1C3D753D46D26, 0xC711223CFA3E5BB5,
266 0x493366450E42ECDF, 0x0BC387AEA7A8DA4C, 0xCCD2A5925D9681F9, 0x8E224479F47CB76A,
267 0x9266CC8A1C85D9BE, 0xD0962D61B56FEF2D, 0x17870F5D4F51B498, 0x5577EEB6E6BB820B,
268 0xDB55AACF12C73561, 0x99A54B24BB2D03F2, 0x5EB4691841135847, 0x1C4488F3E8F96ED4,
269 0x663D78FF90E185EF, 0x24CD9914390BB37C, 0xE3DCBB28C335E8C9, 0xA12C5AC36ADFDE5A,
270 0x2F0E1EBA9EA36930, 0x6DFEFF5137495FA3, 0xAAEFDD6DCD770416, 0xE81F3C86649D3285,
271 0xF45BB4758C645C51, 0xB6AB559E258E6AC2, 0x71BA77A2DFB03177, 0x334A9649765A07E4,
272 0xBD68D2308226B08E, 0xFF9833DB2BCC861D, 0x388911E7D1F2DDA8, 0x7A79F00C7818EB3B,
273 0xCC7AF1FF21C30BDE, 0x8E8A101488293D4D, 0x499B3228721766F8, 0x0B6BD3C3DBFD506B,
274 0x854997BA2F81E701, 0xC7B97651866BD192, 0x00A8546D7C558A27, 0x4258B586D5BFBCB4,
275 0x5E1C3D753D46D260, 0x1CECDC9E94ACE4F3, 0xDBFDFEA26E92BF46, 0x990D1F49C77889D5,
276 0x172F5B3033043EBF, 0x55DFBADB9AEE082C, 0x92CE98E760D05399, 0xD03E790CC93A650A,
277 0xAA478900B1228E31, 0xE8B768EB18C8B8A2, 0x2FA64AD7E2F6E317, 0x6D56AB3C4B1CD584,
278 0xE374EF45BF6062EE, 0xA1840EAE168A547D, 0x66952C92ECB40FC8, 0x2465CD79455E395B,
279 0x3821458AADA7578F, 0x7AD1A461044D611C, 0xBDC0865DFE733AA9, 0xFF3067B657990C3A,
280 0x711223CFA3E5BB50, 0x33E2C2240A0F8DC3, 0xF4F3E018F031D676, 0xB60301F359DBE0E5,
281 0xDA050215EA6C212F, 0x98F5E3FE438617BC, 0x5FE4C1C2B9B84C09, 0x1D14202910527A9A,
282 0x93366450E42ECDF0, 0xD1C685BB4DC4FB63, 0x16D7A787B7FAA0D6, 0x5427466C1E109645,
283 0x4863CE9FF6E9F891, 0x0A932F745F03CE02, 0xCD820D48A53D95B7, 0x8F72ECA30CD7A324,
284 0x0150A8DAF8AB144E, 0x43A04931514122DD, 0x84B16B0DAB7F7968, 0xC6418AE602954FFB,
285 0xBC387AEA7A8DA4C0, 0xFEC89B01D3679253, 0x39D9B93D2959C9E6, 0x7B2958D680B3FF75,
286 0xF50B1CAF74CF481F, 0xB7FBFD44DD257E8C, 0x70EADF78271B2539, 0x321A3E938EF113AA,
287 0x2E5EB66066087D7E, 0x6CAE578BCFE24BED, 0xABBF75B735DC1058, 0xE94F945C9C3626CB,
288 0x676DD025684A91A1, 0x259D31CEC1A0A732, 0xE28C13F23B9EFC87, 0xA07CF2199274CA14,
289 0x167FF3EACBAF2AF1, 0x548F120162451C62, 0x939E303D987B47D7, 0xD16ED1D631917144,
290 0x5F4C95AFC5EDC62E, 0x1DBC74446C07F0BD, 0xDAAD56789639AB08, 0x985DB7933FD39D9B,
291 0x84193F60D72AF34F, 0xC6E9DE8B7EC0C5DC, 0x01F8FCB784FE9E69, 0x43081D5C2D14A8FA,
292 0xCD2A5925D9681F90, 0x8FDAB8CE70822903, 0x48CB9AF28ABC72B6, 0x0A3B7B1923564425,
293 0x70428B155B4EAF1E, 0x32B26AFEF2A4998D, 0xF5A348C2089AC238, 0xB753A929A170F4AB,
294 0x3971ED50550C43C1, 0x7B810CBBFCE67552, 0xBC902E8706D82EE7, 0xFE60CF6CAF321874,
295 0xE224479F47CB76A0, 0xA0D4A674EE214033, 0x67C58448141F1B86, 0x253565A3BDF52D15,
296 0xAB1721DA49899A7F, 0xE9E7C031E063ACEC, 0x2EF6E20D1A5DF759, 0x6C0603E6B3B7C1CA,
297 0xF6FAE5C07D3274CD, 0xB40A042BD4D8425E, 0x731B26172EE619EB, 0x31EBC7FC870C2F78,
298 0xBFC9838573709812, 0xFD39626EDA9AAE81, 0x3A28405220A4F534, 0x78D8A1B9894EC3A7,
299 0x649C294A61B7AD73, 0x266CC8A1C85D9BE0, 0xE17DEA9D3263C055, 0xA38D0B769B89F6C6,
300 0x2DAF4F0F6FF541AC, 0x6F5FAEE4C61F773F, 0xA84E8CD83C212C8A, 0xEABE6D3395CB1A19,
301 0x90C79D3FEDD3F122, 0xD2377CD44439C7B1, 0x15265EE8BE079C04, 0x57D6BF0317EDAA97,
302 0xD9F4FB7AE3911DFD, 0x9B041A914A7B2B6E, 0x5C1538ADB04570DB, 0x1EE5D94619AF4648,
303 0x02A151B5F156289C, 0x4051B05E58BC1E0F, 0x87409262A28245BA, 0xC5B073890B687329,
304 0x4B9237F0FF14C443, 0x0962D61B56FEF2D0, 0xCE73F427ACC0A965, 0x8C8315CC052A9FF6,
305 0x3A80143F5CF17F13, 0x7870F5D4F51B4980, 0xBF61D7E80F251235, 0xFD913603A6CF24A6,
306 0x73B3727A52B393CC, 0x31439391FB59A55F, 0xF652B1AD0167FEEA, 0xB4A25046A88DC879,
307 0xA8E6D8B54074A6AD, 0xEA16395EE99E903E, 0x2D071B6213A0CB8B, 0x6FF7FA89BA4AFD18,
308 0xE1D5BEF04E364A72, 0xA3255F1BE7DC7CE1, 0x64347D271DE22754, 0x26C49CCCB40811C7,
309 0x5CBD6CC0CC10FAFC, 0x1E4D8D2B65FACC6F, 0xD95CAF179FC497DA, 0x9BAC4EFC362EA149,
310 0x158E0A85C2521623, 0x577EEB6E6BB820B0, 0x906FC95291867B05, 0xD29F28B9386C4D96,
311 0xCEDBA04AD0952342, 0x8C2B41A1797F15D1, 0x4B3A639D83414E64, 0x09CA82762AAB78F7,
312 0x87E8C60FDED7CF9D, 0xC51827E4773DF90E, 0x020905D88D03A2BB, 0x40F9E43324E99428,
313 0x2CFFE7D5975E55E2, 0x6E0F063E3EB46371, 0xA91E2402C48A38C4, 0xEBEEC5E96D600E57,
314 0x65CC8190991CB93D, 0x273C607B30F68FAE, 0xE02D4247CAC8D41B, 0xA2DDA3AC6322E288,
315 0xBE992B5F8BDB8C5C, 0xFC69CAB42231BACF, 0x3B78E888D80FE17A, 0x7988096371E5D7E9,
316 0xF7AA4D1A85996083, 0xB55AACF12C735610, 0x724B8ECDD64D0DA5, 0x30BB6F267FA73B36,
317 0x4AC29F2A07BFD00D, 0x08327EC1AE55E69E, 0xCF235CFD546BBD2B, 0x8DD3BD16FD818BB8,
318 0x03F1F96F09FD3CD2, 0x41011884A0170A41, 0x86103AB85A2951F4, 0xC4E0DB53F3C36767,
319 0xD8A453A01B3A09B3, 0x9A54B24BB2D03F20, 0x5D45907748EE6495, 0x1FB5719CE1045206,
320 0x919735E51578E56C, 0xD367D40EBC92D3FF, 0x1476F63246AC884A, 0x568617D9EF46BED9,
321 0xE085162AB69D5E3C, 0xA275F7C11F7768AF, 0x6564D5FDE549331A, 0x279434164CA30589,
322 0xA9B6706FB8DFB2E3, 0xEB46918411358470, 0x2C57B3B8EB0BDFC5, 0x6EA7525342E1E956,
323 0x72E3DAA0AA188782, 0x30133B4B03F2B111, 0xF7021977F9CCEAA4, 0xB5F2F89C5026DC37,
324 0x3BD0BCE5A45A6B5D, 0x79205D0E0DB05DCE, 0xBE317F32F78E067B, 0xFCC19ED95E6430E8,
325 0x86B86ED5267CDBD3, 0xC4488F3E8F96ED40, 0x0359AD0275A8B6F5, 0x41A94CE9DC428066,
326 0xCF8B0890283E370C, 0x8D7BE97B81D4019F, 0x4A6ACB477BEA5A2A, 0x089A2AACD2006CB9,
327 0x14DEA25F3AF9026D, 0x562E43B4931334FE, 0x913F6188692D6F4B, 0xD3CF8063C0C759D8,
328 0x5DEDC41A34BBEEB2, 0x1F1D25F19D51D821, 0xD80C07CD676F8394, 0x9AFCE626CE85B507
335template <u
int64_t bits>
338 enum : uint64_t { value = 0x0 };
343template <u
int64_t bits>
346 enum : uint64_t { value = 0x0 };
352 enum : uint64_t { value = 0x5555555555555555 };
358 enum : uint64_t { value = 0xAAAAAAAAAAAAAAAA };
364 enum : uint64_t { value = 0x3333333333333333 };
370 enum : uint64_t { value = 0xCCCCCCCCCCCCCCCC };
376 enum : uint64_t { value = 0x0F0F0F0F0F0F0F0F };
382 enum : uint64_t { value = 0xF0F0F0F0F0F0F0F0};
388 enum : uint64_t { value = 0x00FF00FF00FF00FF };
394 enum : uint64_t { value = 0xFF00FF00FF00FF00 };
398struct mask_high64<16>
400 enum : uint64_t { value = 0x0000FFFF0000FFFF };
406 enum : uint64_t { value = 0xFFFF0000FFFF0000 };
410struct mask_high64<32>
412 enum : uint64_t { value = 0x00000000FFFFFFFF };
418 enum : uint64_t { value = 0xFFFFFFFF00000000 };
425template <u
int64_t bits>
426constexpr uint64_t reflect64 ( uint64_t x )
428 return ( ( reflect64 < bits / 2 > ( x ) & mask_high64<bits>::value ) << bits |
429 ( reflect64 < bits / 2 > ( x ) & mask_low64<bits>::value ) >> bits );
433constexpr uint64_t reflect64<1> ( uint64_t x )
435 return ( ( x & 0x5555555555555555 ) << 1 | ( x & 0xAAAAAAAAAAAAAAAA ) >> 1 );
443constexpr uint64_t crc64impl (
const char* message,
const std::size_t size, uint64_t crc )
445 return size == 0 ? reflect64<32> ( crc ) ^ 0xFFFFFFFFFFFFFFFF :
446 crc64impl ( message + 1, size - 1, crc_table64[reflect64<4> (
static_cast<uint8_t
> ( message[0] ) ) ^ ( crc >> ( 64 - 8 ) )] ^ ( crc << 8 ) );
450constexpr uint64_t crc64r (
const char* message,
const std::size_t size )
452 return crc64impl ( message, size, 0xFFFFFFFFFFFFFFFF );
459constexpr const uint64_t
operator ""_crc64 (
const char* message,
const std::size_t size )
461 return crc64r ( message, size );
469static_assert (
"AeonGames"_crc64 == 0x187936cc3eca327f,
"CRC64 Operator Failure." );
470static_assert ( crc64r (
"AeonGames", 9 ) == 0x187936cc3eca327f,
"CRC64 Failure." );
476constexpr const std::size_t
operator ""_id (
const char* message,
const std::size_t size )
478 return (
sizeof ( std::size_t ) == 4 ) ? crc32impl ( message, size, 0xFFFFFFFF ) :
479 ( sizeof ( std::size_t ) == 8 ) ? crc64impl ( message, size, 0xFFFFFFFFFFFFFFFF ) : 0;
482static_assert (
"AeonGames"_id != 0,
"size_t has uncommon size." );
483static_assert (
sizeof (
"AeonGames"_id ) ==
sizeof ( std::size_t ),
"Size of _id operator is different than sizeof(std::size_t)" );
<- This is here just for the literals
uint32_t crc32i(const char *message, size_t size, uint32_t previous_crc)
Compute the CRC32 of a given message, continuing from a previous CRC value.
uint64_t crc64i(const char *message, size_t size, uint64_t previous_crc)
Compute the CRC64 of a given message, continuing from a previous CRC value.