@@ -136,14 +136,20 @@ namespace tao::json::binding::internal
136
136
}
137
137
}
138
138
139
+ template < typename A, template < typename ... > class Traits , typename C >
140
+ [[nodiscard]] static bool require_encode ( const C& x )
141
+ {
142
+ return ( N == for_nothing_value::encode ) || ( A::kind == member_kind::required ) || ( !A::template is_nothing< Traits >( x ) );
143
+ }
144
+
139
145
#if defined( _MSC_VER )
140
146
#pragma warning( push )
141
147
#pragma warning( disable : 4127 )
142
148
#endif
143
149
template < typename A, template < typename ... > class Traits , typename C >
144
150
static void assign_member ( basic_value< Traits >& v, const C& x )
145
151
{
146
- if ( ( N == for_nothing_value::encode ) || ( !A:: template is_nothing< Traits >( x ) ) ) {
152
+ if ( require_encode< A, Traits >( x ) ) {
147
153
v.try_emplace ( A::template key< Traits >(), A::read ( x ) );
148
154
}
149
155
}
@@ -199,10 +205,7 @@ namespace tao::json::binding::internal
199
205
template < template < typename ... > class Traits , typename C >
200
206
[[nodiscard]] static std::size_t produce_size ( const C& x )
201
207
{
202
- if constexpr ( N == for_nothing_value::encode ) {
203
- return sizeof ...( As );
204
- }
205
- return ( std::size_t ( !As::template is_nothing< Traits >( x ) ) + ... );
208
+ return ( std::size_t ( require_encode< As, Traits >( x ) ) + ... );
206
209
}
207
210
208
211
#if defined( _MSC_VER )
@@ -213,7 +216,7 @@ namespace tao::json::binding::internal
213
216
template < typename A, template < typename ... > class Traits , typename Consumer, typename C >
214
217
static void produce_member ( Consumer& consumer, const C& x )
215
218
{
216
- if ( ( N == for_nothing_value::encode ) || ( !A:: template is_nothing< Traits >( x ) ) ) {
219
+ if ( require_encode< A, Traits >( x ) ) {
217
220
A::template produce_key< Traits >( consumer );
218
221
A::template produce< Traits >( consumer, x );
219
222
consumer.member ();
0 commit comments