File tree Expand file tree Collapse file tree 1 file changed +22
-0
lines changed Expand file tree Collapse file tree 1 file changed +22
-0
lines changed Original file line number Diff line number Diff line change @@ -513,6 +513,28 @@ struct VarIntFormatter
513
513
}
514
514
};
515
515
516
+ template <int Bytes>
517
+ struct CustomUintFormatter
518
+ {
519
+ static_assert (Bytes > 0 && Bytes <= 8 , " CustomUintFormatter Bytes out of range" );
520
+ static constexpr uint64_t MAX = 0xffffffffffffffff >> (8 * (8 - Bytes));
521
+
522
+ template <typename Stream, typename I> void Ser (Stream& s, I v)
523
+ {
524
+ if (v < 0 || v > MAX) throw std::ios_base::failure (" CustomUintFormatter value out of range" );
525
+ uint64_t raw = htole64 (v);
526
+ s.write ((const char *)&raw, Bytes);
527
+ }
528
+
529
+ template <typename Stream, typename I> void Unser (Stream& s, I& v)
530
+ {
531
+ static_assert (std::numeric_limits<I>::max () >= MAX && std::numeric_limits<I>::min () <= 0 , " CustomUintFormatter type too small" );
532
+ uint64_t raw = 0 ;
533
+ s.read ((char *)&raw, Bytes);
534
+ v = le64toh (raw);
535
+ }
536
+ };
537
+
516
538
/* * Serialization wrapper class for big-endian integers.
517
539
*
518
540
* Use this wrapper around integer types that are stored in memory in native
You can’t perform that action at this time.
0 commit comments