@@ -76,6 +76,8 @@ namespace tao::json::binding
76
76
}
77
77
};
78
78
79
+ #if defined(__GNUC__) || defined(__clang__)
80
+
79
81
template < bool N, typename C, typename T, T ( *P )( const C& ) noexcept ( N ) >
80
82
struct element < T ( * )( const C& ) noexcept ( N ), P >
81
83
{
@@ -96,9 +98,55 @@ namespace tao::json::binding
96
98
}
97
99
};
98
100
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
+
99
145
template < typename CT, CT CP, typename T, T P >
100
146
struct element2 ;
101
147
148
+ #if defined(__GNUC__) || defined(__clang__)
149
+
102
150
template < bool CN, bool N, typename A, typename CR, CR ( *CP )( const A& ) noexcept ( CN ), typename R, R ( *P )( A& ) noexcept ( N ) >
103
151
struct element2 < CR ( * )( const A& ) noexcept ( CN ), CP, R ( * )( A& ) noexcept ( N ), P >
104
152
{
@@ -175,6 +223,314 @@ namespace tao::json::binding
175
223
}
176
224
};
177
225
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
+
178
534
} // namespace internal
179
535
180
536
template < auto P >
0 commit comments