vari
Loading...
Searching...
No Matches
dispatch.h
1
23
24#pragma once
25
26#include "util.h"
27
28#include <cstddef>
29#include <utility>
30
31namespace vari
32{
33
34template < index_type Off, index_type N, typename F >
35constexpr decltype( auto ) _dispatch_index( index_type const i, F&& f )
36{
37#define VARI_GEN_CASE( x ) \
38 case Off + ( x ): \
39 if constexpr ( ( Off + ( x ) ) < N ) \
40 return ( (F&&) f ).template operator()< Off + ( x ) >();
41
42 switch ( i ) {
43 VARI_GEN_CASE( 0 )
44 VARI_GEN_CASE( 1 )
45 VARI_GEN_CASE( 2 )
46 VARI_GEN_CASE( 3 )
47 VARI_GEN_CASE( 4 )
48 VARI_GEN_CASE( 5 )
49 VARI_GEN_CASE( 6 )
50 VARI_GEN_CASE( 7 )
51 VARI_GEN_CASE( 8 )
52 VARI_GEN_CASE( 9 )
53 VARI_GEN_CASE( 10 )
54 VARI_GEN_CASE( 11 )
55 VARI_GEN_CASE( 12 )
56 VARI_GEN_CASE( 13 )
57 VARI_GEN_CASE( 14 )
58 VARI_GEN_CASE( 15 )
59 VARI_GEN_CASE( 16 )
60 VARI_GEN_CASE( 17 )
61 VARI_GEN_CASE( 18 )
62 VARI_GEN_CASE( 19 )
63 VARI_GEN_CASE( 20 )
64 VARI_GEN_CASE( 21 )
65 VARI_GEN_CASE( 22 )
66 VARI_GEN_CASE( 23 )
67 VARI_GEN_CASE( 24 )
68 VARI_GEN_CASE( 25 )
69 VARI_GEN_CASE( 26 )
70 VARI_GEN_CASE( 27 )
71 VARI_GEN_CASE( 28 )
72 VARI_GEN_CASE( 29 )
73 VARI_GEN_CASE( 30 )
74 VARI_GEN_CASE( 31 )
75 default:
76 if constexpr ( N > Off + 32 )
77 return _dispatch_index< Off + 32, N >( i, (F&&) f );
78 }
79
80
81#undef VARI_GEN_CASE
82
83#if defined( __cpp_lib_unreachable )
84 std::unreachable();
85#elif defined( _MSC_VER )
86 __assume( false );
87#else
88 __builtin_unreachable();
89#endif
90}
91
92template < typename T, typename... Fs >
93constexpr decltype( auto ) _dispatch_fun( T&& item, Fs&&... fs )
94{
95 auto&& f = _function_picker< T >::pick( (Fs&&) fs... );
96 return std::forward< decltype( f ) >( f )( (T&&) item );
97}
98
99} // namespace vari
MIT License.
Definition: dispatch.h:32