You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
108 lines
3.1 KiB
108 lines
3.1 KiB
/////////////////////////////////////////////////////////////////////////////// |
|
// any.hpp |
|
// |
|
// Copyright 2008 Eric Niebler. 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) |
|
|
|
#ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_ANY_HPP_EAN_11_19_2005 |
|
#define BOOST_XPRESSIVE_DETAIL_UTILITY_ANY_HPP_EAN_11_19_2005 |
|
|
|
#include <boost/version.hpp> |
|
|
|
#if BOOST_VERSION >= 103300 |
|
|
|
// In Boost 1.33+, we have a cons list in Fusion, so just include it. |
|
|
|
# if BOOST_VERSION >= 103500 |
|
# include <boost/fusion/include/any.hpp> // Boost 1.35+ has Fusion2 |
|
# else |
|
# include <boost/spirit/fusion/algorithm/any.hpp> // Fusion1 |
|
# endif |
|
|
|
#else |
|
|
|
# include <boost/spirit/fusion/sequence/begin.hpp> |
|
# include <boost/spirit/fusion/sequence/end.hpp> |
|
# include <boost/spirit/fusion/iterator/equal_to.hpp> |
|
# include <boost/mpl/bool.hpp> |
|
# include <boost/spirit/fusion/iterator/equal_to.hpp> |
|
# include <boost/spirit/fusion/iterator/next.hpp> |
|
# include <boost/spirit/fusion/iterator/deref.hpp> |
|
|
|
namespace boost { namespace fusion |
|
{ |
|
|
|
namespace detail |
|
{ |
|
template <typename First, typename Last, typename F> |
|
inline bool |
|
any(First const&, Last const&, F const&, mpl::true_) |
|
{ |
|
return false; |
|
} |
|
|
|
template <typename First, typename Last, typename F> |
|
inline bool |
|
any(First const& first, Last const& last, F const& f, mpl::false_) |
|
{ |
|
if(f(*first)) |
|
return true; |
|
return detail::any(fusion::next(first), last, f |
|
, meta::equal_to<BOOST_DEDUCED_TYPENAME meta::next<First>::type, Last>()); |
|
} |
|
} |
|
|
|
namespace meta |
|
{ |
|
template <typename Sequence, typename F> |
|
struct any |
|
{ |
|
typedef bool type; |
|
}; |
|
} |
|
|
|
namespace function |
|
{ |
|
struct any |
|
{ |
|
template <typename Sequence, typename F> |
|
struct apply |
|
{ |
|
typedef bool type; |
|
}; |
|
|
|
template <typename Sequence, typename F> |
|
inline bool |
|
operator()(Sequence const& seq, F const& f) const |
|
{ |
|
return detail::any( |
|
fusion::begin(seq) |
|
, fusion::end(seq) |
|
, f |
|
, meta::equal_to< |
|
BOOST_DEDUCED_TYPENAME meta::begin<Sequence>::type |
|
, BOOST_DEDUCED_TYPENAME meta::end<Sequence>::type>()); |
|
} |
|
|
|
template <typename Sequence, typename F> |
|
inline bool |
|
operator()(Sequence& seq, F const& f) const |
|
{ |
|
return detail::any( |
|
fusion::begin(seq) |
|
, fusion::end(seq) |
|
, f |
|
, meta::equal_to< |
|
BOOST_DEDUCED_TYPENAME meta::begin<Sequence>::type |
|
, BOOST_DEDUCED_TYPENAME meta::end<Sequence>::type>()); |
|
} |
|
}; |
|
} |
|
|
|
function::any const any = function::any(); |
|
}} |
|
|
|
#endif |
|
|
|
#endif
|
|
|