@@ -60,37 +60,41 @@ void ValBuilder::VisitNull()
6060void ValBuilder::Build ( const Val& t )
6161{
6262 if ( m_ctx.empty () )
63- m_ctx.push ( t ) ;
63+ {
64+ Level l = { Val::Null (), t } ;
65+ m_ctx.push ( l ) ;
66+ }
6467
65- else if ( m_ctx.top ().Is <Val::Array>() )
68+ else if ( m_ctx.top ().val . Is <Val::Array>() )
6669 {
67- Val::Array& ar = m_ctx.top ().As <Val::Array>() ;
70+ Val::Array& ar = m_ctx.top ().val . As <Val::Array>() ;
6871 ar.push_back ( t ) ;
6972 }
70- else if ( m_ctx.top ().Is <Val::Object>() )
73+ else if ( m_ctx.top ().val . Is <Val::Object>() )
7174 {
72- if ( m_key. get () == 0 )
75+ if ( !m_ctx. top (). key . Is <std::string>() )
7376 BOOST_THROW_EXCEPTION ( Error () << NoKey_ (t) ) ;
7477
7578 else
7679 {
77- Val::Object& obj = m_ctx.top ().As <Val::Object>() ;
78- obj.insert ( std::make_pair ( m_key-> As <std::string> (), t ) ) ;
79- m_key. reset () ;
80+ Val::Object& obj = m_ctx.top ().val . As <Val::Object>() ;
81+ obj.insert ( std::make_pair ( m_ctx. top (). key . Str (), t ) ) ;
82+ m_ctx. top (). key = Val::Null () ;
8083 }
8184 }
8285 else
83- BOOST_THROW_EXCEPTION ( Error () << Unexpected_ (m_ctx.top ()) ) ;
86+ BOOST_THROW_EXCEPTION ( Error () << Unexpected_ (m_ctx.top (). val ) ) ;
8487}
8588
8689void ValBuilder::VisitKey ( const std::string& t )
8790{
88- m_key. reset ( new Val (t) ) ;
91+ m_ctx. top (). key = t ;
8992}
9093
9194void ValBuilder::StartArray ()
9295{
93- m_ctx.push ( Val ( Val::Array () ) ) ;
96+ Level l = { Val::Null (), Val (Val::Array ()) } ;
97+ m_ctx.push (l) ;
9498}
9599
96100void ValBuilder::EndArray ()
@@ -100,11 +104,13 @@ void ValBuilder::EndArray()
100104
101105void ValBuilder::End ( Val::TypeEnum type )
102106{
103- if ( m_ctx.top ().Type () == type )
107+ if ( m_ctx.top ().val . Type () == type )
104108 {
109+ assert ( m_ctx.top ().key .Is <void >() ) ;
110+
105111 // get top Val from stack
106112 Val current ;
107- current.Swap ( m_ctx.top () ) ;
113+ current.Swap ( m_ctx.top (). val ) ;
108114 m_ctx.pop () ;
109115
110116 Build (current) ;
@@ -113,7 +119,8 @@ void ValBuilder::End( Val::TypeEnum type )
113119
114120void ValBuilder::StartObject ()
115121{
116- m_ctx.push ( Val ( Val::Object () ) ) ;
122+ Level l = { Val::Null (), Val ( Val::Object () ) } ;
123+ m_ctx.push (l) ;
117124}
118125
119126void ValBuilder::EndObject ()
@@ -124,7 +131,7 @@ void ValBuilder::EndObject()
124131Val ValBuilder::Result () const
125132{
126133 assert ( m_ctx.size () == 1U ) ;
127- return m_ctx.top () ;
134+ return m_ctx.top (). val ;
128135}
129136
130137} // end of namespace
0 commit comments