@@ -11,33 +11,33 @@ namespace iguana {
11
11
template <bool Is_writing_escape = true , typename Stream, typename T,
12
12
std::enable_if_t <refletable_v<T>, int > = 0 >
13
13
IGUANA_INLINE void to_json (T &&t, Stream &s);
14
-
14
+ namespace detail {
15
15
template <bool Is_writing_escape = true , typename Stream, typename T>
16
- IGUANA_INLINE void render_json_value (Stream &ss, std::optional<T> &val);
16
+ IGUANA_INLINE void to_json_impl (Stream &ss, std::optional<T> &val);
17
17
18
18
template <bool Is_writing_escape = true , typename Stream, typename T,
19
19
std::enable_if_t <fixed_array_v<T>, int > = 0 >
20
- IGUANA_INLINE void render_json_value (Stream &ss, const T &t);
20
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &t);
21
21
22
22
template <bool Is_writing_escape = true , typename Stream, typename T,
23
23
std::enable_if_t <sequence_container_v<T>, int > = 0 >
24
- IGUANA_INLINE void render_json_value (Stream &ss, const T &v);
24
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &v);
25
25
26
26
template <bool Is_writing_escape = true , typename Stream, typename T,
27
27
std::enable_if_t <smart_ptr_v<T>, int > = 0 >
28
- IGUANA_INLINE void render_json_value (Stream &ss, const T &v);
28
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &v);
29
29
30
30
template <bool Is_writing_escape = true , typename Stream, typename T,
31
31
std::enable_if_t <map_container_v<T>, int > = 0 >
32
- IGUANA_INLINE void render_json_value (Stream &ss, const T &o);
32
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &o);
33
33
34
34
template <bool Is_writing_escape = true , typename Stream, typename T,
35
35
std::enable_if_t <tuple_v<T>, int > = 0 >
36
- IGUANA_INLINE void render_json_value (Stream &s, T &&t);
36
+ IGUANA_INLINE void to_json_impl (Stream &s, T &&t);
37
37
38
38
template <bool Is_writing_escape = true , typename Stream, typename T,
39
39
std::enable_if_t <variant_v<T>, int > = 0 >
40
- IGUANA_INLINE void render_json_value (Stream &s, T &&t);
40
+ IGUANA_INLINE void to_json_impl (Stream &s, T &&t);
41
41
42
42
template <typename Stream, typename InputIt, typename T, typename F>
43
43
IGUANA_INLINE void join (Stream &ss, InputIt first, InputIt last, const T &delim,
@@ -52,39 +52,39 @@ IGUANA_INLINE void join(Stream &ss, InputIt first, InputIt last, const T &delim,
52
52
}
53
53
54
54
template <bool Is_writing_escape, typename Stream>
55
- IGUANA_INLINE void render_json_value (Stream &ss, std::nullptr_t ) {
55
+ IGUANA_INLINE void to_json_impl (Stream &ss, std::nullptr_t ) {
56
56
ss.append (" null" );
57
57
}
58
58
59
59
template <bool Is_writing_escape, typename Stream>
60
- IGUANA_INLINE void render_json_value (Stream &ss, bool b) {
60
+ IGUANA_INLINE void to_json_impl (Stream &ss, bool b) {
61
61
ss.append (b ? " true" : " false" );
62
62
};
63
63
64
64
template <bool Is_writing_escape, typename Stream>
65
- IGUANA_INLINE void render_json_value (Stream &ss, char value) {
65
+ IGUANA_INLINE void to_json_impl (Stream &ss, char value) {
66
66
ss.append (" \" " );
67
67
ss.push_back (value);
68
68
ss.append (" \" " );
69
69
}
70
70
71
71
template <bool Is_writing_escape, typename Stream, typename T,
72
72
std::enable_if_t <num_v<T>, int > = 0 >
73
- IGUANA_INLINE void render_json_value (Stream &ss, T value) {
73
+ IGUANA_INLINE void to_json_impl (Stream &ss, T value) {
74
74
char temp[65 ];
75
75
auto p = detail::to_chars (temp, value);
76
76
ss.append (temp, p - temp);
77
77
}
78
78
79
79
template <bool Is_writing_escape, typename Stream, typename T,
80
80
std::enable_if_t <numeric_str_v<T>, int > = 0 >
81
- IGUANA_INLINE void render_json_value (Stream &ss, T v) {
81
+ IGUANA_INLINE void to_json_impl (Stream &ss, T v) {
82
82
ss.append (v.value ().data (), v.value ().size ());
83
83
}
84
84
85
85
template <bool Is_writing_escape, typename Stream, typename T,
86
86
std::enable_if_t <string_container_v<T>, int > = 0 >
87
- IGUANA_INLINE void render_json_value (Stream &ss, T &&t) {
87
+ IGUANA_INLINE void to_json_impl (Stream &ss, T &&t) {
88
88
ss.push_back (' "' );
89
89
if constexpr (Is_writing_escape) {
90
90
write_string_with_escape (t.data (), t.size (), ss);
@@ -99,36 +99,36 @@ template <bool Is_writing_escape, typename Stream, typename T,
99
99
std::enable_if_t <num_v<T>, int > = 0 >
100
100
IGUANA_INLINE void render_key (Stream &ss, T &t) {
101
101
ss.push_back (' "' );
102
- render_json_value <Is_writing_escape>(ss, t);
102
+ to_json_impl <Is_writing_escape>(ss, t);
103
103
ss.push_back (' "' );
104
104
}
105
105
106
106
template <bool Is_writing_escape, typename Stream, typename T,
107
107
std::enable_if_t <string_container_v<T>, int > = 0 >
108
108
IGUANA_INLINE void render_key (Stream &ss, T &&t) {
109
- render_json_value <Is_writing_escape>(ss, std::forward<T>(t));
109
+ to_json_impl <Is_writing_escape>(ss, std::forward<T>(t));
110
110
}
111
111
112
112
template <bool Is_writing_escape, typename Stream, typename T,
113
113
std::enable_if_t <refletable_v<T>, int > = 0 >
114
- IGUANA_INLINE void render_json_value (Stream &ss, T &&t) {
114
+ IGUANA_INLINE void to_json_impl (Stream &ss, T &&t) {
115
115
to_json (std::forward<T>(t), ss);
116
116
}
117
117
118
118
template <bool Is_writing_escape, typename Stream, typename T,
119
119
std::enable_if_t <enum_v<T>, int > = 0 >
120
- IGUANA_INLINE void render_json_value (Stream &ss, T val) {
120
+ IGUANA_INLINE void to_json_impl (Stream &ss, T val) {
121
121
static constexpr auto enum_to_str = get_enum_map<false , std::decay_t <T>>();
122
122
if constexpr (bool_v<decltype (enum_to_str)>) {
123
- render_json_value <Is_writing_escape>(
123
+ to_json_impl <Is_writing_escape>(
124
124
ss, static_cast <std::underlying_type_t <T>>(val));
125
125
}
126
126
else {
127
127
auto it = enum_to_str.find (val);
128
128
if (it != enum_to_str.end ())
129
129
IGUANA_LIKELY {
130
130
auto str = it->second ;
131
- render_json_value <Is_writing_escape>(
131
+ to_json_impl <Is_writing_escape>(
132
132
ss, std::string_view (str.data (), str.size ()));
133
133
}
134
134
else {
@@ -140,12 +140,12 @@ IGUANA_INLINE void render_json_value(Stream &ss, T val) {
140
140
}
141
141
142
142
template <bool Is_writing_escape, typename Stream, typename T>
143
- IGUANA_INLINE void render_json_value (Stream &ss, std::optional<T> &val) {
143
+ IGUANA_INLINE void to_json_impl (Stream &ss, std::optional<T> &val) {
144
144
if (!val) {
145
145
ss.append (" null" );
146
146
}
147
147
else {
148
- render_json_value <Is_writing_escape>(ss, *val);
148
+ to_json_impl <Is_writing_escape>(ss, *val);
149
149
}
150
150
}
151
151
@@ -154,14 +154,14 @@ IGUANA_INLINE void render_array(Stream &ss, const T &v) {
154
154
ss.push_back (' [' );
155
155
join (ss, std::begin (v), std::end (v), ' ,' ,
156
156
[&ss](const auto &jsv) IGUANA__INLINE_LAMBDA {
157
- render_json_value <Is_writing_escape>(ss, jsv);
157
+ to_json_impl <Is_writing_escape>(ss, jsv);
158
158
});
159
159
ss.push_back (' ]' );
160
160
}
161
161
162
162
template <bool Is_writing_escape, typename Stream, typename T,
163
163
std::enable_if_t <fixed_array_v<T>, int >>
164
- IGUANA_INLINE void render_json_value (Stream &ss, const T &t) {
164
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &t) {
165
165
if constexpr (std::is_same_v<char , std::remove_reference_t <
166
166
decltype (std::declval<T>()[0 ])>>) {
167
167
constexpr size_t n = sizeof (T) / sizeof (decltype (std::declval<T>()[0 ]));
@@ -184,24 +184,24 @@ IGUANA_INLINE void render_json_value(Stream &ss, const T &t) {
184
184
185
185
template <bool Is_writing_escape, typename Stream, typename T,
186
186
std::enable_if_t <map_container_v<T>, int >>
187
- IGUANA_INLINE void render_json_value (Stream &ss, const T &o) {
187
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &o) {
188
188
ss.push_back (' {' );
189
189
join (ss, o.cbegin (), o.cend (), ' ,' ,
190
190
[&ss](const auto &jsv) IGUANA__INLINE_LAMBDA {
191
191
render_key<Is_writing_escape>(ss, jsv.first );
192
192
ss.push_back (' :' );
193
- render_json_value <Is_writing_escape>(ss, jsv.second );
193
+ to_json_impl <Is_writing_escape>(ss, jsv.second );
194
194
});
195
195
ss.push_back (' }' );
196
196
}
197
197
198
198
template <bool Is_writing_escape, typename Stream, typename T,
199
199
std::enable_if_t <sequence_container_v<T>, int >>
200
- IGUANA_INLINE void render_json_value (Stream &ss, const T &v) {
200
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &v) {
201
201
ss.push_back (' [' );
202
202
join (ss, v.cbegin (), v.cend (), ' ,' ,
203
203
[&ss](const auto &jsv) IGUANA__INLINE_LAMBDA {
204
- render_json_value <Is_writing_escape>(ss, jsv);
204
+ to_json_impl <Is_writing_escape>(ss, jsv);
205
205
});
206
206
ss.push_back (' ]' );
207
207
}
@@ -217,9 +217,9 @@ constexpr auto write_json_key = [](auto &s, auto i,
217
217
218
218
template <bool Is_writing_escape, typename Stream, typename T,
219
219
std::enable_if_t <smart_ptr_v<T>, int >>
220
- IGUANA_INLINE void render_json_value (Stream &ss, const T &v) {
220
+ IGUANA_INLINE void to_json_impl (Stream &ss, const T &v) {
221
221
if (v) {
222
- render_json_value <Is_writing_escape>(ss, *v);
222
+ to_json_impl <Is_writing_escape>(ss, *v);
223
223
}
224
224
else {
225
225
ss.append (" null" );
@@ -228,13 +228,13 @@ IGUANA_INLINE void render_json_value(Stream &ss, const T &v) {
228
228
229
229
template <bool Is_writing_escape, typename Stream, typename T,
230
230
std::enable_if_t <tuple_v<T>, int >>
231
- IGUANA_INLINE void render_json_value (Stream &s, T &&t) {
231
+ IGUANA_INLINE void to_json_impl (Stream &s, T &&t) {
232
232
using U = typename std::decay_t <T>;
233
233
s.push_back (' [' );
234
234
constexpr size_t size = std::tuple_size_v<U>;
235
235
for_each (std::forward<T>(t),
236
236
[&s, size](auto &v, auto i) IGUANA__INLINE_LAMBDA {
237
- render_json_value <Is_writing_escape>(s, v);
237
+ to_json_impl <Is_writing_escape>(s, v);
238
238
239
239
if (i != size - 1 )
240
240
IGUANA_LIKELY { s.push_back (' ,' ); }
@@ -244,17 +244,18 @@ IGUANA_INLINE void render_json_value(Stream &s, T &&t) {
244
244
245
245
template <bool Is_writing_escape, typename Stream, typename T,
246
246
std::enable_if_t <variant_v<T>, int >>
247
- IGUANA_INLINE void render_json_value (Stream &s, T &&t) {
247
+ IGUANA_INLINE void to_json_impl (Stream &s, T &&t) {
248
248
std::visit (
249
249
[&s](auto value) {
250
- render_json_value <Is_writing_escape>(s, value);
250
+ to_json_impl <Is_writing_escape>(s, value);
251
251
},
252
252
t);
253
253
}
254
-
254
+ } // namespace detail
255
255
template <bool Is_writing_escape, typename Stream, typename T,
256
256
std::enable_if_t <refletable_v<T>, int >>
257
257
IGUANA_INLINE void to_json (T &&t, Stream &s) {
258
+ using namespace detail ;
258
259
s.push_back (' {' );
259
260
for_each (std::forward<T>(t),
260
261
[&t, &s](const auto &v, auto i) IGUANA__INLINE_LAMBDA {
@@ -265,7 +266,7 @@ IGUANA_INLINE void to_json(T &&t, Stream &s) {
265
266
266
267
write_json_key (s, i, t);
267
268
s.push_back (' :' );
268
- render_json_value <Is_writing_escape>(s, t.*v);
269
+ to_json_impl <Is_writing_escape>(s, t.*v);
269
270
if (Idx < Count - 1 )
270
271
IGUANA_LIKELY { s.push_back (' ,' ); }
271
272
});
@@ -275,7 +276,8 @@ IGUANA_INLINE void to_json(T &&t, Stream &s) {
275
276
template <bool Is_writing_escape = true , typename Stream, typename T,
276
277
std::enable_if_t <non_refletable_v<T>, int > = 0 >
277
278
IGUANA_INLINE void to_json (T &&t, Stream &s) {
278
- render_json_value<Is_writing_escape>(s, t);
279
+ using namespace detail ;
280
+ to_json_impl<Is_writing_escape>(s, t);
279
281
}
280
282
281
283
} // namespace iguana
0 commit comments