diff options
Diffstat (limited to 'boost/hof/decay.hpp')
-rw-r--r-- | boost/hof/decay.hpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/boost/hof/decay.hpp b/boost/hof/decay.hpp new file mode 100644 index 0000000000..5b67122b67 --- /dev/null +++ b/boost/hof/decay.hpp @@ -0,0 +1,68 @@ +/*============================================================================= + Copyright (c) 2015 Paul Fultz II + decay.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_DECAY_H +#define BOOST_HOF_GUARD_DECAY_H + +/// decay +/// ===== +/// +/// Description +/// ----------- +/// +/// The `decay` function is a unary function object that returns whats given to it after decaying its type. +/// +/// Synopsis +/// -------- +/// +/// struct +/// { +/// template<class T> +/// constexpr typename decay<T>::type operator()(T&& x) const +/// { +/// return boost::hof::forward<T>(x); +/// } +/// } decay; +/// +/// References +/// ---------- +/// +/// * [n3255](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3255.html) - Proposal for `decay_copy` +/// + +#include <boost/hof/detail/delegate.hpp> +#include <boost/hof/detail/unwrap.hpp> +#include <boost/hof/detail/static_const_var.hpp> +#include <boost/hof/detail/forward.hpp> + +namespace boost { namespace hof { namespace detail { + +template<class T> +struct decay_mf +: unwrap_reference<typename std::decay<T>::type> +{}; + +struct decay_f +{ + template< + class T, + class Result=typename unwrap_reference<typename std::decay<T>::type>::type, + class=typename std::enable_if<(BOOST_HOF_IS_CONSTRUCTIBLE(Result, T))>::type + > + constexpr Result operator()(T&& x) const BOOST_HOF_NOEXCEPT_CONSTRUCTIBLE(Result, T&&) + { + return BOOST_HOF_FORWARD(T)(x); + } +}; + +} + +BOOST_HOF_DECLARE_STATIC_VAR(decay, detail::decay_f); + +}} // namespace boost::hof + +#endif |