@@ -23,116 +23,225 @@ namespace tao::json
2323 int private_c4 = 34 ;
2424 };
2525
26- [[nodiscard]] int get_a1 ( const type_f& f )
26+ struct type_g
27+ {
28+ int private_b1 = 21 ;
29+ int private_b2 = 22 ;
30+ int private_b3 = 23 ;
31+ int private_b4 = 24 ;
32+
33+ int private_c1 = 31 ;
34+ int private_c2 = 32 ;
35+ int private_c3 = 33 ;
36+ int private_c4 = 34 ;
37+ };
38+
39+ [[nodiscard]] int get_fa1 ( const type_f& f )
2740 {
2841 return f.private_a1 + 100 ;
2942 }
3043
31- [[nodiscard]] int get_a2 ( const type_f& f ) noexcept
44+ [[nodiscard]] int get_fa2 ( const type_f& f ) noexcept
3245 {
3346 return f.private_a2 + 100 ;
3447 }
3548
36- [[nodiscard]] int get_b1 ( const type_f& f )
49+ [[nodiscard]] int get_fb1 ( const type_f& f )
50+ {
51+ return f.private_b1 + 200 ;
52+ }
53+
54+ [[nodiscard]] int & set_fb1 ( type_f& f )
55+ {
56+ return f.private_b1 ;
57+ }
58+
59+ [[nodiscard]] int get_fb2 ( const type_f& f ) noexcept
60+ {
61+ return f.private_b2 + 200 ;
62+ }
63+
64+ [[nodiscard]] int & set_fb2 ( type_f& f )
65+ {
66+ return f.private_b2 ;
67+ }
68+
69+ [[nodiscard]] int get_fb3 ( const type_f& f )
70+ {
71+ return f.private_b3 + 200 ;
72+ }
73+
74+ [[nodiscard]] int & set_fb3 ( type_f& f ) noexcept
75+ {
76+ return f.private_b3 ;
77+ }
78+
79+ [[nodiscard]] int get_fb4 ( const type_f& f ) noexcept
80+ {
81+ return f.private_b4 + 200 ;
82+ }
83+
84+ [[nodiscard]] int & set_fb4 ( type_f& f ) noexcept
85+ {
86+ return f.private_b4 ;
87+ }
88+
89+ [[nodiscard]] int get_fc1 ( const type_f& f ) noexcept
90+ {
91+ return f.private_c1 + 300 ;
92+ }
93+
94+ void set_fc1 ( type_f& f, const int c ) noexcept
95+ {
96+ f.private_c1 = c;
97+ }
98+
99+ [[nodiscard]] int get_fc2 ( const type_f& f )
100+ {
101+ return f.private_c2 + 300 ;
102+ }
103+
104+ void set_fc2 ( type_f& f, const int & c ) noexcept
105+ {
106+ f.private_c2 = c;
107+ }
108+
109+ [[nodiscard]] int get_fc3 ( const type_f& f ) noexcept
110+ {
111+ return f.private_c3 + 300 ;
112+ }
113+
114+ void set_fc3 ( type_f& f, int && c ) noexcept
115+ {
116+ f.private_c3 = c;
117+ }
118+
119+ [[nodiscard]] int get_fc4 ( const type_f& f )
120+ {
121+ return f.private_c4 + 300 ;
122+ }
123+
124+ void set_fc4 ( type_f& f, const int & c )
125+ {
126+ f.private_c4 = c;
127+ }
128+
129+ [[nodiscard]] int get_gb1 ( const type_g& f )
37130 {
38131 return f.private_b1 + 200 ;
39132 }
40133
41- [[nodiscard]] int & set_b1 ( type_f & f )
134+ [[nodiscard]] int & set_gb1 ( type_g & f )
42135 {
43136 return f.private_b1 ;
44137 }
45138
46- [[nodiscard]] int get_b2 ( const type_f & f ) noexcept
139+ [[nodiscard]] int get_gb2 ( const type_g & f ) noexcept
47140 {
48141 return f.private_b2 + 200 ;
49142 }
50143
51- [[nodiscard]] int & set_b2 ( type_f & f )
144+ [[nodiscard]] int & set_gb2 ( type_g & f )
52145 {
53146 return f.private_b2 ;
54147 }
55148
56- [[nodiscard]] int get_b3 ( const type_f & f )
149+ [[nodiscard]] int get_gb3 ( const type_g & f )
57150 {
58151 return f.private_b3 + 200 ;
59152 }
60153
61- [[nodiscard]] int & set_b3 ( type_f & f ) noexcept
154+ [[nodiscard]] int & set_gb3 ( type_g & f ) noexcept
62155 {
63156 return f.private_b3 ;
64157 }
65158
66- [[nodiscard]] int get_b4 ( const type_f & f ) noexcept
159+ [[nodiscard]] int get_gb4 ( const type_g & f ) noexcept
67160 {
68161 return f.private_b4 + 200 ;
69162 }
70163
71- [[nodiscard]] int & set_b4 ( type_f & f ) noexcept
164+ [[nodiscard]] int & set_gb4 ( type_g & f ) noexcept
72165 {
73166 return f.private_b4 ;
74167 }
75168
76- [[nodiscard]] int get_c1 ( const type_f & f ) noexcept
169+ [[nodiscard]] int get_gc1 ( const type_g & f ) noexcept
77170 {
78171 return f.private_c1 + 300 ;
79172 }
80173
81- void set_c1 ( type_f & f, const int c ) noexcept
174+ void set_gc1 ( type_g & f, const int c ) noexcept
82175 {
83176 f.private_c1 = c;
84177 }
85178
86- [[nodiscard]] int get_c2 ( const type_f & f )
179+ [[nodiscard]] int get_gc2 ( const type_g & f )
87180 {
88181 return f.private_c2 + 300 ;
89182 }
90183
91- void set_c2 ( type_f & f, const int & c ) noexcept
184+ void set_gc2 ( type_g & f, const int & c ) noexcept
92185 {
93186 f.private_c2 = c;
94187 }
95188
96- [[nodiscard]] int get_c3 ( const type_f & f ) noexcept
189+ [[nodiscard]] int get_gc3 ( const type_g & f ) noexcept
97190 {
98191 return f.private_c3 + 300 ;
99192 }
100193
101- void set_c3 ( type_f & f, int && c ) noexcept
194+ void set_gc3 ( type_g & f, int && c ) noexcept
102195 {
103196 f.private_c3 = c;
104197 }
105198
106- [[nodiscard]] int get_c4 ( const type_f & f )
199+ [[nodiscard]] int get_gc4 ( const type_g & f )
107200 {
108201 return f.private_c4 + 300 ;
109202 }
110203
111- void set_c4 ( type_f & f, const int & c )
204+ void set_gc4 ( type_g & f, const int & c )
112205 {
113206 f.private_c4 = c;
114207 }
115208
116209 template <>
117210 struct traits < type_f >
118- : binding::object< binding::member< binding::member_kind::required, TAO_JSON_STRING_T( " a1" ), &get_a1 >,
119- binding::member< binding::member_kind::required, TAO_JSON_STRING_T( " a2" ), &get_a2 >,
120- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b1" ), &get_b1, &set_b1 >,
121- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b2" ), &get_b2, &set_b2 >,
122- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b3" ), &get_b3, &set_b3 >,
123- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b4" ), &get_b4, &set_b4 >,
124- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c1" ), &get_c1, &set_c1 >,
125- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c2" ), &get_c2, &set_c2 >,
126- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c3" ), &get_c3, &set_c3 >,
127- binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c4" ), &get_c4, &set_c4 > >
211+ : binding::object< binding::member< binding::member_kind::required, TAO_JSON_STRING_T( " a1" ), &get_fa1 >,
212+ binding::member< binding::member_kind::required, TAO_JSON_STRING_T( " a2" ), &get_fa2 >,
213+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b1" ), &get_fb1, &set_fb1 >,
214+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b2" ), &get_fb2, &set_fb2 >,
215+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b3" ), &get_fb3, &set_fb3 >,
216+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b4" ), &get_fb4, &set_fb4 >,
217+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c1" ), &get_fc1, &set_fc1 >,
218+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c2" ), &get_fc2, &set_fc2 >,
219+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c3" ), &get_fc3, &set_fc3 >,
220+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c4" ), &get_fc4, &set_fc4 > >
221+ {
222+ TAO_JSON_DEFAULT_KEY ( " f" );
223+ };
224+
225+ template <>
226+ struct traits < type_g >
227+ : binding::object< binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b1" ), &get_gb1, &set_gb1 >,
228+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b2" ), &get_gb2, &set_gb2 >,
229+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b3" ), &get_gb3, &set_gb3 >,
230+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " b4" ), &get_gb4, &set_gb4 >,
231+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c1" ), &get_gc1, &set_gc1 >,
232+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c2" ), &get_gc2, &set_gc2 >,
233+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c3" ), &get_gc3, &set_gc3 >,
234+ binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( " c4" ), &get_gc4, &set_gc4 > >
128235 {
129236 TAO_JSON_DEFAULT_KEY ( " f" );
130237 };
131238
132239 void unit_test ()
133240 {
134241 const type_f f;
135- const value v = produce::to_value ( f );
242+
243+ value v = produce::to_value ( f );
244+
136245 TEST_ASSERT ( v.get_object ().size () == 10 );
137246
138247 TEST_ASSERT ( v.get_object ().at ( " a1" ).as < int >() == 111 );
@@ -148,7 +257,20 @@ namespace tao::json
148257 TEST_ASSERT ( v.get_object ().at ( " c3" ).as < int >() == 333 );
149258 TEST_ASSERT ( v.get_object ().at ( " c4" ).as < int >() == 334 );
150259
151- // v.to( f );
260+ v.get_object ().erase ( " a1" );
261+ v.get_object ().erase ( " a2" );
262+
263+ const type_g g = v.as < type_g >();
264+
265+ TEST_ASSERT ( g.private_b1 == 221 );
266+ TEST_ASSERT ( g.private_b2 == 222 );
267+ TEST_ASSERT ( g.private_b3 == 223 );
268+ TEST_ASSERT ( g.private_b4 == 224 );
269+
270+ TEST_ASSERT ( g.private_c1 == 331 );
271+ TEST_ASSERT ( g.private_c2 == 332 );
272+ TEST_ASSERT ( g.private_c3 == 333 );
273+ TEST_ASSERT ( g.private_c4 == 334 );
152274 }
153275
154276} // namespace tao::json
0 commit comments