blob: 3c125e48228cf508fa684331dced9c5276acd716 [file] [log] [blame]
///////////////////////////////////////////////////////////////////////////////
// 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