@@ -34,13 +34,17 @@ namespace tao::json::events
34
34
InPlaceVector () {}
35
35
~InPlaceVector ()
36
36
{
37
- std::destroy_n ( array, std::min ( count, count_ ) );
37
+ std::destroy_n ( array, size ( ) );
38
38
}
39
39
void emplace_back ( basic_value< Traits >&& v )
40
40
{
41
41
::new ( array + count ) basic_value< Traits >{ std::move ( v ) };
42
42
++count;
43
43
}
44
+ size_t size () const
45
+ {
46
+ return std::min ( count, count_ );
47
+ }
44
48
};
45
49
std::vector< basic_value< Traits > > stack_;
46
50
std::deque< InPlaceVector > elements_;
@@ -138,8 +142,7 @@ namespace tao::json::events
138
142
auto & a = stack_.back ().get_array ();
139
143
if ( elements.count == count_ ) {
140
144
a.reserve ( count_ + 1 );
141
- for ( auto & i : elements.array )
142
- a.push_back ( std::move ( i ) );
145
+ a.resize ( count_ );
143
146
++elements.count ;
144
147
}
145
148
a.push_back ( std::move ( value_ ) );
@@ -149,9 +152,19 @@ namespace tao::json::events
149
152
{
150
153
auto & elements = elements_.back ();
151
154
auto & v = stack_.back ();
152
- if ( elements.count <= count_ )
153
- v.get_array ().assign ( std::make_move_iterator ( elements.array ),
154
- std::make_move_iterator ( elements.array + elements.count ) );
155
+ if ( elements.count ) {
156
+ const auto size = elements.size ();
157
+ auto & a = v.get_array ();
158
+ if ( a.empty () ) {
159
+ a.assign ( std::make_move_iterator ( elements.array ),
160
+ std::make_move_iterator ( elements.array + size ) );
161
+ }
162
+ else {
163
+ std::copy_n ( std::make_move_iterator ( elements.array ),
164
+ size,
165
+ a.begin () );
166
+ }
167
+ }
155
168
value_ = std::move ( v );
156
169
stack_.pop_back ();
157
170
elements_.pop_back ();
0 commit comments