Skip to content

Commit 1536057

Browse files
committed
Generalise binding.
1 parent 4cae9ca commit 1536057

File tree

2 files changed

+59
-8
lines changed

2 files changed

+59
-8
lines changed

include/tao/json/binding/element.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ namespace tao::json::binding
137137
}
138138
};
139139

140-
template< bool CN, bool N, typename A, typename CR, CR ( *CP )( const A& ) noexcept( CN ), typename R, void ( *P )( A&, R&& ) noexcept( N ) >
141-
struct element2< CR ( * )( const A& ) noexcept( CN ), CP, void ( * )( A&, R&& ) noexcept( N ), P >
140+
template< bool CN, bool N, typename A, typename CR, CR ( *CP )( const A& ) noexcept( CN ), typename R, void ( *P )( A&, R ) noexcept( N ) >
141+
struct element2< CR ( * )( const A& ) noexcept( CN ), CP, void ( * )( A&, R ) noexcept( N ), P >
142142
{
143143
using class_t = A;
144144
using value_t = std::decay_t< R >;

src/test/json/binding_function.cpp

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ namespace tao::json
1616
int private_b2 = 22;
1717
int private_b3 = 23;
1818
int private_b4 = 24;
19+
20+
int private_c1 = 31;
21+
int private_c2 = 32;
22+
int private_c3 = 33;
23+
int private_c4 = 34;
1924
};
2025

2126
[[nodiscard]] int get_a1( const type_f& f )
@@ -68,10 +73,45 @@ namespace tao::json
6873
return f.private_b4;
6974
}
7075

71-
// void set_b( type_f& f, int& b ) noexcept
72-
// {
73-
// f.private_b = b;
74-
// }
76+
[[nodiscard]] int get_c1( const type_f& f ) noexcept
77+
{
78+
return f.private_c1 + 300;
79+
}
80+
81+
void set_c1( type_f& f, const int c ) noexcept
82+
{
83+
f.private_c1 = c;
84+
}
85+
86+
[[nodiscard]] int get_c2( const type_f& f )
87+
{
88+
return f.private_c2 + 300;
89+
}
90+
91+
void set_c2( type_f& f, const int& c ) noexcept
92+
{
93+
f.private_c2 = c;
94+
}
95+
96+
[[nodiscard]] int get_c3( const type_f& f ) noexcept
97+
{
98+
return f.private_c3 + 300;
99+
}
100+
101+
void set_c3( type_f& f, int&& c ) noexcept
102+
{
103+
f.private_c3 = c;
104+
}
105+
106+
[[nodiscard]] int get_c4( const type_f& f )
107+
{
108+
return f.private_c4 + 300;
109+
}
110+
111+
void set_c4( type_f& f, const int& c )
112+
{
113+
f.private_c4 = c;
114+
}
75115

76116
template<>
77117
struct traits< type_f >
@@ -80,7 +120,11 @@ namespace tao::json
80120
binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( "b1" ), &get_b1, &set_b1 >,
81121
binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( "b2" ), &get_b2, &set_b2 >,
82122
binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( "b3" ), &get_b3, &set_b3 >,
83-
binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( "b4" ), &get_b4, &set_b4 > >
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 > >
84128
{
85129
TAO_JSON_DEFAULT_KEY( "f" );
86130
};
@@ -89,7 +133,7 @@ namespace tao::json
89133
{
90134
const type_f f;
91135
const value v = produce::to_value( f );
92-
TEST_ASSERT( v.get_object().size() == 6 );
136+
TEST_ASSERT( v.get_object().size() == 10 );
93137

94138
TEST_ASSERT( v.get_object().at( "a1" ).as< int >() == 111 );
95139
TEST_ASSERT( v.get_object().at( "a2" ).as< int >() == 112 );
@@ -98,6 +142,13 @@ namespace tao::json
98142
TEST_ASSERT( v.get_object().at( "b2" ).as< int >() == 222 );
99143
TEST_ASSERT( v.get_object().at( "b3" ).as< int >() == 223 );
100144
TEST_ASSERT( v.get_object().at( "b4" ).as< int >() == 224 );
145+
146+
TEST_ASSERT( v.get_object().at( "c1" ).as< int >() == 331 );
147+
TEST_ASSERT( v.get_object().at( "c2" ).as< int >() == 332 );
148+
TEST_ASSERT( v.get_object().at( "c3" ).as< int >() == 333 );
149+
TEST_ASSERT( v.get_object().at( "c4" ).as< int >() == 334 );
150+
151+
// v.to( f );
101152
}
102153

103154
} // namespace tao::json

0 commit comments

Comments
 (0)