@@ -17,68 +17,77 @@ namespace tao
1717 // class value_handler
1818 // {
1919 // void null() {}
20+ //
2021 // void boolean( const bool v ) {}
22+ //
2123 // void number( const std::int64_t v ) {}
2224 // void number( const std::uint64_t v ) {}
2325 // void number( const double v ) {}
24- // void string( std::string v ) {}
26+ //
27+ // // the producer may call either one of the next two for a string,
28+ // // only implement the first one if you don't need the second.
29+ // void string( const std::string & v ) {}
30+ // void string( std::string && v ) {}
31+ //
32+ // // array
2533 // void begin_array() {}
2634 // void element() {}
2735 // void end_array() {}
36+ //
37+ // // object
2838 // void begin_object() {}
29- // void key( std::string v ) {}
30- // void value() {}
39+ // // the producer may call either one of the next two for a key,
40+ // // only implement the first one if you don't need the second.
41+ // void key( const std::string & v ) {}
42+ // void key( std::string && v ) {}
43+ // void member() {}
3144 // void end_object() {}
3245 // };
3346
47+ // SAX consumer to build a JSON value
3448 template < template < typename ... > class Traits >
3549 class to_basic_value
3650 {
3751 private:
38- basic_value< Traits > value_;
39-
4052 std::vector< basic_value< Traits > > stack_;
4153 std::vector< std::string > keys_;
4254
4355 public:
44- basic_value< Traits > & result () noexcept
45- {
46- return value_;
47- }
48-
49- const basic_value< Traits > & result () const noexcept
50- {
51- return value_;
52- }
56+ basic_value< Traits > value;
5357
5458 void null ()
5559 {
56- value_ .unsafe_assign_null ();
60+ value .unsafe_assign_null ();
5761 }
5862
5963 void boolean ( const bool v )
6064 {
61- value_ .unsafe_assign_bool ( v );
65+ value .unsafe_assign_bool ( v );
6266 }
6367
6468 void number ( const std::int64_t v )
6569 {
66- value_ .unsafe_assign_signed ( v );
70+ value .unsafe_assign_signed ( v );
6771 }
6872
6973 void number ( const std::uint64_t v )
7074 {
71- value_ .unsafe_assign_unsigned ( v );
75+ value .unsafe_assign_unsigned ( v );
7276 }
7377
7478 void number ( const double v )
7579 {
76- value_.unsafe_assign_double ( v );
80+ value.unsafe_assign_double ( v );
81+ }
82+
83+ void string ( const std::string & v )
84+ {
85+ value.unsafe_emplace_string ( v );
7786 }
7887
79- void string ( std::string v )
88+ void string ( std::string && v )
8089 {
81- value_ .unsafe_emplace_string ( std::move ( v ) );
90+ value .unsafe_emplace_string ( std::move ( v ) );
8291 }
8392
8493 // array
@@ -89,12 +98,12 @@ namespace tao
8998
9099 void element ()
91100 {
92- stack_.back ().unsafe_emplace_back ( std::move ( value_ ) );
101+ stack_.back ().unsafe_emplace_back ( std::move ( value ) );
93102 }
94103
95104 void end_array ()
96105 {
97- value_ = std::move ( stack_.back () );
106+ value = std::move ( stack_.back () );
98107 stack_.pop_back ();
99108 }
100109
@@ -104,20 +113,25 @@ namespace tao
104113 stack_.push_back ( empty_object );
105114 }
106115
107- void key ( std::string v )
116+ void key ( const std::string & v )
117+ {
118+ keys_.push_back ( v );
119+ }
120+
121+ void key ( std::string && v )
108122 {
109123 keys_.push_back ( std::move ( v ) );
110124 }
111125
112- void value ()
126+ void member ()
113127 {
114- stack_.back ().unsafe_emplace ( std::move ( keys_.back () ), std::move ( value_ ) );
128+ stack_.back ().unsafe_emplace ( std::move ( keys_.back () ), std::move ( value ) );
115129 keys_.pop_back ();
116130 }
117131
118132 void end_object ()
119133 {
120- value_ = std::move ( stack_.back () );
134+ value = std::move ( stack_.back () );
121135 stack_.pop_back ();
122136 }
123137 };
0 commit comments