19 #ifndef PSTORE_SERIALIZE_STANDARD_TYPES_HPP 20 #define PSTORE_SERIALIZE_STANDARD_TYPES_HPP 51 template <
typename Archive,
typename StringType>
52 static auto write (Archive && archive, StringType
const & str)
53 -> archive_result_type<Archive> {
54 auto const length = str.length ();
57 std::array<std::uint8_t, varint::max_output_length> encoded_length;
58 auto first = std::begin (encoded_length);
59 auto last = varint::encode (length, first);
60 auto length_bytes = std::distance (first, last);
61 PSTORE_ASSERT (length_bytes > 0 &&
62 static_cast<std::size_t> (length_bytes) <= encoded_length.size ());
63 if (length_bytes == 1) {
67 auto const resl = serialize::write (std::forward<Archive> (archive),
68 gsl::make_span (&(*first), &(*last)));
71 serialize::write (std::forward<Archive> (archive), gsl::make_span (str));
75 template <
typename Archive>
76 static std::size_t read_length (Archive && archive) {
77 std::array<std::uint8_t, varint::max_output_length> encoded_length{{0}};
80 static_assert (varint::max_output_length >= 2,
81 "maximum encoded varint length must be >= 2");
82 serialize::read_uninit (std::forward<Archive> (archive),
83 gsl::make_span (encoded_length.data (), 2));
85 auto const varint_length = varint::decode_size (std::begin (encoded_length));
86 PSTORE_ASSERT (varint_length > 0);
89 if (varint_length > 2) {
90 PSTORE_ASSERT (varint_length <= encoded_length.size ());
91 serialize::read_uninit (
92 std::forward<Archive> (archive),
93 gsl::make_span (encoded_length.data () + 2, varint_length - 2));
96 return varint::decode (encoded_length.data (), varint_length);
103 using value_type = std::string;
106 template <
typename Archive>
107 static auto write (Archive && archive, value_type
const & str)
108 -> archive_result_type<Archive> {
117 template <
typename Archive>
118 static void read (Archive && archive, value_type & str) {
120 new (&str) value_type;
124 auto dtor = [] (value_type *
const p) {
125 using string = std::string;
128 std::unique_ptr<value_type, decltype (dtor)>
deleter (&str, dtor);
130 auto const length = string_helper::read_length (std::forward<Archive> (archive));
133 #ifdef PSTORE_HAVE_NON_CONST_STD_STRING_DATA 134 char *
const data = str.data ();
138 auto *
const data =
const_cast<char *
> (str.data ());
141 serialize::read_uninit (
142 std::forward<Archive> (archive),
143 gsl::make_span (data, static_cast<std::ptrdiff_t> (length)));
155 using value_type = std::string;
156 template <
typename Archive>
157 static auto write (Archive && archive, value_type
const & str)
158 -> archive_result_type<Archive> {
161 template <
typename Archive>
162 static void read (Archive && archive, value_type & str) {
163 serialize::read_uninit (std::forward<Archive> (archive), str);
170 template <
typename Container>
181 template <
typename Archive>
182 static auto write (Archive && archive, Container
const & ty)
183 -> archive_result_type<Archive> {
186 serialize::write (std::forward<Archive> (archive), std::size_t{ty.size ()});
187 for (
typename Container::value_type
const & m : ty) {
188 serialize::write (std::forward<Archive> (archive), m);
193 using insert_callback = std::function<void (typename Container::value_type const &)>;
206 template <
typename Archive>
207 static void read (Archive && archive, insert_callback inserter) {
210 auto const num_members =
211 serialize::read<std::size_t> (std::forward<Archive> (archive));
212 auto num_read = std::size_t{0};
213 for (; num_read < num_members; ++num_read) {
214 inserter (serialize::read<typename Container::value_type> (
215 std::forward<Archive> (archive)));
222 template <
typename T>
224 using value_type = std::atomic<T>;
232 template <
typename Archive>
233 static auto write (Archive && archive, value_type
const & value)
234 -> archive_result_type<Archive> {
235 return serialize::write (std::forward<Archive> (archive), value.load ());
242 template <
typename Archive>
243 static void read (Archive && archive, value_type & value) {
244 serialize::read_uninit<T> (std::forward<Archive> (archive), value);
250 template <
typename T,
typename U>
252 using value_type = std::pair<T, U>;
261 template <
typename Archive>
262 static auto write (Archive && archive, value_type
const & value)
263 -> archive_result_type<Archive> {
265 auto const result = serialize::write (std::forward<Archive> (archive), value.first);
266 serialize::write (std::forward<Archive> (archive), value.second);
275 template <
typename Archive>
276 static void read (Archive && archive, value_type & value) {
277 serialize::read_uninit (std::forward<Archive> (archive), value.first);
278 serialize::read_uninit (std::forward<Archive> (archive), value.second);
284 #endif // PSTORE_SERIALIZE_STANDARD_TYPES_HPP Definition: standard_types.hpp:36
static void read(Archive &&archive, value_type &value)
Reads an instance of std::pair<> from an archive.
Definition: standard_types.hpp:276
static void read(Archive &&archive, value_type &value)
Reads an instance of std::atomic<> from an archive.
Definition: standard_types.hpp:243
The primary template for serialization of non standard layout types.
Definition: types.hpp:118
static auto write(Archive &&archive, value_type const &str) -> archive_result_type< Archive >
Writes an instance of std::string to an archive.
Definition: standard_types.hpp:107
static auto write(Archive &&archive, StringType const &str) -> archive_result_type< Archive >
Writes an instance of a string type (e.g.
Definition: standard_types.hpp:52
static auto write(Archive &&archive, Ty const &v) -> archive_result_type< Archive >
Writes an single value of type Ty to an archive.
Definition: types.hpp:133
A helper class which can be used to emit containers which have a size() method and which support the ...
Definition: standard_types.hpp:171
Definition: chunked_sequence.hpp:607
posix::deleter deleter
The cross-platform name for the deleter class.
Definition: file_posix.hpp:54
Provides serialization capabilities for trivial and user-defined types.
Ty read(Archive &&archive)
Read a single value from an archive.
Definition: types.hpp:412
Definition: nonpod2.cpp:40
static void read(Archive &&archive, value_type &str)
Reads an instance of std::string from an archiver.
Definition: standard_types.hpp:118
static auto write(Archive &&archive, value_type const &value) -> archive_result_type< Archive >
Writes an instance of std::pair<> to an archive.
Definition: standard_types.hpp:262
static auto write(Archive &&archive, Container const &ty) -> archive_result_type< Archive >
Writes the contents of a container to an archive.
Definition: standard_types.hpp:182
Implements a prefix-style variable-length integer.
static auto write(Archive &&archive, value_type const &value) -> archive_result_type< Archive >
Writes an instance of std::atomic<> to an archive.
Definition: standard_types.hpp:233
static void read(Archive &&archive, insert_callback inserter)
Reads the contents of a container from an archive.
Definition: standard_types.hpp:207