static void test_bigend_u64(TestBatch *batch) { size_t count = 32; uint64_t *ints = TestUtils_random_u64s(NULL, count, 0, U64_MAX); size_t amount = (count + 1) * sizeof(uint64_t); char *allocated = (char*)CALLOCATE(amount, sizeof(char)); char *encoded = allocated + 1; // Intentionally misaligned. char *target = encoded; for (size_t i = 0; i < count; i++) { NumUtil_encode_bigend_u64(ints[i], &target); target += sizeof(uint64_t); } target = encoded; for (size_t i = 0; i < count; i++) { uint64_t got = NumUtil_decode_bigend_u64(target); TEST_TRUE(batch, got == ints[i], "bigend u64"); target += sizeof(uint64_t); } target = encoded; NumUtil_encode_bigend_u64(1, &target); TEST_INT_EQ(batch, encoded[0], 0, "Truly big-endian"); TEST_INT_EQ(batch, encoded[7], 1, "Truly big-endian"); FREEMEM(allocated); FREEMEM(ints); }
static CFISH_INLINE void SI_write_u64(OutStream *self, OutStreamIVARS *ivars, uint64_t value) { #ifdef CHY_BIG_END SI_write_bytes(self, ivars, &value, 8); #else char buf[sizeof(uint64_t)]; char *buf_copy = buf; NumUtil_encode_bigend_u64(value, &buf_copy); SI_write_bytes(self, ivars, buf, sizeof(uint64_t)); #endif }