mirror of
https://github.com/nlohmann/json.git
synced 2026-07-22 10:24:54 +00:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac6b505923 | ||
|
|
7374730aed | ||
|
|
ebb3abba41 |
File diff suppressed because it is too large
Load Diff
@@ -13,6 +13,7 @@
|
|||||||
#include <iterator> // back_inserter
|
#include <iterator> // back_inserter
|
||||||
#include <memory> // shared_ptr, make_shared
|
#include <memory> // shared_ptr, make_shared
|
||||||
#include <string> // basic_string
|
#include <string> // basic_string
|
||||||
|
#include <utility> // move
|
||||||
#include <vector> // vector
|
#include <vector> // vector
|
||||||
|
|
||||||
#ifndef JSON_NO_IO
|
#ifndef JSON_NO_IO
|
||||||
@@ -118,6 +119,72 @@ class output_string_adapter : public output_adapter_protocol<CharType>
|
|||||||
StringType& str;
|
StringType& str;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @brief non-virtual output sink writing into a std::vector
|
||||||
|
///
|
||||||
|
/// Unlike output_vector_adapter, this sink is not part of the virtual
|
||||||
|
/// output_adapter_protocol hierarchy: it is passed to binary_writer by value as
|
||||||
|
/// a template parameter, so write_character()/write_characters() are ordinary
|
||||||
|
/// (inlinable) calls with no vtable lookup and no shared_ptr. It is used for the
|
||||||
|
/// common `to_cbor`/`to_msgpack`/... into a std::vector.
|
||||||
|
template<typename CharType, typename AllocatorType = std::allocator<CharType>>
|
||||||
|
class output_vector_sink
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit output_vector_sink(std::vector<CharType, AllocatorType>& vec) noexcept
|
||||||
|
: v(vec)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void write_character(CharType c)
|
||||||
|
{
|
||||||
|
v.push_back(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// no JSON_HEDLEY_NON_NULL here: binary_writer legitimately passes a null
|
||||||
|
// pointer with length 0 for empty strings/binary values. Appending an empty
|
||||||
|
// range is a no-op; the type-erased path tolerates this via the (unattributed)
|
||||||
|
// virtual base, and the concrete sink must do the same.
|
||||||
|
void write_characters(const CharType* s, std::size_t length)
|
||||||
|
{
|
||||||
|
v.insert(v.end(), s, s + length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<CharType, AllocatorType>& v;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @brief output sink forwarding to a type-erased output adapter
|
||||||
|
///
|
||||||
|
/// Wraps the polymorphic output_adapter_t so the same binary_writer template can
|
||||||
|
/// also target arbitrary adapters (output streams, strings, user-provided
|
||||||
|
/// adapters) via the `output_adapter`-based overloads. Each write still goes
|
||||||
|
/// through one virtual call, exactly as before; only the concrete sinks above
|
||||||
|
/// avoid it.
|
||||||
|
template<typename CharType>
|
||||||
|
class output_adapter_sink
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit output_adapter_sink(output_adapter_t<CharType> adapter)
|
||||||
|
: oa(std::move(adapter))
|
||||||
|
{
|
||||||
|
JSON_ASSERT(oa);
|
||||||
|
}
|
||||||
|
|
||||||
|
void write_character(CharType c)
|
||||||
|
{
|
||||||
|
oa->write_character(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// no JSON_HEDLEY_NON_NULL: forwards (null, 0) for empty payloads, exactly as
|
||||||
|
// the type-erased path already did before this sink existed
|
||||||
|
void write_characters(const CharType* s, std::size_t length)
|
||||||
|
{
|
||||||
|
oa->write_characters(s, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
output_adapter_t<CharType> oa = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
template<typename CharType, typename StringType = std::basic_string<CharType>>
|
template<typename CharType, typename StringType = std::basic_string<CharType>>
|
||||||
class output_adapter
|
class output_adapter
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
friend ::nlohmann::detail::serializer<basic_json>;
|
friend ::nlohmann::detail::serializer<basic_json>;
|
||||||
template<typename BasicJsonType>
|
template<typename BasicJsonType>
|
||||||
friend class ::nlohmann::detail::iter_impl;
|
friend class ::nlohmann::detail::iter_impl;
|
||||||
template<typename BasicJsonType, typename CharType>
|
template<typename BasicJsonType, typename CharType, typename OutputSinkType>
|
||||||
friend class ::nlohmann::detail::binary_writer;
|
friend class ::nlohmann::detail::binary_writer;
|
||||||
template<typename BasicJsonType, typename InputType, typename SAX>
|
template<typename BasicJsonType, typename InputType, typename SAX>
|
||||||
friend class ::nlohmann::detail::binary_reader;
|
friend class ::nlohmann::detail::binary_reader;
|
||||||
@@ -4327,7 +4327,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
static std::vector<std::uint8_t> to_cbor(const basic_json& j)
|
static std::vector<std::uint8_t> to_cbor(const basic_json& j)
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> result;
|
std::vector<std::uint8_t> result;
|
||||||
to_cbor(j, result);
|
detail::binary_writer<basic_json, std::uint8_t, detail::output_vector_sink<std::uint8_t>>(
|
||||||
|
detail::output_vector_sink<std::uint8_t>(result)).write_cbor(j);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4350,7 +4351,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
static std::vector<std::uint8_t> to_msgpack(const basic_json& j)
|
static std::vector<std::uint8_t> to_msgpack(const basic_json& j)
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> result;
|
std::vector<std::uint8_t> result;
|
||||||
to_msgpack(j, result);
|
detail::binary_writer<basic_json, std::uint8_t, detail::output_vector_sink<std::uint8_t>>(
|
||||||
|
detail::output_vector_sink<std::uint8_t>(result)).write_msgpack(j);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4375,7 +4377,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
const bool use_type = false)
|
const bool use_type = false)
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> result;
|
std::vector<std::uint8_t> result;
|
||||||
to_ubjson(j, result, use_size, use_type);
|
detail::binary_writer<basic_json, std::uint8_t, detail::output_vector_sink<std::uint8_t>>(
|
||||||
|
detail::output_vector_sink<std::uint8_t>(result)).write_ubjson(j, use_size, use_type);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4403,7 +4406,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
const bjdata_version_t version = bjdata_version_t::draft2)
|
const bjdata_version_t version = bjdata_version_t::draft2)
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> result;
|
std::vector<std::uint8_t> result;
|
||||||
to_bjdata(j, result, use_size, use_type, version);
|
detail::binary_writer<basic_json, std::uint8_t, detail::output_vector_sink<std::uint8_t>>(
|
||||||
|
detail::output_vector_sink<std::uint8_t>(result)).write_ubjson(j, use_size, use_type, true, true, version);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4430,7 +4434,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec
|
|||||||
static std::vector<std::uint8_t> to_bson(const basic_json& j)
|
static std::vector<std::uint8_t> to_bson(const basic_json& j)
|
||||||
{
|
{
|
||||||
std::vector<std::uint8_t> result;
|
std::vector<std::uint8_t> result;
|
||||||
to_bson(j, result);
|
detail::binary_writer<basic_json, std::uint8_t, detail::output_vector_sink<std::uint8_t>>(
|
||||||
|
detail::output_vector_sink<std::uint8_t>(result)).write_bson(j);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+319
-162
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user