@@ -76,6 +76,8 @@ namespace tao::json::binding
7676 }
7777 };
7878
79+ #if defined(__GNUC__) || defined(__clang__)
80+
7981 template < bool N, typename C, typename T, T ( *P )( const C& ) noexcept ( N ) >
8082 struct element < T ( * )( const C& ) noexcept ( N ), P >
8183 {
@@ -96,9 +98,55 @@ namespace tao::json::binding
9698 }
9799 };
98100
101+ #else // TODO: Check MSVC occasionally. Others?
102+
103+ template < typename C, typename T, T ( *P )( const C& ) noexcept ( true ) >
104+ struct element < T ( * )( const C& ) noexcept ( true ), P >
105+ {
106+ using class_t = C;
107+ using value_t = T;
108+
109+ using internal_t = std::decay_t < decltype ( P( std::declval< const C >() ) ) >;
110+
111+ [[nodiscard]] static decltype ( auto ) read( const C& v ) noexcept ( true )
112+ {
113+ return P ( v );
114+ }
115+
116+ template < template < typename ... > class Traits = traits, typename Consumer >
117+ static void produce ( Consumer& consumer, const C& v )
118+ {
119+ events::produce< Traits >( consumer, P ( v ) );
120+ }
121+ };
122+
123+ template < typename C, typename T, T ( *P )( const C& ) noexcept ( false ) >
124+ struct element < T ( * )( const C& ) noexcept ( false ), P >
125+ {
126+ using class_t = C;
127+ using value_t = T;
128+
129+ using internal_t = std::decay_t < decltype ( P( std::declval< const C >() ) ) >;
130+
131+ [[nodiscard]] static decltype ( auto ) read( const C& v ) noexcept ( false )
132+ {
133+ return P ( v );
134+ }
135+
136+ template < template < typename ... > class Traits = traits, typename Consumer >
137+ static void produce ( Consumer& consumer, const C& v )
138+ {
139+ events::produce< Traits >( consumer, P ( v ) );
140+ }
141+ };
142+
143+ #endif
144+
99145 template < typename CT, CT CP, typename T, T P >
100146 struct element2 ;
101147
148+ #if defined(__GNUC__) || defined(__clang__)
149+
102150 template < bool CN, bool N, typename A, typename CR, CR ( *CP )( const A& ) noexcept ( CN ), typename R, R ( *P )( A& ) noexcept ( N ) >
103151 struct element2 < CR ( * )( const A& ) noexcept ( CN ), CP, R ( * )( A& ) noexcept ( N ), P >
104152 {
@@ -175,6 +223,314 @@ namespace tao::json::binding
175223 }
176224 };
177225
226+ #else // TODO: Check MSVC occasionally. Others?
227+
228+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( true ), typename R, R ( *P )( A& ) noexcept ( true ) >
229+ struct element2 < CR ( * )( const A& ) noexcept ( true ), CP, R ( * )( A& ) noexcept ( true ), P >
230+ {
231+ using class_t = A;
232+ using value_t = std::decay_t < R >;
233+
234+ using internal_t = value_t ;
235+
236+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( true )
237+ {
238+ return CP ( v );
239+ }
240+
241+ template < typename W >
242+ static void write ( A& v, W&& w ) noexcept ( true )
243+ {
244+ P ( v ) = std::forward< W >( w );
245+ }
246+
247+ template < template < typename ... > class Traits >
248+ static void to ( const basic_value< Traits >& v, A& x )
249+ {
250+ v.to ( P ( x ) );
251+ }
252+
253+ template < template < typename ... > class Traits = traits, typename Producer >
254+ static void consume ( Producer& parser, A& v )
255+ {
256+ json::consume< Traits >( parser, P ( v ) );
257+ }
258+
259+ template < template < typename ... > class Traits = traits, typename Consumer >
260+ static void produce ( Consumer& consumer, const A& v )
261+ {
262+ events::produce< Traits >( consumer, CP ( v ) );
263+ }
264+ };
265+
266+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( true ), typename R, R ( *P )( A& ) noexcept ( false ) >
267+ struct element2 < CR ( * )( const A& ) noexcept ( true ), CP, R ( * )( A& ) noexcept ( false ), P >
268+ {
269+ using class_t = A;
270+ using value_t = std::decay_t < R >;
271+
272+ using internal_t = value_t ;
273+
274+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( true )
275+ {
276+ return CP ( v );
277+ }
278+
279+ template < typename W >
280+ static void write ( A& v, W&& w ) noexcept ( false )
281+ {
282+ P ( v ) = std::forward< W >( w );
283+ }
284+
285+ template < template < typename ... > class Traits >
286+ static void to ( const basic_value< Traits >& v, A& x )
287+ {
288+ v.to ( P ( x ) );
289+ }
290+
291+ template < template < typename ... > class Traits = traits, typename Producer >
292+ static void consume ( Producer& parser, A& v )
293+ {
294+ json::consume< Traits >( parser, P ( v ) );
295+ }
296+
297+ template < template < typename ... > class Traits = traits, typename Consumer >
298+ static void produce ( Consumer& consumer, const A& v )
299+ {
300+ events::produce< Traits >( consumer, CP ( v ) );
301+ }
302+ };
303+
304+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( false ), typename R, R ( *P )( A& ) noexcept ( true ) >
305+ struct element2 < CR ( * )( const A& ) noexcept ( false ), CP, R ( * )( A& ) noexcept ( true ), P >
306+ {
307+ using class_t = A;
308+ using value_t = std::decay_t < R >;
309+
310+ using internal_t = value_t ;
311+
312+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( false )
313+ {
314+ return CP ( v );
315+ }
316+
317+ template < typename W >
318+ static void write ( A& v, W&& w ) noexcept ( true )
319+ {
320+ P ( v ) = std::forward< W >( w );
321+ }
322+
323+ template < template < typename ... > class Traits >
324+ static void to ( const basic_value< Traits >& v, A& x )
325+ {
326+ v.to ( P ( x ) );
327+ }
328+
329+ template < template < typename ... > class Traits = traits, typename Producer >
330+ static void consume ( Producer& parser, A& v )
331+ {
332+ json::consume< Traits >( parser, P ( v ) );
333+ }
334+
335+ template < template < typename ... > class Traits = traits, typename Consumer >
336+ static void produce ( Consumer& consumer, const A& v )
337+ {
338+ events::produce< Traits >( consumer, CP ( v ) );
339+ }
340+ };
341+
342+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( false ), typename R, R ( *P )( A& ) noexcept ( false ) >
343+ struct element2 < CR ( * )( const A& ) noexcept ( false ), CP, R ( * )( A& ) noexcept ( false ), P >
344+ {
345+ using class_t = A;
346+ using value_t = std::decay_t < R >;
347+
348+ using internal_t = value_t ;
349+
350+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( false )
351+ {
352+ return CP ( v );
353+ }
354+
355+ template < typename W >
356+ static void write ( A& v, W&& w ) noexcept ( false )
357+ {
358+ P ( v ) = std::forward< W >( w );
359+ }
360+
361+ template < template < typename ... > class Traits >
362+ static void to ( const basic_value< Traits >& v, A& x )
363+ {
364+ v.to ( P ( x ) );
365+ }
366+
367+ template < template < typename ... > class Traits = traits, typename Producer >
368+ static void consume ( Producer& parser, A& v )
369+ {
370+ json::consume< Traits >( parser, P ( v ) );
371+ }
372+
373+ template < template < typename ... > class Traits = traits, typename Consumer >
374+ static void produce ( Consumer& consumer, const A& v )
375+ {
376+ events::produce< Traits >( consumer, CP ( v ) );
377+ }
378+ };
379+
380+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( true ), typename R, void ( *P )( A&, R ) noexcept ( true ) >
381+ struct element2 < CR ( * )( const A& ) noexcept ( true ), CP, void ( * )( A&, R ) noexcept ( true ), P >
382+ {
383+ using class_t = A;
384+ using value_t = std::decay_t < R >;
385+
386+ using internal_t = value_t ;
387+
388+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( true )
389+ {
390+ return CP ( v );
391+ }
392+
393+ template < typename W >
394+ static void write ( A& v, W&& w ) noexcept ( true )
395+ {
396+ P ( v, std::forward< W >( w ) );
397+ }
398+
399+ template < template < typename ... > class Traits >
400+ static void to ( const basic_value< Traits >& v, A& x )
401+ {
402+ P ( x, v.template as < std::decay_t < R > >() );
403+ }
404+
405+ template < template < typename ... > class Traits = traits, typename Producer >
406+ static void consume ( Producer& parser, A& v )
407+ {
408+ P ( v, json::consume< Traits >( parser ) );
409+ }
410+
411+ template < template < typename ... > class Traits = traits, typename Consumer >
412+ static void produce ( Consumer& consumer, const A& v )
413+ {
414+ events::produce< Traits >( consumer, CP ( v ) );
415+ }
416+ };
417+
418+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( true ), typename R, void ( *P )( A&, R ) noexcept ( false ) >
419+ struct element2 < CR ( * )( const A& ) noexcept ( true ), CP, void ( * )( A&, R ) noexcept ( false ), P >
420+ {
421+ using class_t = A;
422+ using value_t = std::decay_t < R >;
423+
424+ using internal_t = value_t ;
425+
426+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( true )
427+ {
428+ return CP ( v );
429+ }
430+
431+ template < typename W >
432+ static void write ( A& v, W&& w ) noexcept ( false )
433+ {
434+ P ( v, std::forward< W >( w ) );
435+ }
436+
437+ template < template < typename ... > class Traits >
438+ static void to ( const basic_value< Traits >& v, A& x )
439+ {
440+ P ( x, v.template as < std::decay_t < R > >() );
441+ }
442+
443+ template < template < typename ... > class Traits = traits, typename Producer >
444+ static void consume ( Producer& parser, A& v )
445+ {
446+ P ( v, json::consume< Traits >( parser ) );
447+ }
448+
449+ template < template < typename ... > class Traits = traits, typename Consumer >
450+ static void produce ( Consumer& consumer, const A& v )
451+ {
452+ events::produce< Traits >( consumer, CP ( v ) );
453+ }
454+ };
455+
456+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( false ), typename R, void ( *P )( A&, R ) noexcept ( true ) >
457+ struct element2 < CR ( * )( const A& ) noexcept ( false ), CP, void ( * )( A&, R ) noexcept ( true ), P >
458+ {
459+ using class_t = A;
460+ using value_t = std::decay_t < R >;
461+
462+ using internal_t = value_t ;
463+
464+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( false )
465+ {
466+ return CP ( v );
467+ }
468+
469+ template < typename W >
470+ static void write ( A& v, W&& w ) noexcept ( true )
471+ {
472+ P ( v, std::forward< W >( w ) );
473+ }
474+
475+ template < template < typename ... > class Traits >
476+ static void to ( const basic_value< Traits >& v, A& x )
477+ {
478+ P ( x, v.template as < std::decay_t < R > >() );
479+ }
480+
481+ template < template < typename ... > class Traits = traits, typename Producer >
482+ static void consume ( Producer& parser, A& v )
483+ {
484+ P ( v, json::consume< Traits >( parser ) );
485+ }
486+
487+ template < template < typename ... > class Traits = traits, typename Consumer >
488+ static void produce ( Consumer& consumer, const A& v )
489+ {
490+ events::produce< Traits >( consumer, CP ( v ) );
491+ }
492+ };
493+
494+ template < typename A, typename CR, CR ( *CP )( const A& ) noexcept ( false ), typename R, void ( *P )( A&, R ) noexcept ( false ) >
495+ struct element2 < CR ( * )( const A& ) noexcept ( false ), CP, void ( * )( A&, R ) noexcept ( false ), P >
496+ {
497+ using class_t = A;
498+ using value_t = std::decay_t < R >;
499+
500+ using internal_t = value_t ;
501+
502+ [[nodiscard]] static decltype ( auto ) read( const A& v ) noexcept ( false )
503+ {
504+ return CP ( v );
505+ }
506+
507+ template < typename W >
508+ static void write ( A& v, W&& w ) noexcept ( false )
509+ {
510+ P ( v, std::forward< W >( w ) );
511+ }
512+
513+ template < template < typename ... > class Traits >
514+ static void to ( const basic_value< Traits >& v, A& x )
515+ {
516+ P ( x, v.template as < std::decay_t < R > >() );
517+ }
518+
519+ template < template < typename ... > class Traits = traits, typename Producer >
520+ static void consume ( Producer& parser, A& v )
521+ {
522+ P ( v, json::consume< Traits >( parser ) );
523+ }
524+
525+ template < template < typename ... > class Traits = traits, typename Consumer >
526+ static void produce ( Consumer& consumer, const A& v )
527+ {
528+ events::produce< Traits >( consumer, CP ( v ) );
529+ }
530+ };
531+
532+ #endif
533+
178534 } // namespace internal
179535
180536 template < auto P >
0 commit comments