Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Copyright (c) 2005 Eric Niebler Chris@16: Copyright (c) 2007 Dan Marsden 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_ANY_05052005_1229) Chris@16: #define FUSION_ANY_05052005_1229 Chris@16: Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace fusion { Chris@16: struct random_access_traversal_tag; Chris@16: namespace detail Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline bool Chris@16: linear_any(First const&, Last const&, F const&, mpl::true_) Chris@16: { Chris@16: return false; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline bool Chris@16: linear_any(First const& first, Last const& last, F& f, mpl::false_) Chris@16: { Chris@16: typename result_of::deref::type x = *first; Chris@101: return f(x) || Chris@16: detail::linear_any( Chris@16: fusion::next(first) Chris@16: , last Chris@16: , f Chris@16: , result_of::equal_to::type, Last>()); Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline bool Chris@16: any(Sequence const& seq, F f, Tag) Chris@16: { Chris@16: return detail::linear_any( Chris@16: fusion::begin(seq) Chris@16: , fusion::end(seq) Chris@16: , f Chris@16: , result_of::equal_to< Chris@16: typename result_of::begin::type Chris@16: , typename result_of::end::type>()); Chris@16: } Chris@16: Chris@16: template Chris@16: struct unrolled_any Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static bool call(It const& it, F f) Chris@16: { Chris@101: return Chris@101: f(*it) || Chris@16: f(*fusion::advance_c<1>(it))|| Chris@16: f(*fusion::advance_c<2>(it)) || Chris@16: f(*fusion::advance_c<3>(it)) || Chris@16: detail::unrolled_any::call(fusion::advance_c<4>(it), f); Chris@16: } Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct unrolled_any<3> Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static bool call(It const& it, F f) Chris@16: { Chris@101: return Chris@101: f(*it) || Chris@16: f(*fusion::advance_c<1>(it)) || Chris@16: f(*fusion::advance_c<2>(it)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct unrolled_any<2> Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static bool call(It const& it, F f) Chris@16: { Chris@101: return Chris@101: f(*it) || Chris@16: f(*fusion::advance_c<1>(it)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct unrolled_any<1> Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static bool call(It const& it, F f) Chris@16: { Chris@16: return f(*it); Chris@16: } Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct unrolled_any<0> Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static bool call(It const&, F) Chris@16: { Chris@16: return false; Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline bool Chris@16: any(Sequence const& seq, F f, random_access_traversal_tag) Chris@16: { Chris@16: typedef typename result_of::begin::type begin; Chris@16: typedef typename result_of::end::type end; Chris@16: return detail::unrolled_any::type::value>::call( Chris@16: fusion::begin(seq), f); Chris@16: } Chris@16: }}} Chris@16: Chris@16: #endif Chris@16: