find_if.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 253 行

HPP
253
字号
/*=============================================================================    Copyright (c) 2001-2006 Joel de Guzman    Copyright (c) 2007 Dan Marsden    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)==============================================================================*/#if !defined(FUSION_FIND_IF_05052005_1107)#define FUSION_FIND_IF_05052005_1107#include <boost/mpl/eval_if.hpp>#include <boost/mpl/or.hpp>#include <boost/mpl/lambda.hpp>#include <boost/mpl/apply.hpp>#include <boost/mpl/identity.hpp>#include <boost/fusion/iterator/value_of.hpp>#include <boost/fusion/iterator/equal_to.hpp>#include <boost/fusion/iterator/next.hpp>#include <boost/fusion/sequence/intrinsic/begin.hpp>#include <boost/fusion/iterator/advance.hpp>#include <boost/fusion/iterator/distance.hpp>#include <boost/fusion/support/category_of.hpp>#include <boost/mpl/eval_if.hpp>#include <boost/mpl/identity.hpp>namespace boost { namespace fusion {     struct random_access_traversal_tag;namespace detail{    template <typename Iterator, typename Pred>    struct apply_filter    {        typedef typename mpl::apply1<            Pred, typename result_of::value_of<Iterator>::type>::type type;        BOOST_STATIC_CONSTANT(int, value = type::value);    };    template <typename First, typename Last, typename Pred>    struct main_find_if;    template <typename First, typename Last, typename Pred>    struct recursive_find_if    {        typedef typename            main_find_if<                typename result_of::next<First>::type, Last, Pred            >::type        type;    };    template <typename First, typename Last, typename Pred>    struct main_find_if    {        typedef mpl::or_<            result_of::equal_to<First, Last>          , apply_filter<First, Pred> >        filter;        typedef typename            mpl::eval_if<                filter              , mpl::identity<First>              , recursive_find_if<First, Last, Pred>            >::type        type;    };    template<        typename First, typename Last,         typename Pred, bool>    struct choose_find_if;    template<typename First, typename Last, typename Pred>    struct choose_find_if<First, Last, Pred, false>        : main_find_if<First, Last, Pred>    {};    template<typename Iter, typename Pred, int n, int unrolling>    struct unroll_again;    template <typename Iter, typename Pred, int offset>    struct apply_offset_filter    {        typedef typename result_of::advance_c<Iter, offset>::type Shifted;        typedef typename            mpl::apply1<                Pred              , typename result_of::value_of<Shifted>::type            >::type        type;        BOOST_STATIC_CONSTANT(int, value = type::value);    };    template<typename Iter, typename Pred, int n>    struct unrolled_find_if    {        typedef typename mpl::eval_if<            apply_filter<Iter, Pred>,            mpl::identity<Iter>,            mpl::eval_if<              apply_offset_filter<Iter, Pred, 1>,              result_of::advance_c<Iter, 1>,              mpl::eval_if<                apply_offset_filter<Iter, Pred, 2>,                result_of::advance_c<Iter, 2>,                mpl::eval_if<                  apply_offset_filter<Iter, Pred, 3>,                  result_of::advance_c<Iter, 3>,                  unroll_again<                    Iter,                    Pred,                    n,                    4> > > > >::type type;    };    template<typename Iter, typename Pred>    struct unrolled_find_if<Iter, Pred, 3>    {        typedef typename mpl::eval_if<            apply_filter<Iter, Pred>,            mpl::identity<Iter>,            mpl::eval_if<              apply_offset_filter<Iter, Pred, 1>,              result_of::advance_c<Iter, 1>,              mpl::eval_if<                apply_offset_filter<Iter, Pred, 2>,                result_of::advance_c<Iter, 2>,                result_of::advance_c<Iter, 3> > > >::type type;    };    template<typename Iter, typename Pred>    struct unrolled_find_if<Iter, Pred, 2>    {        typedef typename mpl::eval_if<            apply_filter<Iter, Pred>,            mpl::identity<Iter>,            mpl::eval_if<              apply_offset_filter<Iter, Pred, 1>,              result_of::advance_c<Iter, 1>,              result_of::advance_c<Iter, 2> > >::type type;    };    template<typename Iter, typename Pred>    struct unrolled_find_if<Iter, Pred, 1>    {        typedef typename mpl::eval_if<            apply_filter<Iter, Pred>,            mpl::identity<Iter>,            result_of::advance_c<Iter, 1> >::type type;    };    template<typename Iter, typename Pred, int n, int unrolling>    struct unroll_again    {        typedef typename unrolled_find_if<            typename result_of::advance_c<Iter, unrolling>::type,            Pred,            n-unrolling>::type type;    };    template<typename Iter, typename Pred>    struct unrolled_find_if<Iter, Pred, 0>    {        typedef Iter type;    };    template<typename First, typename Last, typename Pred>    struct choose_find_if<First, Last, Pred, true>    {        typedef typename result_of::distance<First, Last>::type N;        typedef typename unrolled_find_if<First, Pred, N::value>::type type;    };    template <typename First, typename Last, typename Pred>    struct static_find_if    {        typedef typename            choose_find_if<                First              , Last              , typename mpl::lambda<Pred>::type              , is_base_of<random_access_traversal_tag, typename traits::category_of<First>::type>::value            >::type        type;        template <typename Iterator>        static type        recursive_call(Iterator const& iter, mpl::true_)        {            return iter;        }        template <typename Iterator>        static type        recursive_call(Iterator const& iter, mpl::false_)        {            return recursive_call(fusion::next(iter));        }        template <typename Iterator>        static type        recursive_call(Iterator const& iter)        {            typedef result_of::equal_to<Iterator, type> found;            return recursive_call(iter, found());        }        template <typename Iterator, typename Tag>        static type        choose_call(Iterator const& iter, Tag)        {            return recursive_call(iter);        }        template <typename Iterator>        static type        choose_call(Iterator const& iter, random_access_traversal_tag)        {            typedef typename result_of::distance<Iterator, type>::type N;            return fusion::advance<N>(iter);        }        template <typename Iterator>        static type        call(Iterator const& iter)        {            return choose_call(iter, typename traits::category_of<Iterator>::type());        }    };    template <typename First, typename Last, typename Pred>    struct static_seq_find_if : static_find_if<First, Last, Pred>    {        typedef typename static_find_if<First, Last, Pred>::type type;        template <typename Sequence>        static type        call(Sequence const& seq)        {            return static_find_if<First, Last, Pred>::call(fusion::begin(seq));        }        template <typename Sequence>        static type        call(Sequence& seq)        {            return static_find_if<First, Last, Pred>::call(fusion::begin(seq));        }    };}}}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?