File tree Expand file tree Collapse file tree 1 file changed +19
-6
lines changed Expand file tree Collapse file tree 1 file changed +19
-6
lines changed Original file line number Diff line number Diff line change 6
6
7
7
#include < cstddef>
8
8
#include < cstdint>
9
+ #include < deque>
9
10
#include < string>
10
11
#include < string_view>
11
12
#include < utility>
@@ -22,14 +23,27 @@ namespace tao::json::events
22
23
template < template < typename ... > class Traits >
23
24
struct set_basic_value
24
25
{
25
- static constexpr size_t count_ = 4 ;
26
- struct ArrayElements
26
+ static constexpr size_t count_ = 42 ;
27
+ struct InPlaceVector
27
28
{
28
- basic_value< Traits > array[ count_ ];
29
+ union
30
+ {
31
+ basic_value< Traits > array[ count_ ];
32
+ };
29
33
size_t count = 0 ;
34
+ InPlaceVector () {}
35
+ ~InPlaceVector ()
36
+ {
37
+ std::destroy_n ( array, std::min ( count, count_ ) );
38
+ }
39
+ void emplace_back ( basic_value< Traits >&& v )
40
+ {
41
+ ::new ( array + count ) basic_value< Traits >{ std::move ( v ) };
42
+ ++count;
43
+ }
30
44
};
31
45
std::vector< basic_value< Traits > > stack_;
32
- std::vector< ArrayElements > elements_;
46
+ std::deque< InPlaceVector > elements_;
33
47
std::vector< std::string > keys_;
34
48
basic_value< Traits >& value_;
35
49
@@ -118,8 +132,7 @@ namespace tao::json::events
118
132
{
119
133
auto & elements = elements_.back ();
120
134
if ( elements.count < count_ ) {
121
- elements.array [ elements.count ] = std::move ( value_ );
122
- ++elements.count ;
135
+ elements.emplace_back ( std::move ( value_ ) );
123
136
return ;
124
137
}
125
138
auto & a = stack_.back ().get_array ();
You can’t perform that action at this time.
0 commit comments