Skip to content

Commit faaa07e

Browse files
committed
sped up parsing by ~0..10%
1 parent ab9d785 commit faaa07e

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

include/tao/json/events/set_value.hpp

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,14 @@ namespace tao::json::events
2222
template< template< typename... > class Traits >
2323
struct set_basic_value
2424
{
25+
static constexpr size_t count_ = 4;
26+
struct ArrayElements
27+
{
28+
basic_value< Traits > array[ count_ ];
29+
size_t count = 0;
30+
};
2531
std::vector< basic_value< Traits > > stack_;
32+
std::vector< ArrayElements > elements_;
2633
std::vector< std::string > keys_;
2734
basic_value< Traits >& value_;
2835

@@ -96,29 +103,50 @@ namespace tao::json::events
96103

97104
void begin_array()
98105
{
99-
stack_.emplace_back( empty_array );
106+
stack_.push_back( empty_array );
107+
elements_.emplace_back();
100108
}
101109

102110
void begin_array( const std::size_t size )
103111
{
104112
begin_array();
113+
elements_.back().count = count_ + 1;
105114
stack_.back().get_array().reserve( size );
106115
}
107116

108117
void element()
109118
{
110-
stack_.back().emplace_back( std::move( value_ ) );
119+
auto& elements = elements_.back();
120+
if( elements.count < count_ ) {
121+
elements.array[ elements.count ] = std::move( value_ );
122+
++elements.count;
123+
return;
124+
}
125+
auto& a = stack_.back().get_array();
126+
if( elements.count == count_ ) {
127+
a.reserve( count_ + 1 );
128+
for( auto& i : elements.array )
129+
a.push_back( std::move( i ) );
130+
++elements.count;
131+
}
132+
a.push_back( std::move( value_ ) );
111133
}
112134

113135
void end_array( const std::size_t /*unused*/ = 0 )
114136
{
115-
value_ = std::move( stack_.back() );
137+
auto& elements = elements_.back();
138+
auto& v = stack_.back();
139+
if( elements.count <= count_ )
140+
v.get_array().assign( std::make_move_iterator( elements.array ),
141+
std::make_move_iterator( elements.array + elements.count ) );
142+
value_ = std::move( v );
116143
stack_.pop_back();
144+
elements_.pop_back();
117145
}
118146

119147
void begin_object( const std::size_t /*unused*/ = 0 )
120148
{
121-
stack_.emplace_back( empty_object );
149+
stack_.push_back( empty_object );
122150
}
123151

124152
void key( const std::string_view v )

0 commit comments

Comments
 (0)