39#include <boost/endian/conversion.hpp>
40#include <boost/type_traits/make_unsigned.hpp>
60template <
bool IsSaving>
71 void tag(
const char *) { }
96 :
base_type(), bytes_(
s), begin_(
s.begin()), good_(
true), varint_bug_backward_compatibility_(
false)
103 bool eof()
const noexcept {
return bytes_.empty(); }
104 std::size_t
getpos()
const noexcept {
return bytes_.begin() - begin_; }
109 serialize_uint(*(
typename boost::make_unsigned<T>::type *)&v);
119 const std::size_t actual = bytes_.remove_prefix(
sizeof(T));
120 good_ &= (actual ==
sizeof(
T));
121 if (actual ==
sizeof(T))
123 std::memcpy(std::addressof(v), bytes_.data() -
sizeof(T),
sizeof(T));
124 boost::endian::little_to_native_inplace(v);
132 const std::size_t actual = bytes_.remove_prefix(len);
133 good_ &= (len == actual);
134 std::memcpy(
buf, bytes_.data() - actual, actual);
140 serialize_uvarint(*(
typename boost::make_unsigned<T>::type *)(&v));
146 auto current = bytes_.cbegin();
147 auto end = bytes_.cend();
149 current = std::min(current, bytes_.cend());
150 bytes_ = {current, std::size_t(bytes_.cend() - current)};
185 bool good()
const {
return stream_.good(); }
186 void set_fail() { stream_.setstate(std::ios::failbit); }
188 std::streampos
getpos()
const {
return stream_.tellp(); }
193 serialize_uint(
static_cast<typename boost::make_unsigned<T>::type
>(v));
198 for (
size_t i = 0; i <
sizeof(
T); i++) {
199 stream_.put((
char)(v & 0xff));
200 if (1 <
sizeof(T)) v >>= 8;
206 stream_.write((
char *)
buf, len);
212 serialize_uvarint(*(
typename boost::make_unsigned<T>::type *)(&v));
218 typedef std::ostreambuf_iterator<char> it;
#define s(x, c)
Definition aesb.c:47
Non-owning sequence of data. Does not deep copy.
Definition span.h:55
#define const
Definition ipfrdr.c:80
const char * buf
Definition slow_memmem.cpp:73
#define true
Definition stdbool.h:36
#define false
Definition stdbool.h:37
unsigned char uint8_t
Definition stdint.h:124
bool good() const noexcept
Definition binary_archive.h:99
void begin_array(size_t &s)
Definition binary_archive.h:153
void end_string(const char *delimiter)
Definition binary_archive.h:163
void enable_varint_bug_backward_compatibility()
Definition binary_archive.h:170
bool eof() const noexcept
If implementing as std::istream, reset stream error state after peek() call.
Definition binary_archive.h:103
binary_archive(epee::span< const std::uint8_t > s)
Definition binary_archive.h:95
epee::span< const std::uint8_t > bytes_
Definition binary_archive.h:173
void delimit_array()
Definition binary_archive.h:159
void serialize_varint(T &v)
Definition binary_archive.h:138
void serialize_uint(T &v)
serializes an unsigned integer
Definition binary_archive.h:117
void serialize_blob(void *buf, size_t len, const char *delimiter="")
Definition binary_archive.h:130
size_t remaining_bytes() const noexcept
Definition binary_archive.h:169
void read_variant_tag(variant_tag_type &t)
Definition binary_archive.h:165
void serialize_uvarint(T &v)
Definition binary_archive.h:144
bool good_
Definition binary_archive.h:175
void serialize_int(T &v)
Definition binary_archive.h:107
void end_array()
Definition binary_archive.h:160
bool varint_bug_backward_compatibility_
Definition binary_archive.h:176
void begin_string(const char *delimiter)
Definition binary_archive.h:162
void begin_array()
Definition binary_archive.h:158
std::size_t getpos() const noexcept
Definition binary_archive.h:104
std::uint8_t const *const begin_
Definition binary_archive.h:174
bool varint_bug_backward_compatibility_enabled() const
Definition binary_archive.h:171
void set_fail() noexcept
Definition binary_archive.h:100
std::streampos getpos() const
Definition binary_archive.h:188
bool varint_bug_backward_compatibility_enabled() const
Definition binary_archive.h:236
void end_string(const char *delimiter="\"")
Definition binary_archive.h:230
void serialize_blob(void *buf, size_t len, const char *delimiter="")
Definition binary_archive.h:204
void serialize_uvarint(T &v)
Definition binary_archive.h:216
stream_type & stream_
Definition binary_archive.h:238
void serialize_int(T v)
Definition binary_archive.h:191
binary_archive(stream_type &s)
Definition binary_archive.h:183
void begin_string(const char *delimiter="\"")
Definition binary_archive.h:229
void write_variant_tag(variant_tag_type t)
Definition binary_archive.h:232
void delimit_array()
Definition binary_archive.h:226
void end_array()
Definition binary_archive.h:227
std::ostream stream_type
Definition binary_archive.h:182
bool good() const
Definition binary_archive.h:185
void serialize_varint(T &v)
Definition binary_archive.h:210
void begin_array(size_t s)
Definition binary_archive.h:221
void serialize_uint(T v)
Definition binary_archive.h:196
void begin_array()
Definition binary_archive.h:225
void set_fail()
Definition binary_archive.h:186
base for the binary archive type
Definition binary_archive.h:62
uint8_t variant_tag_type
Definition binary_archive.h:66
void begin_object()
Definition binary_archive.h:72
boost::mpl::bool_< IsSaving > is_saving
Definition binary_archive.h:64
binary_archive_base< IsSaving > base_type
Definition binary_archive.h:63
binary_archive_base()
Definition binary_archive.h:68
void end_object()
Definition binary_archive.h:73
void end_variant()
Definition binary_archive.h:75
void begin_variant()
Definition binary_archive.h:74
void tag(const char *)
Definition binary_archive.h:71
Definition binary_archive.h:89
provides the implementation of varint's
#define DISABLE_VS_WARNINGS(w)
Definition warnings.h:18
#define POP_WARNINGS
Definition warnings.h:17
#define PUSH_WARNINGS
Definition warnings.h:16