#pragma once #include "endianness.hpp" template void WriteToSink(TSink & sink, unsigned char c) { sink.Write(&c, 1); } template void WriteToSink(TSink & sink, signed char c) { sink.Write(&c, 1); } template void WriteToSink(TSink & sink, char c) { sink.Write(&c, 1); } template void WriteToSink(TSink & sink, uint16_t v) { uint16_t t = SwapIfBigEndian(v); sink.Write(&t, 2); } template void WriteToSink(TSink & sink, int16_t v) { int16_t t = SwapIfBigEndian(v); sink.Write(&t, 2); } template void WriteToSink(TSink & sink, int32_t v) { int32_t t = SwapIfBigEndian(v); sink.Write(&t, 4); } template void WriteToSink(TSink & sink, uint32_t v) { uint32_t t = SwapIfBigEndian(v); sink.Write(&t, 4); } template void WriteToSink(TSink & sink, int64_t v) { int64_t t = SwapIfBigEndian(v); sink.Write(&t, 8); } template void WriteToSink(TSink & sink, uint64_t v) { uint64_t t = SwapIfBigEndian(v); sink.Write(&t, 8); } template void WriteZeroesToSink(TSink & sink, uint64_t size) { uint8_t const zeroes[256] = { 0 }; for (uint64_t i = 0; i < (size >> 8); ++i) sink.Write(zeroes, 256); sink.Write(zeroes, size & 255); } template struct WriterFunctor { SinkT & m_Sink; explicit WriterFunctor(SinkT & sink) : m_Sink(sink) {} template inline void operator() (T const & t) const { m_Sink.Write(&t, sizeof(T)); } };