diff options
| author | hachem <im@hachem.wtf> | 2026-09-19 20:50:28 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-19 20:50:28 +0200 |
| commit | 6487b5b5301f6cb37c95c3571578d5a42adb2a1a (patch) | |
| tree | bf90b803c6fa43058d54190fd1b52d835901bbcd /examples | |
| parent | c6aab10e74d58fbcad723c5f074a0bb51e9f2283 (diff) | |
feat: declval
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/fibonacci.sfinae | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/examples/fibonacci.sfinae b/examples/fibonacci.sfinae new file mode 100644 index 0000000..844aa69 --- /dev/null +++ b/examples/fibonacci.sfinae @@ -0,0 +1,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; |
