Skip to content

Commit 568e59d

Browse files
committed
Fix MSVC build?
1 parent 1536057 commit 568e59d

File tree

1 file changed

+356
-0
lines changed

1 file changed

+356
-0
lines changed

include/tao/json/binding/element.hpp

Lines changed: 356 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)