diff options
Diffstat (limited to 'boost/fusion/algorithm/transformation/detail/replace_if.hpp')
-rw-r--r-- | boost/fusion/algorithm/transformation/detail/replace_if.hpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/boost/fusion/algorithm/transformation/detail/replace_if.hpp b/boost/fusion/algorithm/transformation/detail/replace_if.hpp new file mode 100644 index 0000000000..d45ca39219 --- /dev/null +++ b/boost/fusion/algorithm/transformation/detail/replace_if.hpp @@ -0,0 +1,73 @@ +/*============================================================================= + Copyright (c) 2001-2011 Joel de Guzman + + 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) +==============================================================================*/ +#if !defined(FUSION_REPLACE_IF_08182005_0946) +#define FUSION_REPLACE_IF_08182005_0946 + +#include <boost/utility/enable_if.hpp> +#include <boost/mpl/if.hpp> +#include <boost/type_traits/remove_reference.hpp> + +namespace boost { namespace fusion { namespace detail +{ + template <bool is_convertible> + struct replacer_if_helper; + + template <> + struct replacer_if_helper<false> + { + template <typename U, typename F, typename T> + static U& + call(U& x, F&, T const&) + { + return x; + } + }; + + template <> + struct replacer_if_helper<true> + { + template <typename U, typename F, typename T> + static U + call(U& x, F& f, T const& new_value) + { + return f(x) ? new_value : x; + } + }; + + template <typename F, typename T> + struct replacer_if + { + replacer_if(F in_f, T const& in_new_value) + : f(in_f), new_value(in_new_value) {} + + template<typename Params> + struct result; + + template <typename F1, typename T1, typename U> + struct result<replacer_if<F1, T1>(U)> + { + typedef typename remove_reference<U>::type value; + typedef typename + mpl::if_<is_convertible<T, value>, value, value const&>::type + type; + }; + + template <typename U> + typename result<replacer_if(U)>::type + operator()(U const& x) const + { + return replacer_if_helper<is_convertible<T, U>::value>:: + call(x, f, new_value); + } + + F f; + T new_value; + }; +}}} + +#endif + |