libcarla/include/system/boost/json/impl/serialize.ipp
2024-10-18 13:19:59 +08:00

197 lines
3.4 KiB
C++

//
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/boostorg/json
//
#ifndef BOOST_JSON_IMPL_SERIALIZE_IPP
#define BOOST_JSON_IMPL_SERIALIZE_IPP
#include <boost/json/serialize.hpp>
#include <boost/json/serializer.hpp>
#include <ostream>
BOOST_JSON_NS_BEGIN
static
void
serialize_impl(
std::string& s,
serializer& sr)
{
// serialize to a small buffer to avoid
// the first few allocations in std::string
char buf[BOOST_JSON_STACK_BUFFER_SIZE];
string_view sv;
sv = sr.read(buf);
if(sr.done())
{
// fast path
s.append(
sv.data(), sv.size());
return;
}
std::size_t len = sv.size();
s.reserve(len * 2);
s.resize(s.capacity());
BOOST_ASSERT(
s.size() >= len * 2);
std::memcpy(&s[0],
sv.data(), sv.size());
auto const lim =
s.max_size() / 2;
for(;;)
{
sv = sr.read(
&s[0] + len,
s.size() - len);
len += sv.size();
if(sr.done())
break;
// growth factor 2x
if(s.size() < lim)
s.resize(s.size() * 2);
else
s.resize(2 * lim);
}
s.resize(len);
}
std::string
serialize(
value const& jv)
{
std::string s;
serializer sr;
sr.reset(&jv);
serialize_impl(s, sr);
return s;
}
std::string
serialize(
array const& arr)
{
std::string s;
serializer sr;
sr.reset(&arr);
serialize_impl(s, sr);
return s;
}
std::string
serialize(
object const& obj)
{
std::string s;
serializer sr;
sr.reset(&obj);
serialize_impl(s, sr);
return s;
}
std::string
serialize(
string const& str)
{
std::string s;
serializer sr;
sr.reset(&str);
serialize_impl(s, sr);
return s;
}
// this is here for key_value_pair::key()
std::string
serialize(
string_view sv)
{
std::string s;
serializer sr;
sr.reset(sv);
serialize_impl(s, sr);
return s;
}
//----------------------------------------------------------
//[example_operator_lt__lt_
// Serialize a value into an output stream
std::ostream&
operator<<( std::ostream& os, value const& jv )
{
// Create a serializer
serializer sr;
// Set the serializer up for our value
sr.reset( &jv );
// Loop until all output is produced.
while( ! sr.done() )
{
// Use a local buffer to avoid allocation.
char buf[ BOOST_JSON_STACK_BUFFER_SIZE ];
// Fill our buffer with serialized characters and write it to the output stream.
os << sr.read( buf );
}
return os;
}
//]
static
void
to_ostream(
std::ostream& os,
serializer& sr)
{
while(! sr.done())
{
char buf[BOOST_JSON_STACK_BUFFER_SIZE];
auto s = sr.read(buf);
os.write(s.data(), s.size());
}
}
std::ostream&
operator<<(
std::ostream& os,
array const& arr)
{
serializer sr;
sr.reset(&arr);
to_ostream(os, sr);
return os;
}
std::ostream&
operator<<(
std::ostream& os,
object const& obj)
{
serializer sr;
sr.reset(&obj);
to_ostream(os, sr);
return os;
}
std::ostream&
operator<<(
std::ostream& os,
string const& str)
{
serializer sr;
sr.reset(&str);
to_ostream(os, sr);
return os;
}
BOOST_JSON_NS_END
#endif