Skip to content

Commit 75d33aa

Browse files
committed
Improve json_encoder
1 parent 6d04597 commit 75d33aa

File tree

1 file changed

+75
-33
lines changed

1 file changed

+75
-33
lines changed

include/jsoncons/json_encoder.hpp

Lines changed: 75 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,23 @@ namespace detail {
214214
static const jsoncons::basic_string_view<CharT> k = JSONCONS_STRING_VIEW_CONSTANT(CharT, "false");
215215
return k;
216216
}
217+
218+
static const CharT colon[1];
219+
static const CharT colon_space[2];
220+
static const CharT space_colon[2];
221+
static const CharT space_colon_space[3];
222+
static const CharT comma[1];
223+
static const CharT comma_space[2];
224+
static const CharT space_comma[2];
225+
static const CharT space_comma_space[3];
226+
static const CharT left_brace[1];
227+
static const CharT right_brace[1];
228+
static const CharT left_brace_space[2];
229+
static const CharT space_right_brace[2];
230+
static const CharT left_bracket[1];
231+
static const CharT right_bracket[1];
232+
static const CharT left_bracket_space[2];
233+
static const CharT space_right_bracket[2];
217234
public:
218235
using allocator_type = Allocator;
219236
using char_type = CharT;
@@ -297,16 +314,6 @@ namespace detail {
297314
return split_kind_;
298315
}
299316

300-
bool is_same_line() const
301-
{
302-
return split_kind_ == line_split_kind::same_line;
303-
}
304-
305-
bool is_new_line() const
306-
{
307-
return split_kind_ == line_split_kind::new_line;
308-
}
309-
310317
bool is_multi_line() const
311318
{
312319
return split_kind_ == line_split_kind::multi_line;
@@ -328,12 +335,12 @@ namespace detail {
328335
std::vector<encoding_context,encoding_context_allocator_type> stack_;
329336
int indent_amount_{0};
330337
std::size_t column_{0};
331-
std::basic_string<CharT> colon_str_;
332-
std::basic_string<CharT> comma_str_;
333-
std::basic_string<CharT> open_object_brace_str_;
334-
std::basic_string<CharT> close_object_brace_str_;
335-
std::basic_string<CharT> open_array_bracket_str_;
336-
std::basic_string<CharT> close_array_bracket_str_;
338+
jsoncons::basic_string_view<CharT> colon_str_;
339+
jsoncons::basic_string_view<CharT> comma_str_;
340+
jsoncons::basic_string_view<CharT> open_object_brace_str_;
341+
jsoncons::basic_string_view<CharT> close_object_brace_str_;
342+
jsoncons::basic_string_view<CharT> open_array_bracket_str_;
343+
jsoncons::basic_string_view<CharT> close_array_bracket_str_;
337344
int nesting_depth_{0};
338345
public:
339346

@@ -359,52 +366,52 @@ namespace detail {
359366
switch (options.spaces_around_colon())
360367
{
361368
case spaces_option::space_after:
362-
colon_str_ = std::basic_string<CharT>({':',' '});
369+
colon_str_ = jsoncons::basic_string_view<CharT>(colon_space, sizeof(colon_space));
363370
break;
364371
case spaces_option::space_before:
365-
colon_str_ = std::basic_string<CharT>({' ',':'});
372+
colon_str_ = jsoncons::basic_string_view<CharT>(space_colon, sizeof(space_colon));
366373
break;
367374
case spaces_option::space_before_and_after:
368-
colon_str_ = std::basic_string<CharT>({' ',':',' '});
375+
colon_str_ = jsoncons::basic_string_view<CharT>(space_colon_space, sizeof(space_colon_space));
369376
break;
370377
default:
371-
colon_str_.push_back(':');
378+
colon_str_ = jsoncons::basic_string_view<CharT>(colon, sizeof(colon));
372379
break;
373380
}
374381
switch (options.spaces_around_comma())
375382
{
376383
case spaces_option::space_after:
377-
comma_str_ = std::basic_string<CharT>({',',' '});
384+
comma_str_ = jsoncons::basic_string_view<CharT>(comma_space, sizeof(comma_space));
378385
break;
379386
case spaces_option::space_before:
380-
comma_str_ = std::basic_string<CharT>({' ',','});
387+
comma_str_ = jsoncons::basic_string_view<CharT>(space_comma, sizeof(space_comma));
381388
break;
382389
case spaces_option::space_before_and_after:
383-
comma_str_ = std::basic_string<CharT>({' ',',',' '});
390+
comma_str_ = jsoncons::basic_string_view<CharT>(space_comma_space, sizeof(space_comma_space));
384391
break;
385392
default:
386-
comma_str_.push_back(',');
393+
comma_str_ = jsoncons::basic_string_view<CharT>(comma, sizeof(comma));
387394
break;
388395
}
389396
if (options.pad_inside_object_braces())
390397
{
391-
open_object_brace_str_ = std::basic_string<CharT>({'{', ' '});
392-
close_object_brace_str_ = std::basic_string<CharT>({' ', '}'});
398+
open_object_brace_str_ = jsoncons::basic_string_view<CharT>(left_brace_space, sizeof(left_brace_space));
399+
close_object_brace_str_ = jsoncons::basic_string_view<CharT>(space_right_brace, sizeof(space_right_brace));
393400
}
394401
else
395402
{
396-
open_object_brace_str_.push_back('{');
397-
close_object_brace_str_.push_back('}');
403+
open_object_brace_str_ = jsoncons::basic_string_view<CharT>(left_brace, sizeof(left_brace));
404+
close_object_brace_str_ = jsoncons::basic_string_view<CharT>(right_brace, sizeof(right_brace));
398405
}
399406
if (options.pad_inside_array_brackets())
400407
{
401-
open_array_bracket_str_ = std::basic_string<CharT>({'[', ' '});
402-
close_array_bracket_str_ = std::basic_string<CharT>({' ', ']'});
408+
open_array_bracket_str_ = jsoncons::basic_string_view<CharT>(left_bracket_space, sizeof(left_bracket_space));
409+
close_array_bracket_str_ = jsoncons::basic_string_view<CharT>(space_right_bracket, sizeof(space_right_bracket));
403410
}
404411
else
405412
{
406-
open_array_bracket_str_.push_back('[');
407-
close_array_bracket_str_.push_back(']');
413+
open_array_bracket_str_ = jsoncons::basic_string_view<CharT>(left_bracket, sizeof(left_bracket));
414+
close_array_bracket_str_ = jsoncons::basic_string_view<CharT>(right_bracket, sizeof(right_bracket));
408415
}
409416
}
410417

@@ -601,7 +608,6 @@ namespace detail {
601608
new_line();
602609
stack_.emplace_back(container_type::array,split_kind, false,
603610
column_, column_+open_array_bracket_str_.length());
604-
//new_line();
605611
break;
606612
}
607613
}
@@ -1097,6 +1103,42 @@ namespace detail {
10971103
}
10981104
};
10991105

