diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:12:59 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2019-12-05 15:12:59 +0900 |
commit | b8cf34c691623e4ec329053cbbf68522a855882d (patch) | |
tree | 34da08632a99677f6b79ecb65e5b655a5b69a67f /boost/hof/eval.hpp | |
parent | 3fdc3e5ee96dca5b11d1694975a65200787eab86 (diff) | |
download | boost-upstream/1.67.0.tar.gz boost-upstream/1.67.0.tar.bz2 boost-upstream/1.67.0.zip |
Imported Upstream version 1.67.0upstream/1.67.0
Diffstat (limited to 'boost/hof/eval.hpp')
-rw-r--r-- | boost/hof/eval.hpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/boost/hof/eval.hpp b/boost/hof/eval.hpp new file mode 100644 index 0000000000..dcfb6b3ab5 --- /dev/null +++ b/boost/hof/eval.hpp @@ -0,0 +1,86 @@ +/*============================================================================= + Copyright (c) 2015 Paul Fultz II + eval.h + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +==============================================================================*/ + +#ifndef BOOST_HOF_GUARD_EVAL_H +#define BOOST_HOF_GUARD_EVAL_H + +/// eval +/// ==== +/// +/// Description +/// ----------- +/// +/// The `eval` function will evaluate a "thunk". This can be either a nullary +/// function or it can be a unary function that takes the identity function as +/// the first parameter(which is helpful to delay compile-time checking). +/// Also, additional parameters can be passed to `eval` to delay +/// compiliation(so that result can depend on template parameters). +/// +/// Synopsis +/// -------- +/// +/// template<class F, class... Ts> +/// constexpr auto eval(F&& f, Ts&&...); +/// +/// Requirements +/// ------------ +/// +/// F must be: +/// +/// * [EvaluatableFunctionObject](EvaluatableFunctionObject) +/// +/// Example +/// ------- +/// +/// #include <boost/hof.hpp> +/// #include <cassert> +/// +/// int main() { +/// assert(boost::hof::eval([]{ return 3; }) == 3); +/// } +/// +/// References +/// ---------- +/// +/// * [POO51](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0051r2.pdf) - Proposal for C++ +/// Proposal for C++ generic overload function +/// * [static_if](static_if) +/// * [Ordering evaluation of arguments](<Ordering evaluation of arguments>) +/// + +#include <boost/hof/always.hpp> +#include <boost/hof/identity.hpp> +#include <boost/hof/first_of.hpp> +#include <boost/hof/detail/result_of.hpp> + +namespace boost { namespace hof { + +namespace detail { + +struct simple_eval +{ + template<class F, class... Ts> + constexpr BOOST_HOF_SFINAE_RESULT(F) + operator()(F&& f, Ts&&...xs) const BOOST_HOF_SFINAE_RETURNS + (boost::hof::always_ref(f)(xs...)()); +}; + +struct id_eval +{ + template<class F, class... Ts> + constexpr BOOST_HOF_SFINAE_RESULT(F, id_<decltype(boost::hof::identity)>) + operator()(F&& f, Ts&&...xs) const BOOST_HOF_SFINAE_RETURNS + (boost::hof::always_ref(f)(xs...)(boost::hof::identity)); +}; + +} + +BOOST_HOF_DECLARE_STATIC_VAR(eval, boost::hof::first_of_adaptor<detail::simple_eval, detail::id_eval>); + +}} // namespace boost::hof + +#endif |