Skip to content

Commit 1a7fa4a

Browse files
committed
Template over noexcept.
1 parent e22bb68 commit 1a7fa4a

File tree

2 files changed

+70
-20
lines changed

2 files changed

+70
-20
lines changed

include/tao/json/binding/element.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ namespace tao::json::binding
7676
}
7777
};
7878

79-
template< typename C, typename T, T ( *P )( const C& ) >
80-
struct element< T ( * )( const C& ), P >
79+
template< bool N, typename C, typename T, T ( *P )( const C& ) noexcept( N ) >
80+
struct element< T ( * )( const C& ) noexcept( N ), P >
8181
{
8282
using class_t = C;
8383
using value_t = T;
@@ -99,8 +99,8 @@ namespace tao::json::binding
9999
template< typename CT, CT CP, typename T, T P >
100100
struct element2;
101101

102-
template< typename A, typename CR, CR ( *CP )( const A& ) noexcept, typename R, R ( *P )( A& ) noexcept >
103-
struct element2< CR ( * )( const A& ) noexcept, CP, R ( * )( A& ) noexcept, P >
102+
template< bool CN, bool N, typename A, typename CR, CR ( *CP )( const A& ) noexcept( CN ), typename R, R ( *P )( A& ) noexcept( N ) >
103+
struct element2< CR ( * )( const A& ) noexcept( CN ), CP, R ( * )( A& ) noexcept( N ), P >
104104
{
105105
using class_t = A;
106106
using value_t = std::decay_t< R >;
@@ -137,8 +137,8 @@ namespace tao::json::binding
137137
}
138138
};
139139

140-
template< typename A, typename CR, CR ( *CP )( const A& ) noexcept, typename R, void ( *P )( A&, R&& ) noexcept >
141-
struct element2< CR ( * )( const A& ) noexcept, CP, void ( * )( A&, R&& ) noexcept, 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: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,63 @@ namespace tao::json
99
{
1010
struct type_f
1111
{
12-
int private_a;
13-
int private_b;
12+
int private_a1 = 11;
13+
int private_a2 = 12;
14+
15+
int private_b1 = 21;
16+
int private_b2 = 22;
17+
int private_b3 = 23;
18+
int private_b4 = 24;
1419
};
1520

16-
[[nodiscard]] int get_a( const type_f& f ) noexcept
21+
[[nodiscard]] int get_a1( const type_f& f )
22+
{
23+
return f.private_a1 + 100;
24+
}
25+
26+
[[nodiscard]] int get_a2( const type_f& f ) noexcept
27+
{
28+
return f.private_a2 + 100;
29+
}
30+
31+
[[nodiscard]] int get_b1( const type_f& f )
32+
{
33+
return f.private_b1 + 200;
34+
}
35+
36+
[[nodiscard]] int& set_b1( type_f& f )
37+
{
38+
return f.private_b1;
39+
}
40+
41+
[[nodiscard]] int get_b2( const type_f& f ) noexcept
42+
{
43+
return f.private_b2 + 200;
44+
}
45+
46+
[[nodiscard]] int& set_b2( type_f& f )
47+
{
48+
return f.private_b2;
49+
}
50+
51+
[[nodiscard]] int get_b3( const type_f& f )
52+
{
53+
return f.private_b3 + 200;
54+
}
55+
56+
[[nodiscard]] int& set_b3( type_f& f ) noexcept
1757
{
18-
return f.private_a + 10;
58+
return f.private_b3;
1959
}
2060

21-
[[nodiscard]] int& set_a( type_f& f ) noexcept
61+
[[nodiscard]] int get_b4( const type_f& f ) noexcept
2262
{
23-
return f.private_a;
63+
return f.private_b4 + 200;
2464
}
2565

26-
[[nodiscard]] int get_b( const type_f& f )
66+
[[nodiscard]] int& set_b4( type_f& f ) noexcept
2767
{
28-
return f.private_b + 20;
68+
return f.private_b4;
2969
}
3070

3171
// void set_b( type_f& f, int& b ) noexcept
@@ -35,19 +75,29 @@ namespace tao::json
3575

3676
template<>
3777
struct traits< type_f >
38-
: binding::object< binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( "a" ), &get_a, &set_a >,
39-
binding::member< binding::member_kind::required, TAO_JSON_STRING_T( "b" ), &get_b > >
78+
: binding::object< binding::member< binding::member_kind::required, TAO_JSON_STRING_T( "a1" ), &get_a1 >,
79+
binding::member< binding::member_kind::required, TAO_JSON_STRING_T( "a2" ), &get_a2 >,
80+
binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( "b1" ), &get_b1, &set_b1 >,
81+
binding::member2< binding::member_kind::required, TAO_JSON_STRING_T( "b2" ), &get_b2, &set_b2 >,
82+
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 > >
4084
{
4185
TAO_JSON_DEFAULT_KEY( "f" );
4286
};
4387

4488
void unit_test()
4589
{
46-
const type_f f{ 41, 42 };
90+
const type_f f;
4791
const value v = produce::to_value( f );
48-
TEST_ASSERT( v.get_object().size() == 2 );
49-
TEST_ASSERT( v.get_object().at( "a" ).as< int >() == 51 );
50-
TEST_ASSERT( v.get_object().at( "b" ).as< int >() == 62 );
92+
TEST_ASSERT( v.get_object().size() == 6 );
93+
94+
TEST_ASSERT( v.get_object().at( "a1" ).as< int >() == 111 );
95+
TEST_ASSERT( v.get_object().at( "a2" ).as< int >() == 112 );
96+
97+
TEST_ASSERT( v.get_object().at( "b1" ).as< int >() == 221 );
98+
TEST_ASSERT( v.get_object().at( "b2" ).as< int >() == 222 );
99+
TEST_ASSERT( v.get_object().at( "b3" ).as< int >() == 223 );
100+
TEST_ASSERT( v.get_object().at( "b4" ).as< int >() == 224 );
51101
}
52102

53103
} // namespace tao::json

0 commit comments

Comments
 (0)