Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2011 Joel de Guzman
|
Chris@16
|
3
|
Chris@16
|
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 ==============================================================================*/
|
Chris@16
|
7 #if !defined(FUSION_COUNT_09162005_0158)
|
Chris@16
|
8 #define FUSION_COUNT_09162005_0158
|
Chris@16
|
9
|
Chris@101
|
10 #include <boost/fusion/support/config.hpp>
|
Chris@16
|
11 #include <boost/config.hpp>
|
Chris@16
|
12 #include <boost/mpl/or.hpp>
|
Chris@16
|
13 #include <boost/type_traits/is_convertible.hpp>
|
Chris@16
|
14 #include <boost/fusion/support/detail/access.hpp>
|
Chris@16
|
15
|
Chris@16
|
16 #if defined (BOOST_MSVC)
|
Chris@16
|
17 # pragma warning(push)
|
Chris@16
|
18 # pragma warning (disable: 4512) // assignment operator could not be generated.
|
Chris@16
|
19 #endif
|
Chris@16
|
20
|
Chris@16
|
21 namespace boost { namespace fusion { namespace detail
|
Chris@16
|
22 {
|
Chris@16
|
23 template <bool is_convertible>
|
Chris@16
|
24 struct compare_convertible;
|
Chris@16
|
25
|
Chris@16
|
26 // T1 is convertible to T2 or vice versa
|
Chris@16
|
27 template <>
|
Chris@101
|
28 struct compare_convertible<true>
|
Chris@16
|
29 {
|
Chris@16
|
30 template <typename T1, typename T2>
|
Chris@101
|
31 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
32 static bool
|
Chris@16
|
33 call(T1 const& x, T2 const& y)
|
Chris@16
|
34 {
|
Chris@16
|
35 return x == y;
|
Chris@16
|
36 }
|
Chris@16
|
37 };
|
Chris@16
|
38
|
Chris@16
|
39 // T1 is NOT convertible to T2 NOR vice versa
|
Chris@16
|
40 template <>
|
Chris@16
|
41 struct compare_convertible<false>
|
Chris@16
|
42 {
|
Chris@16
|
43 template <typename T1, typename T2>
|
Chris@101
|
44 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
45 static bool
|
Chris@16
|
46 call(T1 const&, T2 const&)
|
Chris@16
|
47 {
|
Chris@16
|
48 return false;
|
Chris@16
|
49 }
|
Chris@16
|
50 };
|
Chris@16
|
51
|
Chris@16
|
52 template <typename T1>
|
Chris@16
|
53 struct count_compare
|
Chris@16
|
54 {
|
Chris@16
|
55 typedef typename detail::call_param<T1>::type param;
|
Chris@101
|
56 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
57 count_compare(param in_x)
|
Chris@16
|
58 : x(in_x) {}
|
Chris@16
|
59
|
Chris@16
|
60 template <typename T2>
|
Chris@101
|
61 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
62 bool
|
Chris@101
|
63 operator()(T2 const& y) const
|
Chris@16
|
64 {
|
Chris@101
|
65 return
|
Chris@16
|
66 compare_convertible<
|
Chris@16
|
67 mpl::or_<
|
Chris@16
|
68 is_convertible<T1, T2>
|
Chris@16
|
69 , is_convertible<T2, T1>
|
Chris@16
|
70 >::value
|
Chris@16
|
71 >::call(x, y);
|
Chris@16
|
72 }
|
Chris@16
|
73
|
Chris@16
|
74 param x;
|
Chris@16
|
75 };
|
Chris@16
|
76 }}}
|
Chris@16
|
77
|
Chris@16
|
78 #if defined (BOOST_MSVC)
|
Chris@16
|
79 # pragma warning(pop)
|
Chris@16
|
80 #endif
|
Chris@16
|
81
|
Chris@16
|
82 #endif
|
Chris@16
|
83
|