Skip to content

Commit dd67430

Browse files
committed
cbor_event_reader
1 parent 3020650 commit dd67430

File tree

2 files changed

+61
-31
lines changed

2 files changed

+61
-31
lines changed

include/jsoncons_ext/cbor/cbor_event_reader.hpp

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ namespace cbor {
3434
using allocator_type = Allocator;
3535
private:
3636
basic_cbor_parser<Source,Allocator> parser_;
37-
basic_item_event_receiver<char_type> event_receiver_;
38-
bool eof_;
37+
basic_item_event_receiver<char_type> cursor_visitor_;
38+
bool eof_{false};
3939

4040
public:
4141
using string_view_type = string_view;
@@ -49,9 +49,9 @@ namespace cbor {
4949
const cbor_decode_options& options = cbor_decode_options(),
5050
const Allocator& alloc = Allocator())
5151
: parser_(std::forward<Sourceable>(source), options, alloc),
52-
event_receiver_(accept_all),
53-
eof_(false)
52+
cursor_visitor_(accept_all)
5453
{
54+
parser_.cursor_mode(true);
5555
if (!done())
5656
{
5757
next();
@@ -87,9 +87,10 @@ namespace cbor {
8787
const cbor_decode_options& options,
8888
std::error_code& ec)
8989
: parser_(std::forward<Sourceable>(source), options, alloc),
90-
event_receiver_(accept_all),
90+
cursor_visitor_(accept_all),
9191
eof_(false)
9292
{
93+
parser_.cursor_mode(true);
9394
if (!done())
9495
{
9596
next(ec);
@@ -104,7 +105,7 @@ namespace cbor {
104105
void reset()
105106
{
106107
parser_.reset();
107-
event_receiver_.reset();
108+
cursor_visitor_.reset();
108109
eof_ = false;
109110
if (!done())
110111
{
@@ -116,7 +117,7 @@ namespace cbor {
116117
void reset(Sourceable&& source)
117118
{
118119
parser_.reset(std::forward<Sourceable>(source));
119-
event_receiver_.reset();
120+
cursor_visitor_.reset();
120121
eof_ = false;
121122
if (!done())
122123
{
@@ -127,7 +128,7 @@ namespace cbor {
127128
void reset(std::error_code& ec)
128129
{
129130
parser_.reset();
130-
event_receiver_.reset();
131+
cursor_visitor_.reset();
131132
eof_ = false;
132133
if (!done())
133134
{
@@ -139,7 +140,7 @@ namespace cbor {
139140
void reset(Sourceable&& source, std::error_code& ec)
140141
{
141142
parser_.reset(std::forward<Sourceable>(source));
142-
event_receiver_.reset();
143+
cursor_visitor_.reset();
143144
eof_ = false;
144145
if (!done())
145146
{
@@ -154,12 +155,12 @@ namespace cbor {
154155

155156
bool is_typed_array() const
156157
{
157-
return event_receiver_.is_typed_array();
158+
return cursor_visitor_.is_typed_array();
158159
}
159160

160161
const basic_staj_event<char_type>& current() const override
161162
{
162-
return event_receiver_.event();
163+
return cursor_visitor_.event();
163164
}
164165

165166
void read_to(basic_item_event_visitor<char_type>& visitor) override
@@ -175,9 +176,23 @@ namespace cbor {
175176
void read_to(basic_item_event_visitor<char_type>& visitor,
176177
std::error_code& ec) override
177178
{
178-
if (event_receiver_.dump(visitor, *this, ec))
179+
if (is_begin_container(current().event_type()))
179180
{
180-
read_next(visitor, ec);
181+
parser_.cursor_mode(false);
182+
parser_.mark_level(parser_.level());
183+
if (cursor_visitor_.dump(visitor, *this, ec))
184+
{
185+
read_next(visitor, ec);
186+
}
187+
parser_.cursor_mode(true);
188+
parser_.mark_level(0);
189+
}
190+
else
191+
{
192+
if (cursor_visitor_.dump(visitor, *this, ec))
193+
{
194+
read_next(visitor, ec);
195+
}
181196
}
182197
}
183198

@@ -231,16 +246,16 @@ namespace cbor {
231246

232247
void read_next(std::error_code& ec)
233248
{
234-
if (event_receiver_.in_available())
249+
if (cursor_visitor_.in_available())
235250
{
236-
event_receiver_.send_available(ec);
251+
cursor_visitor_.send_available(ec);
237252
}
238253
else
239254
{
240255
parser_.restart();
241256
while (!parser_.stopped())
242257
{
243-
parser_.parse(event_receiver_, ec);
258+
parser_.parse(cursor_visitor_, ec);
244259
if (ec) {return;}
245260
}
246261
}

include/jsoncons_ext/msgpack/msgpack_event_reader.hpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ namespace msgpack {
3636
using allocator_type = Allocator;
3737
private:
3838
basic_msgpack_parser<Source,Allocator> parser_;
39-
basic_item_event_receiver<char_type> event_receiver_;
40-
bool eof_;
39+
basic_item_event_receiver<char_type> cursor_visitor_;
40+
bool eof_{false};
4141

4242
public:
4343
using string_view_type = string_view;
@@ -47,9 +47,9 @@ namespace msgpack {
4747
const msgpack_decode_options& options = msgpack_decode_options(),
4848
const Allocator& alloc = Allocator())
4949
: parser_(std::forward<Sourceable>(source), options, alloc),
50-
event_receiver_(accept_all),
51-
eof_(false)
50+
cursor_visitor_(accept_all)
5251
{
52+
parser_.cursor_mode(true);
5353
if (!done())
5454
{
5555
next();
@@ -89,9 +89,10 @@ namespace msgpack {
8989
const msgpack_decode_options& options,
9090
std::error_code& ec)
9191
: parser_(std::forward<Sourceable>(source), options, alloc),
92-
event_receiver_(accept_all),
92+
cursor_visitor_(accept_all),
9393
eof_(false)
9494
{
95+
parser_.cursor_mode(true);
9596
if (!done())
9697
{
9798
next(ec);
@@ -106,7 +107,7 @@ namespace msgpack {
106107
void reset()
107108
{
108109
parser_.reset();
109-
event_receiver_.reset();
110+
cursor_visitor_.reset();
110111
eof_ = false;
111112
if (!done())
112113
{
@@ -118,7 +119,7 @@ namespace msgpack {
118119
void reset(Sourceable&& source)
119120
{
120121
parser_.reset(std::forward<Sourceable>(source));
121-
event_receiver_.reset();
122+
cursor_visitor_.reset();
122123
eof_ = false;
123124
if (!done())
124125
{
@@ -129,7 +130,7 @@ namespace msgpack {
129130
void reset(std::error_code& ec)
130131
{
131132
parser_.reset();
132-
event_receiver_.reset();
133+
cursor_visitor_.reset();
133134
eof_ = false;
134135
if (!done())
135136
{
@@ -141,7 +142,7 @@ namespace msgpack {
141142
void reset(Sourceable&& source, std::error_code& ec)
142143
{
143144
parser_.reset(std::forward<Sourceable>(source));
144-
event_receiver_.reset();
145+
cursor_visitor_.reset();
145146
eof_ = false;
146147
if (!done())
147148
{
@@ -156,7 +157,7 @@ namespace msgpack {
156157

157158
const basic_staj_event<char_type>& current() const override
158159
{
159-
return event_receiver_.event();
160+
return cursor_visitor_.event();
160161
}
161162

162163
void read_to(basic_item_event_visitor<char_type>& visitor) override
@@ -172,9 +173,23 @@ namespace msgpack {
172173
void read_to(basic_item_event_visitor<char_type>& visitor,
173174
std::error_code& ec) override
174175
{
175-
if (event_receiver_.dump(visitor, *this, ec))
176+
if (is_begin_container(current().event_type()))
176177
{
177-
read_next(visitor, ec);
178+
parser_.cursor_mode(false);
179+
parser_.mark_level(parser_.level());
180+
if (cursor_visitor_.dump(visitor, *this, ec))
181+
{
182+
read_next(visitor, ec);
183+
}
184+
parser_.cursor_mode(true);
185+
parser_.mark_level(0);
186+
}
187+
else
188+
{
189+
if (cursor_visitor_.dump(visitor, *this, ec))
190+
{
191+
read_next(visitor, ec);
192+
}
178193
}
179194
}
180195

@@ -228,16 +243,16 @@ namespace msgpack {
228243

229244
void read_next(std::error_code& ec)
230245
{
231-
if (event_receiver_.in_available())
246+
if (cursor_visitor_.in_available())
232247
{
233-
event_receiver_.send_available(ec);
248+
cursor_visitor_.send_available(ec);
234249
}
235250
else
236251
{
237252
parser_.restart();
238253
while (!parser_.stopped())
239254
{
240-
parser_.parse(event_receiver_, ec);
255+
parser_.parse(cursor_visitor_, ec);
241256
if (ec) {return;}
242257
}
243258
}

0 commit comments

Comments
 (0)