finder.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 647 行 · 第 1/2 页

HPP
647
字号
                    return M;                }            private:                iterator_range<search_iterator_type> m_Search;                int m_Nth;                PredicateT m_Comp;            };//  find head/tail implementation helpers ---------------------------//            template<typename ForwardIteratorT>                iterator_range<ForwardIteratorT>            find_head_impl(                ForwardIteratorT Begin,                ForwardIteratorT End,                unsigned int N,                std::forward_iterator_tag )            {                typedef ForwardIteratorT input_iterator_type;                typedef iterator_range<ForwardIteratorT> result_type;                input_iterator_type It=Begin;                for(                    unsigned int Index=0;                    Index<N && It!=End; ++Index,++It ) {};                return result_type( Begin, It );            }            template< typename ForwardIteratorT >                iterator_range<ForwardIteratorT>            find_head_impl(                ForwardIteratorT Begin,                ForwardIteratorT End,                unsigned int N,                std::random_access_iterator_tag )            {                typedef ForwardIteratorT input_iterator_type;                typedef iterator_range<ForwardIteratorT> result_type;                if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < N ) )                    return result_type( Begin, End );                return result_type(Begin,Begin+N);            }            // Find head implementation            template<typename ForwardIteratorT>                iterator_range<ForwardIteratorT>            find_head_impl(                ForwardIteratorT Begin,                ForwardIteratorT End,                unsigned int N )            {                typedef BOOST_STRING_TYPENAME boost::detail::                    iterator_traits<ForwardIteratorT>::iterator_category category;                return find_head_impl( Begin, End, N, category() );            }            template< typename ForwardIteratorT >                iterator_range<ForwardIteratorT>            find_tail_impl(                ForwardIteratorT Begin,                ForwardIteratorT End,                unsigned int N,                std::forward_iterator_tag )            {                typedef ForwardIteratorT input_iterator_type;                typedef iterator_range<ForwardIteratorT> result_type;                unsigned int Index=0;                input_iterator_type It=Begin;                input_iterator_type It2=Begin;                // Advance It2 by N increments                for( Index=0; Index<N && It2!=End; ++Index,++It2 ) {};                // Advance It, It2 to the end                for(; It2!=End; ++It,++It2 ) {};                return result_type( It, It2 );            }            template< typename ForwardIteratorT >                iterator_range<ForwardIteratorT>            find_tail_impl(                ForwardIteratorT Begin,                ForwardIteratorT End,                unsigned int N,                std::bidirectional_iterator_tag )            {                typedef ForwardIteratorT input_iterator_type;                typedef iterator_range<ForwardIteratorT> result_type;                input_iterator_type It=End;                for(                    unsigned int Index=0;                    Index<N && It!=Begin; ++Index,--It ) {};                return result_type( It, End );            }            template< typename ForwardIteratorT >                iterator_range<ForwardIteratorT>            find_tail_impl(                ForwardIteratorT Begin,                ForwardIteratorT End,                unsigned int N,                std::random_access_iterator_tag )            {                typedef ForwardIteratorT input_iterator_type;                typedef iterator_range<ForwardIteratorT> result_type;                if ( (End<=Begin) || ( static_cast<unsigned int>(End-Begin) < N ) )                    return result_type( Begin, End );                return result_type( End-N, End );            }                        // Operation            template< typename ForwardIteratorT >            iterator_range<ForwardIteratorT>            find_tail_impl(                ForwardIteratorT Begin,                ForwardIteratorT End,                unsigned int N )            {                typedef BOOST_STRING_TYPENAME boost::detail::                    iterator_traits<ForwardIteratorT>::iterator_category category;                return find_tail_impl( Begin, End, N, category() );            }//  find head functor -----------------------------------------------//            // find a head in the sequence ( functor )            /*                This functor find a head of the specified range. For                a specified N, the head is a subsequence of N starting                elements of the range.            */            struct head_finderF            {                // Construction                head_finderF( int N ) : m_N(N) {}                // Operation                template< typename ForwardIteratorT >                iterator_range<ForwardIteratorT>                operator()(                    ForwardIteratorT Begin,                    ForwardIteratorT End ) const                {                    if(m_N>=0)                    {                        return find_head_impl( Begin, End, m_N );                    }                    else                    {                        iterator_range<ForwardIteratorT> Res=                            find_tail_impl( Begin, End, -m_N );                        return make_iterator_range(Begin, Res.begin());                    }                }            private:                int m_N;            };//  find tail functor -----------------------------------------------//            // find a tail in the sequence ( functor )            /*                This functor find a tail of the specified range. For                a specified N, the head is a subsequence of N starting                elements of the range.            */            struct tail_finderF            {                // Construction                tail_finderF( int N ) : m_N(N) {}                // Operation                template< typename ForwardIteratorT >                iterator_range<ForwardIteratorT>                operator()(                    ForwardIteratorT Begin,                    ForwardIteratorT End ) const                {                    if(m_N>=0)                    {                        return find_tail_impl( Begin, End, m_N );                    }                    else                    {                        iterator_range<ForwardIteratorT> Res=                            find_head_impl( Begin, End, -m_N );                        return make_iterator_range(Res.end(), End);                    }                }            private:                int m_N;            };//  find token functor -----------------------------------------------//            // find a token in a sequence ( functor )            /*                This find functor finds a token specified be a predicate                in a sequence. It is equivalent of std::find algorithm,                with an exception that it return range instead of a single                iterator.                If bCompress is set to true, adjacent matching tokens are                concatenated into one match.            */            template< typename PredicateT >            struct token_finderF            {                // Construction                token_finderF(                    PredicateT Pred,                    token_compress_mode_type eCompress=token_compress_off ) :                        m_Pred(Pred), m_eCompress(eCompress) {}                // Operation                template< typename ForwardIteratorT >                iterator_range<ForwardIteratorT>                operator()(                    ForwardIteratorT Begin,                    ForwardIteratorT End ) const                {                    typedef iterator_range<ForwardIteratorT> result_type;                    ForwardIteratorT It=std::find_if( Begin, End, m_Pred );                    if( It==End )                    {                        return result_type( End, End );                    }                    else                    {                        ForwardIteratorT It2=It;                        if( m_eCompress==token_compress_on )                        {                            // Find first non-matching character                            while( It2!=End && m_Pred(*It2) ) ++It2;                        }                        else                        {                            // Advance by one position                            ++It2;                        }                        return result_type( It, It2 );                    }                }            private:                PredicateT m_Pred;                token_compress_mode_type m_eCompress;            };//  find range functor -----------------------------------------------//            // find a range in the sequence ( functor )            /*                This functor actually does not perform any find operation.                It always returns given iterator range as a result.            */            template<typename ForwardIterator1T>            struct range_finderF            {                typedef ForwardIterator1T input_iterator_type;                typedef iterator_range<input_iterator_type> result_type;                // Construction                range_finderF(                    input_iterator_type Begin,                    input_iterator_type End ) : m_Range(Begin, End) {}                range_finderF(const iterator_range<input_iterator_type>& Range) :                    m_Range(Range) {}                // Operation                template< typename ForwardIterator2T >                iterator_range<ForwardIterator2T>                operator()(                    ForwardIterator2T,                    ForwardIterator2T ) const                {#if BOOST_WORKAROUND( __MWERKS__, <= 0x3003 )                     return iterator_range<const ForwardIterator2T>(this->m_Range);#elif BOOST_WORKAROUND(BOOST_MSVC, <= 1300)                    return iterator_range<ForwardIterator2T>(m_Range.begin(), m_Range.end());#else                    return m_Range;#endif                }            private:                iterator_range<input_iterator_type> m_Range;            };        } // namespace detail    } // namespace algorithm} // namespace boost#endif  // BOOST_STRING_FINDER_DETAIL_HPP

⌨️ 快捷键说明

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