// 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