16 #ifndef INCLUDE_NN_NLIB_MSGPACK_MPDIRECTWRITER_H_ 17 #define INCLUDE_NN_NLIB_MSGPACK_MPDIRECTWRITER_H_ 72 #ifdef NLIB_LITTLE_ENDIAN 75 nlib_memcpy(p, 2, &val, 2);
78 #ifdef NLIB_LITTLE_ENDIAN 81 nlib_memcpy(p, 4, &val, 4);
84 #ifdef NLIB_LITTLE_ENDIAN 87 nlib_memcpy(p, 8, &val, 8);
93 #define NLIB_CHK_(p, n, pend) \ 94 if (NLIB_UNLIKELY((p) + (n) > (pend))) { \ 95 NLIB_ASSERT((p) + (n) <= (pend)); \ 101 NLIB_CHK_(p, 2, pend);
109 NLIB_CHK_(p, 3, pend);
116 NLIB_CHK_(p, 5, pend);
123 NLIB_CHK_(p, 9, pend);
130 NLIB_CHK_(p, 2, pend);
137 NLIB_CHK_(p, 3, pend);
139 EncU16(p + 1, static_cast<uint16_t>(val));
144 NLIB_CHK_(p, 5, pend);
146 EncU32(p + 1, static_cast<uint32_t>(val));
151 NLIB_CHK_(p, 9, pend);
153 EncU64(p + 1, static_cast<uint64_t>(val));
158 NLIB_CHK_(p, 1, pend);
164 NLIB_CHK_(p, 1, pend);
170 NLIB_CHK_(p, 5, pend);
177 EncU32(p + 1, tmp.u32);
182 NLIB_CHK_(p, 9, pend);
189 EncU64(p + 1, tmp.u64);
195 NLIB_CHK_(p, 1, pend);
198 }
else if (len < 256U) {
199 NLIB_CHK_(p, 2, pend);
203 }
else if (len < 65536U) {
204 NLIB_CHK_(p, 3, pend);
206 EncU16(p + 1, static_cast<uint16_t>(len));
209 NLIB_CHK_(p, 5, pend);
218 NLIB_CHK_(p, 1 + len, pend);
220 nlib_memcpy(p + 1, len, str, len);
222 }
else if (len < 256U) {
223 NLIB_CHK_(p, 2 + len, pend);
226 nlib_memcpy(p + 2, len, str, len);
228 }
else if (len < 65536U) {
229 NLIB_CHK_(p, 3 + len, pend);
231 EncU16(p + 1, static_cast<uint16_t>(len));
232 nlib_memcpy(p + 3, len, str, len);
235 NLIB_CHK_(p, 5 + len, pend);
238 nlib_memcpy(p + 5, len, str, len);
244 return WriteString(p, pend, str, static_cast<uint32_t>(
nlib_strlen(str)));
249 NLIB_CHK_(p, 2, pend);
253 }
else if (n < 65536U) {
254 NLIB_CHK_(p, 3, pend);
256 EncU16(p + 1, static_cast<uint16_t>(n));
259 NLIB_CHK_(p, 5, pend);
268 NLIB_CHK_(p, 2 + n, pend);
271 nlib_memcpy(p + 2, n, bin, n);
273 }
else if (n < 65536U) {
274 NLIB_CHK_(p, 3 + n, pend);
276 EncU16(p + 1, static_cast<uint16_t>(n));
277 nlib_memcpy(p + 3, n, bin, n);
280 NLIB_CHK_(p, 5 + n, pend);
283 nlib_memcpy(p + 5, n, bin, n);
292 NLIB_CHK_(p, 2, pend);
297 NLIB_CHK_(p, 2, pend);
302 NLIB_CHK_(p, 2, pend);
307 NLIB_CHK_(p, 2, pend);
312 NLIB_CHK_(p, 2, pend);
317 NLIB_CHK_(p, 3 + n, pend);
323 }
else if (n < 65536U) {
324 NLIB_CHK_(p, 4, pend);
326 EncU16(p + 1, static_cast<uint16_t>(n));
330 NLIB_CHK_(p, 6, pend);
342 NLIB_CHK_(p, 3, pend);
348 NLIB_CHK_(p, 4, pend);
355 NLIB_CHK_(p, 6, pend);
358 nlib_memcpy(p + 2, 4, data, 4);
361 NLIB_CHK_(p, 10, pend);
364 nlib_memcpy(p + 2, 8, data, 8);
367 NLIB_CHK_(p, 18, pend);
370 nlib_memcpy(p + 2, 16, data, 16);
373 NLIB_CHK_(p, 3 + n, pend);
377 nlib_memcpy(p + 3, n, data, n);
380 }
else if (n < 65536U) {
381 NLIB_CHK_(p, 4 + n, pend);
383 EncU16(p + 1, static_cast<uint16_t>(n));
385 nlib_memcpy(p + 4, n, data, n);
388 NLIB_CHK_(p, 6 + n, pend);
392 nlib_memcpy(p + 6, n, data, n);
399 NLIB_CHK_(p, 1, pend);
402 }
else if (count < 65536U) {
403 NLIB_CHK_(p, 3, pend);
405 EncU16(p + 1, static_cast<uint16_t>(count));
408 NLIB_CHK_(p, 5, pend);
410 EncU32(p + 1, count);
417 NLIB_CHK_(p, 1, pend);
420 }
else if (count < 65536U) {
421 NLIB_CHK_(p, 3, pend);
423 EncU16(p + 1, static_cast<uint16_t>(count));
426 NLIB_CHK_(p, 5, pend);
428 EncU32(p + 1, count);
435 NLIB_CHK_(p, 1, pend);
439 return WriteUint8(p, pend, static_cast<uint8_t>(val));
445 NLIB_CHK_(p, 1, pend);
448 }
else if (val < 256U) {
449 return WriteUint8(p, pend, static_cast<uint8_t>(val));
451 return WriteUint16(p, pend, static_cast<uint16_t>(val));
458 NLIB_CHK_(p, 1, pend);
462 return WriteUint8(p, pend, static_cast<uint8_t>(val));
464 }
else if (val < 65536U) {
465 return WriteUint16(p, pend, static_cast<uint16_t>(val));
467 return WriteUint32(p, pend, val);
472 if (val < 0x100000000ULL) {
473 return WriteUnsignedInt(p, pend, static_cast<uint32_t>(val));
475 return WriteUint64(p, pend, val);
481 return WriteInt8(p, pend, static_cast<int8_t>(val));
483 NLIB_CHK_(p, 1, pend);
491 if (val < INT8_MIN) {
492 return WriteInt16(p, pend, static_cast<int16_t>(val));
493 }
else if (val < -32) {
494 return WriteInt8(p, pend, static_cast<int8_t>(val));
496 NLIB_CHK_(p, 1, pend);
501 return WriteUnsignedInt(p, pend, static_cast<uint16_t>(val));
507 if (val < INT8_MIN) {
508 if (val < INT16_MIN) {
509 return WriteInt32(p, pend, val);
511 return WriteInt16(p, pend, static_cast<int16_t>(val));
513 }
else if (val < -32) {
514 return WriteInt8(p, pend, static_cast<int8_t>(val));
516 NLIB_CHK_(p, 1, pend);
521 return WriteUnsignedInt(p, pend, static_cast<uint32_t>(val));
527 if (val < INT32_MIN) {
528 return WriteInt64(p, pend, val);
530 return WriteInt(p, pend, static_cast<int32_t>(val));
533 return WriteUnsignedInt(p, pend, static_cast<uint64_t>(val));
539 uint64_t data64 = (
static_cast<uint64_t
>(nsec) << 34) |
static_cast<uint64_t
>(sec);
540 if (data64 < 0x100000000ULL) {
542 NLIB_CHK_(p, 6, pend);
545 EncU32(p + 2, static_cast<uint32_t>(data64));
549 NLIB_CHK_(p, 10, pend);
552 EncU64(p + 2, data64);
557 NLIB_CHK_(p, 15, pend);
561 EncU32(p + 3, static_cast<uint32_t>(nsec));
562 EncU64(p + 7, static_cast<uint64_t>(sec));
569 NLIB_TO_SEC_NSEC(sec, nsec, val);
570 return WriteTimestamp(p, pend, sec, nsec);
577 #endif // INCLUDE_NN_NLIB_MSGPACK_MPDIRECTWRITER_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
MessagePackをメモリに直接書き込むための各種静的メンバ関数が定義されています。