hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/examples/fibonacci.sfinae
blob: 844aa69c0a1745ac60e156414d61087755b1ad70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// fib(0) to fib(10), each line a tuple: some characters, the counter, and the call
// ::declval<T>() pulls the value back out of a call result so it can go into ::sum

::define<
    ::name<'f', 'i', 'b'>,
    ::parameters<::name<'n'>>,
    ::sequence<
        ::enable_if_t<
            ::less<::value_of<::name<'n'>>, ::difference<'C', 'A'>>::value,
            ::sequence<::return<::decltype(::value_of<::name<'n'>>)>::commit>
        >::commit,
        ::return<
            ::decltype(
                ::sum<
                    ::declval<
                        ::invoke_result_t<
                            ::name<'f', 'i', 'b'>,
                            ::arguments<
                                ::decltype(::sum<::value_of<::name<'n'>>, ::difference<'A', 'B'>>)
                            >
                        >
                    >(),
                    ::declval<
                        ::invoke_result_t<
                            ::name<'f', 'i', 'b'>,
                            ::arguments<
                                ::decltype(::sum<::value_of<::name<'n'>>, ::difference<'A', 'C'>>)
                            >
                        >
                    >()
                >
            )
        >::commit
    >
>::commit;

::declare<::name<'i'>, ::decltype(::difference<'A', 'A'>)>::commit;

::repeat<
    ::difference<'L', 'A'>,
    ::sequence<
        ::emit<
            ::tuple<
            ::integral_constant<::char, ::difference<'f', '\0'>>,
            ::integral_constant<::char, ::difference<'i', '\0'>>,
            ::integral_constant<::char, ::difference<'b', '\0'>>,
            ::integral_constant<::char, ::difference<'(', '\0'>>,
                ::decltype(::value_of<::name<'i'>>),
            ::integral_constant<::char, ::difference<')', '\0'>>,
            ::integral_constant<::char, ::difference<' ', '\0'>>,
            ::integral_constant<::char, ::difference<'-', '\0'>>,
            ::integral_constant<::char, ::difference<'>', '\0'>>,
            ::integral_constant<::char, ::difference<' ', '\0'>>,
                ::invoke_result_t<
                    ::name<'f', 'i', 'b'>,
                    ::arguments<::decltype(::value_of<::name<'i'>>)>
                >
            >
        >::commit,
        ::declare<
            ::name<'n', 'e', 'x', 't'>,
            ::decltype(::sum<::value_of<::name<'i'>>, ::difference<'B', 'A'>>)
        >::commit,
        ::undeclare<::name<'i'>>::commit,
        ::declare<::name<'i'>, ::decltype(::value_of<::name<'n', 'e', 'x', 't'>>)>::commit,
        ::undeclare<::name<'n', 'e', 'x', 't'>>::commit
    >
>::commit;