#pragma once #include #include #include #include #include class idSwap { public: template static void Little(type&) { static_assert(!std::is_pointer::value, "serialized pointers cannot be endian swapped"); } template static void Big(type& value) { static_assert(!std::is_pointer::value, "serialized pointers cannot be endian swapped"); unsigned char* bytes = reinterpret_cast(&value); std::reverse(bytes, bytes + sizeof(type)); } template static void LittleArray(type*, int) { } template static void BigArray(type* values, const int count) { for (int index = 0; index < count; ++index) Big(values[index]); } static void SixtetsForInt(unsigned char* output, const int source) { const unsigned int value = static_cast(source); output[0] = static_cast((value >> 18) & 0x3F); output[1] = static_cast((value >> 12) & 0x3F); output[2] = static_cast((value >> 6) & 0x3F); output[3] = static_cast(value & 0x3F); } static int IntForSixtets(const unsigned char* input) { return static_cast((static_cast(input[0]) << 18) | (static_cast(input[1]) << 12) | (static_cast(input[2]) << 6) | static_cast(input[3])); } }; static_assert(sizeof(idSwap) == 1, "Recovered idSwap must remain empty");