211 lines
6.0 KiB
C++
211 lines
6.0 KiB
C++
|
|
#ifndef BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
|
|
#define BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
|
|
|
|
// Copyright Aleksey Gurtovoy 2001-2004
|
|
// Copyright David Abrahams 2001-2002
|
|
//
|
|
// 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)
|
|
//
|
|
// See http://www.boost.org/libs/mpl for documentation.
|
|
|
|
// $Id: iter_fold_if_impl.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
|
|
// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
|
|
// $Revision: 49267 $
|
|
|
|
#if !defined(BOOST_MPL_PREPROCESSING_MODE)
|
|
# include <boost/mpl/identity.hpp>
|
|
# include <boost/mpl/next.hpp>
|
|
# include <boost/mpl/if.hpp>
|
|
# include <boost/mpl/apply.hpp>
|
|
# include <boost/mpl/aux_/value_wknd.hpp>
|
|
#endif
|
|
|
|
#include <boost/mpl/aux_/config/use_preprocessed.hpp>
|
|
|
|
#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
|
|
&& !defined(BOOST_MPL_PREPROCESSING_MODE)
|
|
|
|
# define BOOST_MPL_PREPROCESSED_HEADER iter_fold_if_impl.hpp
|
|
# include <boost/mpl/aux_/include_preprocessed.hpp>
|
|
|
|
#else
|
|
|
|
# include <boost/mpl/limits/unrolling.hpp>
|
|
# include <boost/preprocessor/arithmetic/sub.hpp>
|
|
# include <boost/preprocessor/repeat.hpp>
|
|
# include <boost/preprocessor/inc.hpp>
|
|
# include <boost/preprocessor/dec.hpp>
|
|
# include <boost/preprocessor/cat.hpp>
|
|
|
|
namespace boost { namespace mpl { namespace aux {
|
|
|
|
template< typename Iterator, typename State >
|
|
struct iter_fold_if_null_step
|
|
{
|
|
typedef State state;
|
|
typedef Iterator iterator;
|
|
};
|
|
|
|
template< bool >
|
|
struct iter_fold_if_step_impl
|
|
{
|
|
template<
|
|
typename Iterator
|
|
, typename State
|
|
, typename StateOp
|
|
, typename IteratorOp
|
|
>
|
|
struct result_
|
|
{
|
|
typedef typename apply2<StateOp,State,Iterator>::type state;
|
|
typedef typename IteratorOp::type iterator;
|
|
};
|
|
};
|
|
|
|
template<>
|
|
struct iter_fold_if_step_impl<false>
|
|
{
|
|
template<
|
|
typename Iterator
|
|
, typename State
|
|
, typename StateOp
|
|
, typename IteratorOp
|
|
>
|
|
struct result_
|
|
{
|
|
typedef State state;
|
|
typedef Iterator iterator;
|
|
};
|
|
};
|
|
|
|
// agurt, 25/jun/02: MSVC 6.5 workaround, had to get rid of inheritance
|
|
// here and in 'iter_fold_if_backward_step', because sometimes it interfered
|
|
// with the "early template instantiation bug" in _really_ ugly ways
|
|
template<
|
|
typename Iterator
|
|
, typename State
|
|
, typename ForwardOp
|
|
, typename Predicate
|
|
>
|
|
struct iter_fold_if_forward_step
|
|
{
|
|
typedef typename apply2<Predicate,State,Iterator>::type not_last;
|
|
typedef typename iter_fold_if_step_impl<
|
|
BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
|
|
>::template result_< Iterator,State,ForwardOp,mpl::next<Iterator> > impl_;
|
|
|
|
typedef typename impl_::state state;
|
|
typedef typename impl_::iterator iterator;
|
|
};
|
|
|
|
template<
|
|
typename Iterator
|
|
, typename State
|
|
, typename BackwardOp
|
|
, typename Predicate
|
|
>
|
|
struct iter_fold_if_backward_step
|
|
{
|
|
typedef typename apply2<Predicate,State,Iterator>::type not_last;
|
|
typedef typename iter_fold_if_step_impl<
|
|
BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value
|
|
>::template result_< Iterator,State,BackwardOp,identity<Iterator> > impl_;
|
|
|
|
typedef typename impl_::state state;
|
|
typedef typename impl_::iterator iterator;
|
|
};
|
|
|
|
|
|
// local macros, #undef-ined at the end of the header
|
|
|
|
# define AUX_ITER_FOLD_FORWARD_STEP(unused, i, unused2) \
|
|
typedef iter_fold_if_forward_step< \
|
|
typename BOOST_PP_CAT(forward_step,i)::iterator \
|
|
, typename BOOST_PP_CAT(forward_step,i)::state \
|
|
, ForwardOp \
|
|
, ForwardPredicate \
|
|
> BOOST_PP_CAT(forward_step, BOOST_PP_INC(i)); \
|
|
/**/
|
|
|
|
# define AUX_ITER_FOLD_BACKWARD_STEP_FUNC(i) \
|
|
typedef iter_fold_if_backward_step< \
|
|
typename BOOST_PP_CAT(forward_step,BOOST_PP_DEC(i))::iterator \
|
|
, typename BOOST_PP_CAT(backward_step,i)::state \
|
|
, BackwardOp \
|
|
, BackwardPredicate \
|
|
> BOOST_PP_CAT(backward_step,BOOST_PP_DEC(i)); \
|
|
/**/
|
|
|
|
# define AUX_ITER_FOLD_BACKWARD_STEP(unused, i, unused2) \
|
|
AUX_ITER_FOLD_BACKWARD_STEP_FUNC( \
|
|
BOOST_PP_SUB_D(1,BOOST_MPL_LIMIT_UNROLLING,i) \
|
|
) \
|
|
/**/
|
|
|
|
# define AUX_LAST_FORWARD_STEP \
|
|
BOOST_PP_CAT(forward_step, BOOST_MPL_LIMIT_UNROLLING) \
|
|
/**/
|
|
|
|
# define AUX_LAST_BACKWARD_STEP \
|
|
BOOST_PP_CAT(backward_step, BOOST_MPL_LIMIT_UNROLLING) \
|
|
/**/
|
|
|
|
template<
|
|
typename Iterator
|
|
, typename State
|
|
, typename ForwardOp
|
|
, typename ForwardPredicate
|
|
, typename BackwardOp
|
|
, typename BackwardPredicate
|
|
>
|
|
struct iter_fold_if_impl
|
|
{
|
|
private:
|
|
typedef iter_fold_if_null_step<Iterator,State> forward_step0;
|
|
BOOST_PP_REPEAT(
|
|
BOOST_MPL_LIMIT_UNROLLING
|
|
, AUX_ITER_FOLD_FORWARD_STEP
|
|
, unused
|
|
)
|
|
|
|
typedef typename if_<
|
|
typename AUX_LAST_FORWARD_STEP::not_last
|
|
, iter_fold_if_impl<
|
|
typename AUX_LAST_FORWARD_STEP::iterator
|
|
, typename AUX_LAST_FORWARD_STEP::state
|
|
, ForwardOp
|
|
, ForwardPredicate
|
|
, BackwardOp
|
|
, BackwardPredicate
|
|
>
|
|
, iter_fold_if_null_step<
|
|
typename AUX_LAST_FORWARD_STEP::iterator
|
|
, typename AUX_LAST_FORWARD_STEP::state
|
|
>
|
|
>::type AUX_LAST_BACKWARD_STEP;
|
|
|
|
BOOST_PP_REPEAT(
|
|
BOOST_MPL_LIMIT_UNROLLING
|
|
, AUX_ITER_FOLD_BACKWARD_STEP
|
|
, unused
|
|
)
|
|
|
|
public:
|
|
typedef typename backward_step0::state state;
|
|
typedef typename AUX_LAST_BACKWARD_STEP::iterator iterator;
|
|
};
|
|
|
|
# undef AUX_LAST_BACKWARD_STEP
|
|
# undef AUX_LAST_FORWARD_STEP
|
|
# undef AUX_ITER_FOLD_BACKWARD_STEP
|
|
# undef AUX_ITER_FOLD_BACKWARD_STEP_FUNC
|
|
# undef AUX_ITER_FOLD_FORWARD_STEP
|
|
|
|
}}}
|
|
|
|
#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
|
|
#endif // BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED
|