| /*============================================================================= |
| Copyright (c) 2001-2006 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_COUNT_09162005_0158) |
| #define FUSION_COUNT_09162005_0158 |
| |
| #include <boost/config.hpp> |
| #include <boost/mpl/or.hpp> |
| #include <boost/type_traits/is_convertible.hpp> |
| #include <boost/fusion/support/detail/access.hpp> |
| |
| #if defined (BOOST_MSVC) |
| # pragma warning(push) |
| # pragma warning (disable: 4512) // assignment operator could not be generated. |
| #endif |
| |
| namespace boost { namespace fusion { namespace detail |
| { |
| template <bool is_convertible> |
| struct compare_convertible; |
| |
| // T1 is convertible to T2 or vice versa |
| template <> |
| struct compare_convertible<true> |
| { |
| template <typename T1, typename T2> |
| static bool |
| call(T1 const& x, T2 const& y) |
| { |
| return x == y; |
| } |
| }; |
| |
| // T1 is NOT convertible to T2 NOR vice versa |
| template <> |
| struct compare_convertible<false> |
| { |
| template <typename T1, typename T2> |
| static bool |
| call(T1 const&, T2 const&) |
| { |
| return false; |
| } |
| }; |
| |
| template <typename T1> |
| struct count_compare |
| { |
| typedef typename detail::call_param<T1>::type param; |
| count_compare(param in_x) |
| : x(in_x) {} |
| |
| template <typename T2> |
| bool |
| operator()(T2 const& y) |
| { |
| return |
| compare_convertible< |
| mpl::or_< |
| is_convertible<T1, T2> |
| , is_convertible<T2, T1> |
| >::value |
| >::call(x, y); |
| } |
| |
| param x; |
| }; |
| }}} |
| |
| #if defined (BOOST_MSVC) |
| # pragma warning(pop) |
| #endif |
| |
| #endif |
| |