9void putLe16(std::vector<char>& buf, uint16_t
v) {
10 buf.push_back(
static_cast<char>(
v & 0xff));
11 buf.push_back(
static_cast<char>((
v >> 8) & 0xff));
14void putLe32(std::vector<char>& buf, uint32_t
v) {
15 buf.push_back(
static_cast<char>(
v & 0xff));
16 buf.push_back(
static_cast<char>((
v >> 8) & 0xff));
17 buf.push_back(
static_cast<char>((
v >> 16) & 0xff));
18 buf.push_back(
static_cast<char>((
v >> 24) & 0xff));
21void putLe64(std::vector<char>& buf, uint64_t
v) {
22 for (
int i = 0; i < 8; ++i) {
23 buf.push_back(
static_cast<char>((
v >> (8 * i)) & 0xff));
27uint16_t getLe16(
const char*
p) {
28 return static_cast<uint16_t
>(uint8_t(
p[0])) |
29 (
static_cast<uint16_t
>(uint8_t(
p[1])) << 8);
32uint32_t getLe32(
const char*
p) {
33 return static_cast<uint32_t
>(uint8_t(
p[0])) |
34 (
static_cast<uint32_t
>(uint8_t(
p[1])) << 8) |
35 (
static_cast<uint32_t
>(uint8_t(
p[2])) << 16) |
36 (
static_cast<uint32_t
>(uint8_t(
p[3])) << 24);
39uint64_t getLe64(
const char*
p) {
41 for (
int i = 0; i < 8; ++i) {
42 v |= (uint64_t(uint8_t(
p[i])) << (8 * i));
49void NetWriter::put(
const void*
d,
size_t n) {
50 if (!
d ||
n == 0)
return;
51 const char*
p =
static_cast<const char*
>(
d);
52 buf_.insert(buf_.end(),
p,
p +
n);
56 buf_.push_back(
static_cast<char>(
v));
60 buf_.push_back(
static_cast<char>(
v));
68 putLe16(buf_,
static_cast<uint16_t
>(
v));
76 putLe32(buf_,
static_cast<uint32_t
>(
v));
84 putLe64(buf_,
static_cast<uint64_t
>(
v));
89 static_assert(
sizeof(bits) ==
sizeof(
v),
"float must be 32-bit");
90 std::memcpy(&bits, &
v,
sizeof(bits));
96 static_assert(
sizeof(bits) ==
sizeof(
v),
"double must be 64-bit");
97 std::memcpy(&bits, &
v,
sizeof(bits));
102 buf_.push_back(
v ? 1 : 0);
106 putLe32(buf_,
static_cast<uint32_t
>(
s.size()));
107 put(
s.data(),
s.size());
111 putLe32(buf_,
static_cast<uint32_t
>(
n));
124 if (
d ==
nullptr &&
n != 0) {
128 data_ =
static_cast<const char*
>(
d);
135bool NetReader::take(
void* out,
size_t n) {
136 if (!ok_)
return false;
137 if (
n > size_ - pos_) {
141 if (out &&
n > 0) std::memcpy(out, data_ + pos_,
n);
148 return size_ >= pos_ ? size_ - pos_ : 0;
164 char tmp[2] = {0, 0};
165 if (!take(tmp, 2))
return 0;
170 return static_cast<int16_t
>(
u16());
174 char tmp[4] = {0, 0, 0, 0};
175 if (!take(tmp, 4))
return 0;
180 return static_cast<int32_t
>(
u32());
184 char tmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
185 if (!take(tmp, 8))
return 0;
190 return static_cast<int64_t
>(
u64());
194 uint32_t bits =
u32();
196 std::memcpy(&
v, &bits,
sizeof(
v));
201 uint64_t bits =
u64();
203 std::memcpy(&
v, &bits,
sizeof(
v));
216 if (!take(out.data(),
n)) {
224 std::vector<char> out;
225 uint32_t len =
u32();
231 if (!take(out.data(),
n)) out.clear();
std::vector< char > bytes(size_t n)
bool init(const void *d, size_t n)
void writeBytes(const void *d, size_t n)
void writeString(const std::string &s)
void writeU64(uint64_t v)
void writeU16(uint16_t v)
void writeU32(uint32_t v)