1106+
template <typename CharT, typename Sink, typename Allocator>
1107+
const CharT basic_json_encoder<CharT, Sink, Allocator>::colon[1] = {':'};
1108+
template <typename CharT,typename Sink,typename Allocator>
1109+
const CharT basic_json_encoder<CharT,Sink,Allocator>::colon_space[2] = {':', ' '};
1110+
template <typename CharT,typename Sink,typename Allocator>
1111+
const CharT basic_json_encoder<CharT,Sink,Allocator>::space_colon[2] = {' ', ':'};
1112+
template <typename CharT,typename Sink,typename Allocator>
1113+
const CharT basic_json_encoder<CharT,Sink,Allocator>::space_colon_space[3] = {' ', ':', ' '};
1114+
1115+
template <typename CharT, typename Sink, typename Allocator>
1116+
const CharT basic_json_encoder<CharT, Sink, Allocator>::comma[] = {','};
1117+
template <typename CharT,typename Sink,typename Allocator>
1118+
const CharT basic_json_encoder<CharT,Sink,Allocator>::comma_space[] = {',', ' '};
1119+
template <typename CharT,typename Sink,typename Allocator>
1120+
const CharT basic_json_encoder<CharT,Sink,Allocator>::space_comma[] = {' ', ','};
1121+
template <typename CharT,typename Sink,typename Allocator>
1122+
const CharT basic_json_encoder<CharT,Sink,Allocator>::space_comma_space[] = {' ', ',', ' '};
1123+
1124+
template <typename CharT, typename Sink, typename Allocator>
1125+
const CharT basic_json_encoder<CharT, Sink, Allocator>::left_brace[1] = {'{'};
1126+
template <typename CharT,typename Sink,typename Allocator>
1127+
const CharT basic_json_encoder<CharT,Sink,Allocator>::right_brace[1] = {'}'};
1128+
template <typename CharT,typename Sink,typename Allocator>
1129+
const CharT basic_json_encoder<CharT,Sink,Allocator>::left_brace_space[2] = {'{', ' '};
1130+
template <typename CharT,typename Sink,typename Allocator>
1131+
const CharT basic_json_encoder<CharT,Sink,Allocator>::space_right_brace[2] = {' ', '}'};
1132+
1133+
template <typename CharT, typename Sink, typename Allocator>
1134+
const CharT basic_json_encoder<CharT, Sink, Allocator>::left_bracket[1] = {'['};
1135+
template <typename CharT,typename Sink,typename Allocator>
1136+
const CharT basic_json_encoder<CharT,Sink,Allocator>::right_bracket[1] = {']'};
1137+
template <typename CharT,typename Sink,typename Allocator>
1138+
const CharT basic_json_encoder<CharT,Sink,Allocator>::left_bracket_space[2] = {'[', ' '};
1139+
template <typename CharT,typename Sink,typename Allocator>
1140+
const CharT basic_json_encoder<CharT,Sink,Allocator>::space_right_bracket[2] = {' ', ']'};
1141+
11001142
template <typename CharT,typename Sink=jsoncons::stream_sink<CharT>,typename Allocator=std::allocator<char>>
11011143
class basic_compact_json_encoder final : public basic_json_visitor<CharT>
11021144
{

0 commit comments

Comments
 (0)