diff options
Diffstat (limited to 'boost/hof/identity.hpp')
-rw-r--r-- | boost/hof/identity.hpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/boost/hof/identity.hpp b/boost/hof/identity.hpp new file mode 100644 index 0000000000..0c1f199fb8 --- /dev/null +++ b/boost/hof/identity.hpp @@ -0,0 +1,72 @@ +/*============================================================================= + Copyright (c) 2012 Paul Fultz II + identity.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_FUNCTION_IDENTITY_H +#define BOOST_HOF_GUARD_FUNCTION_IDENTITY_H + +/// identity +/// ======== +/// +/// Description +/// ----------- +/// +/// The `identity` function is an unary function object that returns whats given to it. +/// +/// Semantics +/// --------- +/// +/// assert(identity(x) == x); +/// +/// Synopsis +/// -------- +/// +/// template<class T> +/// constexpr T identity(T&& x); +/// + +#include <utility> +#include <initializer_list> +#include <boost/hof/detail/forward.hpp> +#include <boost/hof/detail/static_const_var.hpp> + +namespace boost { namespace hof { namespace identity_detail { + +struct identity_base +{ + template<class T> + constexpr T operator()(T&& x) const + noexcept(std::is_reference<T>::value || BOOST_HOF_IS_NOTHROW_MOVE_CONSTRUCTIBLE(T)) + { + return BOOST_HOF_FORWARD(T)(x); + } + + template<class T> + constexpr std::initializer_list<T>& operator()(std::initializer_list<T>& x) const noexcept + { + return x; + } + + template<class T> + constexpr const std::initializer_list<T>& operator()(const std::initializer_list<T>& x) const noexcept + { + return x; + } + + template<class T> + constexpr std::initializer_list<T> operator()(std::initializer_list<T>&& x) const noexcept(noexcept(std::initializer_list<T>(std::move(x)))) + { + return BOOST_HOF_FORWARD(std::initializer_list<T>)(x); + } +}; + +} + +BOOST_HOF_DECLARE_STATIC_VAR(identity, identity_detail::identity_base); + +}} // namespace boost::hof + +#endif |