1 /*============================================================================= 2 Copyright (c) 2001-2011 Joel de Guzman 3 4 Distributed under the Boost Software License, Version 1.0. (See accompanying 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 6 ==============================================================================*/ 7 #if !defined(BOOST_SPIRIT_ANY_NS_SO_DECEMBER_03_2017_0826PM) 8 #define BOOST_SPIRIT_ANY_NS_SO_DECEMBER_03_2017_0826PM 9 10 #if defined(_MSC_VER) 11 #pragma once 12 #endif 13 14 #include <boost/mpl/bool.hpp> 15 #include <boost/fusion/include/equal_to.hpp> 16 #include <boost/fusion/include/next.hpp> 17 #include <boost/fusion/include/deref.hpp> 18 #include <boost/fusion/include/begin.hpp> 19 #include <boost/fusion/include/end.hpp> 20 #include <boost/fusion/include/any.hpp> 21 #include <boost/spirit/home/support/unused.hpp> 22 23 namespace boost { namespace spirit 24 { 25 // A non-short circuiting (ns) strict order (so) version of the any 26 // algorithm 27 28 namespace detail 29 { 30 template <typename First1, typename Last, typename First2, typename F> 31 inline bool any_ns_so(First1 const &,First2 const &,Last const &,F const &,mpl::true_)32 any_ns_so(First1 const&, First2 const&, Last const&, F const&, mpl::true_) 33 { 34 return false; 35 } 36 37 template <typename First1, typename Last, typename First2, typename F> 38 inline bool any_ns_so(First1 const & first1,First2 const & first2,Last const & last,F & f,mpl::false_)39 any_ns_so(First1 const& first1, First2 const& first2, Last const& last, F& f, mpl::false_) 40 { 41 bool head = f(*first1, *first2); 42 bool tail = 43 detail::any_ns_so( 44 fusion::next(first1) 45 , fusion::next(first2) 46 , last 47 , f 48 , fusion::result_of::equal_to< 49 typename fusion::result_of::next<First1>::type, Last>()); 50 return head || tail; 51 } 52 53 template <typename First, typename Last, typename F> 54 inline bool any_ns_so(First const &,Last const &,F const &,mpl::true_)55 any_ns_so(First const&, Last const&, F const&, mpl::true_) 56 { 57 return false; 58 } 59 60 template <typename First, typename Last, typename F> 61 inline bool any_ns_so(First const & first,Last const & last,F & f,mpl::false_)62 any_ns_so(First const& first, Last const& last, F& f, mpl::false_) 63 { 64 bool head = f(*first); 65 bool tail = 66 detail::any_ns_so( 67 fusion::next(first) 68 , last 69 , f 70 , fusion::result_of::equal_to< 71 typename fusion::result_of::next<First>::type, Last>()); 72 return head || tail; 73 } 74 } 75 76 template <typename Sequence1, typename Sequence2, typename F> 77 inline bool any_ns_so(Sequence1 const & seq1,Sequence2 & seq2,F f)78 any_ns_so(Sequence1 const& seq1, Sequence2& seq2, F f) 79 { 80 return detail::any_ns_so( 81 fusion::begin(seq1) 82 , fusion::begin(seq2) 83 , fusion::end(seq1) 84 , f 85 , fusion::result_of::equal_to< 86 typename fusion::result_of::begin<Sequence1>::type 87 , typename fusion::result_of::end<Sequence1>::type>()); 88 } 89 90 template <typename Sequence, typename F> 91 inline bool any_ns_so(Sequence const & seq,unused_type,F f)92 any_ns_so(Sequence const& seq, unused_type, F f) 93 { 94 return detail::any_ns_so( 95 fusion::begin(seq) 96 , fusion::end(seq) 97 , f 98 , fusion::result_of::equal_to< 99 typename fusion::result_of::begin<Sequence>::type 100 , typename fusion::result_of::end<Sequence>::type>()); 101 } 102 103 }} 104 105 #endif 106 107