From 1d055261b4144dbf86b2658437015b15d4dd9bff Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 4 Sep 2022 00:32:56 +0100 Subject: initial --- include/jsoncons/encode_json.hpp | 315 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 include/jsoncons/encode_json.hpp (limited to 'include/jsoncons/encode_json.hpp') diff --git a/include/jsoncons/encode_json.hpp b/include/jsoncons/encode_json.hpp new file mode 100644 index 0000000..706dc44 --- /dev/null +++ b/include/jsoncons/encode_json.hpp @@ -0,0 +1,315 @@ +// Copyright 2017 Daniel Parker +// Distributed under the Boost license, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +// See https://github.com/danielaparker/jsoncons for latest version + +#ifndef JSONCONS_ENCODE_JSON_HPP +#define JSONCONS_ENCODE_JSON_HPP + +#include +#include +#include +#include +#include // std::basic_istream +#include +#include + +namespace jsoncons { + + // to string + + template + typename std::enable_if::value && + type_traits::is_back_insertable_char_container::value>::type + encode_json(const T& val, + Container& s, + const basic_json_encode_options& options = + basic_json_encode_options()) + { + using char_type = typename Container::value_type; + + basic_compact_json_encoder> encoder(s, options); + val.dump(encoder); + } + + template + typename std::enable_if::value && + type_traits::is_back_insertable_char_container::value>::type + encode_json(const T& val, + Container& s, + const basic_json_encode_options& options = basic_json_encode_options()) + { + using char_type = typename Container::value_type; + + basic_compact_json_encoder> encoder(s, options); + encode_json(val, encoder); + } + + // to stream + + template + typename std::enable_if::value>::type + encode_json(const T& val, + std::basic_ostream& os, + const basic_json_encode_options& options = basic_json_encode_options()) + { + basic_compact_json_encoder encoder(os, options); + val.dump(encoder); + } + + template + typename std::enable_if::value>::type + encode_json(const T& val, + std::basic_ostream& os, + const basic_json_encode_options& options = basic_json_encode_options()) + { + basic_compact_json_encoder encoder(os, options); + encode_json(val, encoder); + } + + // encode_json_pretty + + template + typename std::enable_if::value && + type_traits::is_back_insertable_char_container::value>::type + encode_json_pretty(const T& val, + Container& s, + const basic_json_encode_options& options = basic_json_encode_options()) + { + using char_type = typename Container::value_type; + + basic_json_encoder> encoder(s, options); + val.dump(encoder); + } + + template + typename std::enable_if::value && + type_traits::is_back_insertable_char_container::value>::type + encode_json_pretty(const T& val, + Container& s, + const basic_json_encode_options& options = basic_json_encode_options()) + { + using char_type = typename Container::value_type; + basic_json_encoder> encoder(s, options); + encode_json(val, encoder); + } + + template + typename std::enable_if::value>::type + encode_json_pretty(const T& val, + std::basic_ostream& os, + const basic_json_encode_options& options = basic_json_encode_options()) + { + basic_json_encoder encoder(os, options); + val.dump(encoder); + } + + template + typename std::enable_if::value>::type + encode_json_pretty(const T& val, + std::basic_ostream& os, + const basic_json_encode_options& options = basic_json_encode_options()) + { + basic_json_encoder encoder(os, options); + encode_json(val, encoder); + } + + template + void encode_json(const T& val, basic_json_visitor& encoder) + { + std::error_code ec; + encode_traits::encode(val, encoder, basic_json(), ec); + if (ec) + { + JSONCONS_THROW(ser_error(ec)); + } + encoder.flush(); + } + + template + void encode_json(temp_allocator_arg_t, const TempAllocator& temp_alloc, + const T& val, + Container& s, + indenting line_indent = indenting::no_indent) + { + encode_json(temp_allocator_arg, temp_alloc, val, s, basic_json_encode_options(), line_indent); + } + +// legacy + + template + void encode_json(const T& val, Container& s, indenting line_indent) + { + if (line_indent == indenting::indent) + { + encode_json_pretty(val,s); + } + else + { + encode_json(val,s); + } + } + + template + void encode_json(const T& val, + Container& s, + const basic_json_encode_options& options, + indenting line_indent) + { + if (line_indent == indenting::indent) + { + encode_json_pretty(val,s,options); + } + else + { + encode_json(val,s,options); + } + } + + template + void encode_json(const T& val, + std::basic_ostream& os, + indenting line_indent) + { + if (line_indent == indenting::indent) + { + encode_json_pretty(val, os); + } + else + { + encode_json(val, os); + } + } + + template + void encode_json(const T& val, + std::basic_ostream& os, + const basic_json_encode_options& options, + indenting line_indent) + { + if (line_indent == indenting::indent) + { + encode_json_pretty(val, os, options); + } + else + { + encode_json(val, os, options); + } + } + +//end legacy + + template + typename std::enable_if::value && + type_traits::is_back_insertable_char_container::value>::type + encode_json(temp_allocator_arg_t, const TempAllocator& temp_alloc, + const T& val, + Container& s, + const basic_json_encode_options& options, + indenting line_indent = indenting::no_indent) + { + using char_type = typename Container::value_type; + if (line_indent == indenting::indent) + { + basic_json_encoder,TempAllocator> encoder(s, options, temp_alloc); + val.dump(encoder); + } + else + { + basic_compact_json_encoder,TempAllocator> encoder(s, options, temp_alloc); + val.dump(encoder); + } + } + + template + typename std::enable_if::value && + type_traits::is_back_insertable_char_container::value>::type + encode_json(temp_allocator_arg_t, const TempAllocator& temp_alloc, + const T& val, + Container& s, + const basic_json_encode_options& options, + indenting line_indent) + { + using char_type = typename Container::value_type; + if (line_indent == indenting::indent) + { + basic_json_encoder,TempAllocator> encoder(s, options, temp_alloc); + encode_json(temp_allocator_arg, temp_alloc, val, encoder); + } + else + { + basic_compact_json_encoder,TempAllocator> encoder(s, options, temp_alloc); + encode_json(temp_allocator_arg, temp_alloc, val, encoder); + } + } + + template + void encode_json(temp_allocator_arg_t, const TempAllocator& temp_alloc, + const T& val, + std::basic_ostream& os, + indenting line_indent = indenting::no_indent) + { + encode_json(temp_allocator_arg, temp_alloc, val, os, basic_json_encode_options(), line_indent); + } + + template + typename std::enable_if::value>::type + encode_json(temp_allocator_arg_t, const TempAllocator& temp_alloc, + const T& val, + std::basic_ostream& os, + const basic_json_encode_options& options, + indenting line_indent = indenting::no_indent) + { + if (line_indent == indenting::indent) + { + basic_json_encoder,TempAllocator> encoder(os, options, temp_alloc); + val.dump(encoder); + } + else + { + basic_compact_json_encoder,TempAllocator> encoder(os, options, temp_alloc); + val.dump(encoder); + } + } + + template + typename std::enable_if::value>::type + encode_json(temp_allocator_arg_t, const TempAllocator& temp_alloc, + const T& val, + std::basic_ostream& os, + const basic_json_encode_options& options, + indenting line_indent) + { + if (line_indent == indenting::indent) + { + basic_json_encoder encoder(os, options); + encode_json(temp_allocator_arg, temp_alloc, val, encoder); + } + else + { + basic_compact_json_encoder encoder(os, options); + encode_json(temp_allocator_arg, temp_alloc, val, encoder); + } + } + + template + typename std::enable_if::value>::type + encode_json(temp_allocator_arg_t, const TempAllocator& temp_alloc, + const T& val, + basic_json_visitor& encoder) + { + std::error_code ec; + basic_json proto(temp_alloc); + encode_traits::encode(val, encoder, proto, ec); + if (ec) + { + JSONCONS_THROW(ser_error(ec)); + } + encoder.flush(); + } + +} // jsoncons + +#endif + -- cgit v1.2.3