1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/// Copyright 2013-2025 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_EXT_CSV_ENCODE_CSV_HPP
#define JSONCONS_EXT_CSV_ENCODE_CSV_HPP
#include <ostream>
#include <jsoncons/config/compiler_support.hpp>
#include <jsoncons/json_exception.hpp>
#include <jsoncons/utility/extension_traits.hpp>
#include <jsoncons_ext/csv/csv_encoder.hpp>
#include <jsoncons_ext/csv/csv_options.hpp>
#include <jsoncons_ext/csv/csv_reader.hpp>
#include <jsoncons/basic_json.hpp>
#include <jsoncons/encode_traits.hpp>
#include <jsoncons/sink.hpp>
namespace jsoncons {
namespace csv {
template <typename T,typename CharContainer>
typename std::enable_if<extension_traits::is_basic_json<T>::value &&
extension_traits::is_back_insertable_char_container<CharContainer>::value>::type
encode_csv(const T& j, CharContainer& cont, const basic_csv_encode_options<typename CharContainer::value_type>& options = basic_csv_encode_options<typename CharContainer::value_type>())
{
using char_type = typename CharContainer::value_type;
basic_csv_encoder<char_type,jsoncons::string_sink<std::basic_string<char_type>>> encoder(cont,options);
j.dump(encoder);
}
template <typename T,typename CharContainer>
typename std::enable_if<!extension_traits::is_basic_json<T>::value &&
extension_traits::is_back_insertable_char_container<CharContainer>::value>::type
encode_csv(const T& val, CharContainer& cont, const basic_csv_encode_options<typename CharContainer::value_type>& options = basic_csv_encode_options<typename CharContainer::value_type>())
{
using char_type = typename CharContainer::value_type;
basic_csv_encoder<char_type,jsoncons::string_sink<std::basic_string<char_type>>> encoder(cont,options);
std::error_code ec;
encode_traits<T,char_type>::encode(val, encoder, json(), ec);
if (JSONCONS_UNLIKELY(ec))
{
JSONCONS_THROW(ser_error(ec));
}
}
template <typename T,typename CharT>
typename std::enable_if<extension_traits::is_basic_json<T>::value,void>::type
encode_csv(const T& j, std::basic_ostream<CharT>& os, const basic_csv_encode_options<CharT>& options = basic_csv_encode_options<CharT>())
{
using char_type = CharT;
basic_csv_encoder<char_type,jsoncons::stream_sink<char_type>> encoder(os,options);
j.dump(encoder);
}
template <typename T,typename CharT>
typename std::enable_if<!extension_traits::is_basic_json<T>::value,void>::type
encode_csv(const T& val, std::basic_ostream<CharT>& os, const basic_csv_encode_options<CharT>& options = basic_csv_encode_options<CharT>())
{
using char_type = CharT;
basic_csv_encoder<char_type,jsoncons::stream_sink<char_type>> encoder(os,options);
std::error_code ec;
encode_traits<T,CharT>::encode(val, encoder, json(), ec);
if (JSONCONS_UNLIKELY(ec))
{
JSONCONS_THROW(ser_error(ec));
}
}
// with alloc_set.get_temp_allocator()ator_arg_t
template <typename T,typename CharContainer,typename Allocator,typename TempAllocator >
typename std::enable_if<extension_traits::is_basic_json<T>::value &&
extension_traits::is_back_insertable_char_container<CharContainer>::value>::type
encode_csv(const allocator_set<Allocator,TempAllocator>& alloc_set,
const T& j, CharContainer& cont, const basic_csv_encode_options<typename CharContainer::value_type>& options = basic_csv_encode_options<typename CharContainer::value_type>())
{
using char_type = typename CharContainer::value_type;
basic_csv_encoder<char_type,jsoncons::string_sink<std::basic_string<char_type>>,TempAllocator> encoder(cont, options, alloc_set.get_temp_allocator());
j.dump(encoder);
}
template <typename T,typename CharContainer,typename Allocator,typename TempAllocator >
typename std::enable_if<!extension_traits::is_basic_json<T>::value &&
extension_traits::is_back_insertable_char_container<CharContainer>::value>::type
encode_csv(const allocator_set<Allocator,TempAllocator>& alloc_set,
const T& val, CharContainer& cont, const basic_csv_encode_options<typename CharContainer::value_type>& options = basic_csv_encode_options<typename CharContainer::value_type>())
{
using char_type = typename CharContainer::value_type;
basic_csv_encoder<char_type,jsoncons::string_sink<std::basic_string<char_type>>,TempAllocator> encoder(cont, options, alloc_set.get_temp_allocator());
std::error_code ec;
encode_traits<T,char_type>::encode(val, encoder, json(), ec);
if (JSONCONS_UNLIKELY(ec))
{
JSONCONS_THROW(ser_error(ec));
}
}
template <typename T,typename CharT,typename Allocator,typename TempAllocator >
typename std::enable_if<extension_traits::is_basic_json<T>::value,void>::type
encode_csv(const allocator_set<Allocator,TempAllocator>& alloc_set,
const T& j, std::basic_ostream<CharT>& os, const basic_csv_encode_options<CharT>& options = basic_csv_encode_options<CharT>())
{
using char_type = CharT;
basic_csv_encoder<char_type,jsoncons::stream_sink<char_type>,TempAllocator> encoder(os, options, alloc_set.get_temp_allocator());
j.dump(encoder);
}
template <typename T,typename CharT,typename Allocator,typename TempAllocator >
typename std::enable_if<!extension_traits::is_basic_json<T>::value,void>::type
encode_csv(const allocator_set<Allocator,TempAllocator>& alloc_set,
const T& val, std::basic_ostream<CharT>& os, const basic_csv_encode_options<CharT>& options = basic_csv_encode_options<CharT>())
{
using char_type = CharT;
basic_csv_encoder<char_type,jsoncons::stream_sink<char_type>,TempAllocator> encoder(os, options, alloc_set.get_temp_allocator());
std::error_code ec;
encode_traits<T,CharT>::encode(val, encoder, json(), ec);
if (JSONCONS_UNLIKELY(ec))
{
JSONCONS_THROW(ser_error(ec));
}
}
} // namespace csv
} // namespace jsoncons
#endif // JSONCONS_EXT_CSV_ENCODE_CSV_HPP
|