Skip to content

Commit 9d4de72

Browse files
committed
Merge branch 'json_cursor' of https://github.com/danielaparker/jsoncons
2 parents 67b3c75 + a5b1139 commit 9d4de72

File tree

13 files changed

+968
-577
lines changed

13 files changed

+968
-577
lines changed

include/jsoncons/decode_traits.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ namespace jsoncons {
190190
{
191191
v.push_back(decode_traits<value_type,CharT>::decode(cursor, decoder, ec));
192192
if (ec) {return T{};}
193+
//std::cout << "read next 10\n";
193194
cursor.next(ec);
194195
}
195196
return v;
@@ -479,6 +480,7 @@ namespace jsoncons {
479480
{
480481
v.insert(decode_traits<value_type,CharT>::decode(cursor, decoder, ec));
481482
if (ec) {return T{};}
483+
//std::cout << "cursor.next 20\n";
482484
cursor.next(ec);
483485
if (ec) {return T{};}
484486
}
@@ -525,6 +527,7 @@ namespace jsoncons {
525527
{
526528
v[i] = decode_traits<value_type,CharT>::decode(cursor, decoder, ec);
527529
if (ec) {return v;}
530+
//std::cout << "cursor.next 100\n";
528531
cursor.next(ec);
529532
if (ec) {return v;}
530533
}
@@ -571,10 +574,12 @@ namespace jsoncons {
571574
}
572575
auto key = cursor.current().template get<key_type>(ec);
573576
if (ec) {return val;}
577+
//std::cout << "cursor.next 200\n";
574578
cursor.next(ec);
575579
if (ec) {return val;}
576580
val.emplace(std::move(key),decode_traits<mapped_type,CharT>::decode(cursor, decoder, ec));
577581
if (ec) {return val;}
582+
//std::cout << "cursor.next 300\n";
578583
cursor.next(ec);
579584
if (ec) {return val;}
580585
}
@@ -635,10 +640,12 @@ namespace jsoncons {
635640
ec = json_errc::invalid_number;
636641
return val;
637642
}
643+
//std::cout << "cursor.next 500\n";
638644
cursor.next(ec);
639645
if (ec) {return val;}
640646
val.emplace(n, decode_traits<mapped_type,CharT>::decode(cursor, decoder, ec));
641647
if (ec) {return val;}
648+
//std::cout << "cursor.next 600\n";
642649
cursor.next(ec);
643650
if (ec) {return val;}
644651
}

include/jsoncons/json_cursor.hpp

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class basic_json_cursor : public basic_staj_cursor<CharT>, private virtual ser_c
4343
json_source_adaptor<Source> source_;
4444
basic_json_parser<CharT,Allocator> parser_;
4545
basic_staj_visitor<CharT> cursor_visitor_;
46-
bool done_;
46+
bool done_{false};
4747

4848
public:
4949

@@ -57,9 +57,9 @@ class basic_json_cursor : public basic_staj_cursor<CharT>, private virtual ser_c
5757
typename std::enable_if<!std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
5858
: source_(std::forward<Sourceable>(source)),
5959
parser_(options,err_handler,alloc),
60-
cursor_visitor_(accept_all),
61-
done_(false)
60+
cursor_visitor_(accept_all)
6261
{
62+
parser_.cursor_mode(true);
6363
if (!done())
6464
{
6565
std::error_code local_ec;
@@ -86,9 +86,9 @@ class basic_json_cursor : public basic_staj_cursor<CharT>, private virtual ser_c
8686
typename std::enable_if<std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
8787
: source_(),
8888
parser_(options, err_handler, alloc),
89-
cursor_visitor_(accept_all),
90-
done_(false)
89+
cursor_visitor_(accept_all)
9190
{
91+
parser_.cursor_mode(true);
9292
initialize_with_string_view(std::forward<Sourceable>(source));
9393
}
9494

@@ -139,9 +139,10 @@ class basic_json_cursor : public basic_staj_cursor<CharT>, private virtual ser_c
139139
typename std::enable_if<!std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
140140
: source_(std::forward<Sourceable>(source)),
141141
parser_(options,err_handler,alloc),
142-
cursor_visitor_(accept_all),
143-
done_(false)
142+
cursor_visitor_(accept_all)
144143
{
144+
parser_.cursor_mode(true);
145+
145146
if (!done())
146147
{
147148
std::error_code local_ec;
@@ -169,9 +170,9 @@ class basic_json_cursor : public basic_staj_cursor<CharT>, private virtual ser_c
169170
typename std::enable_if<std::is_constructible<jsoncons::basic_string_view<CharT>,Sourceable>::value>::type* = 0)
170171
: source_(),
171172
parser_(options, err_handler, alloc),
172-
cursor_visitor_(accept_all),
173-
done_(false)
173+
cursor_visitor_(accept_all)
174174
{
175+
parser_.cursor_mode(true);
175176
initialize_with_string_view(std::forward<Sourceable>(source), ec);
176177
}
177178

@@ -279,9 +280,23 @@ class basic_json_cursor : public basic_staj_cursor<CharT>, private virtual ser_c
279280
void read_to(basic_json_visitor<CharT>& visitor,
280281
std::error_code& ec) override
281282
{
282-
if (cursor_visitor_.event().send_json_event(visitor, *this, ec))
283+
if (is_begin_container(current().event_type()))
284+
{
285+
parser_.cursor_mode(false);
286+
parser_.mark_level(parser_.level());
287+
if (cursor_visitor_.event().send_json_event(visitor, *this, ec))
288+
{
289+
read_next(visitor, ec);
290+
}
291+
parser_.cursor_mode(true);
292+
parser_.mark_level(0);
293+
}
294+
else
283295
{
284-
read_next(visitor, ec);
296+
if (cursor_visitor_.event().send_json_event(visitor, *this, ec))
297+
{
298+
read_next(visitor, ec);
299+
}
285300
}
286301
}
287302

0 commit comments

Comments
 (0)