hessian2/writer.hpp (32 lines of code) (raw):
#pragma once
#include "absl/strings/string_view.h"
#include "byte_order.h"
namespace Hessian2 {
class Writer {
public:
Writer() = default;
virtual ~Writer() = default;
virtual void rawWrite(const void* data, uint64_t size) = 0;
virtual void rawWrite(absl::string_view data) = 0;
void writeByte(uint8_t value) { rawWrite(std::addressof(value), 1); }
template <typename T>
void writeByte(T value) {
writeByte(static_cast<uint8_t>(value));
}
template <ByteOrderType Endianness = ByteOrderType::Host, typename T>
void write(
typename std::enable_if<std::is_integral<T>::value, T>::type value) {
const auto data = toEndian<Endianness>(value);
rawWrite(reinterpret_cast<const char*>(std::addressof(data)), sizeof(T));
}
template <typename T>
void writeLE(T value) {
write<ByteOrderType::LittleEndian, T>(value);
}
template <typename T>
void writeBE(T value) {
write<ByteOrderType::BigEndian, T>(value);
}
};
using WriterPtr = std::unique_ptr<Writer>;
} // namespace Hessian2