text: /*=============================================================================
      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
  
  