@@ -22,7 +22,14 @@ namespace tao::json::events
22
22
template < template < typename ... > class Traits >
23
23
struct set_basic_value
24
24
{
25
+ static constexpr size_t count_ = 4 ;
26
+ struct ArrayElements
27
+ {
28
+ basic_value< Traits > array[ count_ ];
29
+ size_t count = 0 ;
30
+ };
25
31
std::vector< basic_value< Traits > > stack_;
32
+ std::vector< ArrayElements > elements_;
26
33
std::vector< std::string > keys_;
27
34
basic_value< Traits >& value_;
28
35
@@ -96,29 +103,50 @@ namespace tao::json::events
96
103
97
104
void begin_array ()
98
105
{
99
- stack_.emplace_back ( empty_array );
106
+ stack_.push_back ( empty_array );
107
+ elements_.emplace_back ();
100
108
}
101
109
102
110
void begin_array ( const std::size_t size )
103
111
{
104
112
begin_array ();
113
+ elements_.back ().count = count_ + 1 ;
105
114
stack_.back ().get_array ().reserve ( size );
106
115
}
107
116
108
117
void element ()
109
118
{
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_ ) );
111
133
}
112
134
113
135
void end_array ( const std::size_t /* unused*/ = 0 )
114
136
{
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 );
116
143
stack_.pop_back ();
144
+ elements_.pop_back ();
117
145
}
118
146
119
147
void begin_object ( const std::size_t /* unused*/ = 0 )
120
148
{
121
- stack_.emplace_back ( empty_object );
149
+ stack_.push_back ( empty_object );
122
150
}
123
151
124
152
void key ( const std::string_view v )
0 commit comments