@@ -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