/* @copyright Louis Dionne 2015 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include #include #include using namespace boost::hana; using namespace std::literals; //! [main] auto arithmetic_operators = make_map( make_pair(char_<'+'>, [](auto x, auto y) { return x + y; }), make_pair(char_<'-'>, [](auto x, auto y) { return x - y; }) // and so on... ); template auto function() { return eval_if(arithmetic_operators ^contains^ char_, [](auto _) { return right(_(arithmetic_operators)[char_]); }, [](auto _) { return left(_(op) + " is not a valid operation"s); } ); } template auto digit() { return if_(bool_<(n >= '0' && n <= '9')>, right(static_cast(n - 48)), left(n + " is not a valid digit"s) ); } template auto evaluate = ap(function(), digit(), digit()); int main() { BOOST_HANA_RUNTIME_CHECK(evaluate<'1', '+', '2'> == right(1 + 2)); BOOST_HANA_RUNTIME_CHECK(evaluate<'?', '+', '2'> == left("? is not a valid digit"s)); BOOST_HANA_RUNTIME_CHECK(evaluate<'1', '?', '2'> == left("? is not a valid operation"s)); BOOST_HANA_RUNTIME_CHECK(evaluate<'1', '+', '?'> == left("? is not a valid digit"s)); BOOST_HANA_RUNTIME_CHECK(evaluate<'?', '?', '?'> == left("? is not a valid operation"s)); } //! [main]