Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(FUSION_COUNT_09162005_0158) Chris@16: #define FUSION_COUNT_09162005_0158 Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #if defined (BOOST_MSVC) Chris@16: # pragma warning(push) Chris@16: # pragma warning (disable: 4512) // assignment operator could not be generated. Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace fusion { namespace detail Chris@16: { Chris@16: template Chris@16: struct compare_convertible; Chris@16: Chris@16: // T1 is convertible to T2 or vice versa Chris@16: template <> Chris@101: struct compare_convertible Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static bool Chris@16: call(T1 const& x, T2 const& y) Chris@16: { Chris@16: return x == y; Chris@16: } Chris@16: }; Chris@16: Chris@16: // T1 is NOT convertible to T2 NOR vice versa Chris@16: template <> Chris@16: struct compare_convertible Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static bool Chris@16: call(T1 const&, T2 const&) Chris@16: { Chris@16: return false; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct count_compare Chris@16: { Chris@16: typedef typename detail::call_param::type param; Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: count_compare(param in_x) Chris@16: : x(in_x) {} Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: bool Chris@101: operator()(T2 const& y) const Chris@16: { Chris@101: return Chris@16: compare_convertible< Chris@16: mpl::or_< Chris@16: is_convertible Chris@16: , is_convertible Chris@16: >::value Chris@16: >::call(x, y); Chris@16: } Chris@16: Chris@16: param x; Chris@16: }; Chris@16: }}} Chris@16: Chris@16: #if defined (BOOST_MSVC) Chris@16: # pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif Chris@16: