/////////////////////////////////////////////////////////////////////////////// | |
// 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 |