sub_match_vector.hpp

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

HPP
172
字号
///////////////////////////////////////////////////////////////////////////////// sub_match_vector.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_CORE_SUB_MATCH_VECTOR_HPP_EAN_10_04_2005#define BOOST_XPRESSIVE_DETAIL_CORE_SUB_MATCH_VECTOR_HPP_EAN_10_04_2005// MS compatible compilers support #pragma once#if defined(_MSC_VER) && (_MSC_VER >= 1020)# pragma once#endif#include <boost/noncopyable.hpp>#include <boost/iterator_adaptors.hpp>#include <boost/xpressive/detail/detail_fwd.hpp>#include <boost/xpressive/detail/core/sub_match_impl.hpp>namespace boost { namespace xpressive { namespace detail{#if BOOST_ITERATOR_ADAPTORS_VERSION >= 0x0200//////////////////////////////////////////////////////////////////////////// sub_match_iterator//template<typename Value, typename MainIter>struct sub_match_iterator  : iterator_adaptor    <        sub_match_iterator<Value, MainIter>      , MainIter      , Value      , std::random_access_iterator_tag    >{    typedef iterator_adaptor    <        sub_match_iterator<Value, MainIter>      , MainIter      , Value      , std::random_access_iterator_tag    > base_t;    sub_match_iterator(MainIter baseiter)      : base_t(baseiter)    {    }};#endif//////////////////////////////////////////////////////////////////////////// sub_match_vector//template<typename BidiIter>struct sub_match_vector  : private noncopyable{private:    struct dummy { int i_; };    typedef int dummy::*bool_type;public:    typedef sub_match<BidiIter> value_type;    typedef std::size_t size_type;    typedef value_type const &const_reference;    typedef const_reference reference;    typedef typename iterator_difference<BidiIter>::type difference_type;    typedef typename iterator_value<BidiIter>::type char_type;    typedef typename sub_match<BidiIter>::string_type string_type;#if BOOST_ITERATOR_ADAPTORS_VERSION >= 0x0200    typedef sub_match_iterator    <        value_type const      , sub_match_impl<BidiIter> const *    > const_iterator;#else    typedef iterator_adaptor    <        sub_match_impl<BidiIter> const *      , default_iterator_policies      , value_type      , value_type const &      , value_type const *    > const_iterator;#endif // BOOST_ITERATOR_ADAPTORS_VERSION < 0x0200    typedef const_iterator iterator;    sub_match_vector()      : size_(0)      , sub_matches_(0)    {    }    const_reference operator [](size_type index) const    {        static value_type const s_null;        return (index >= this->size_)            ? s_null            : *static_cast<value_type const *>(&this->sub_matches_[ index ]);    }    size_type size() const    {        return this->size_;    }    bool empty() const    {        return 0 == this->size();    }    const_iterator begin() const    {        return const_iterator(this->sub_matches_);    }    const_iterator end() const    {        return const_iterator(this->sub_matches_ + this->size_);    }    operator bool_type() const    {        return (!this->empty() && (*this)[0].matched) ? &dummy::i_ : 0;    }    bool operator !() const    {        return this->empty() || !(*this)[0].matched;    }    void swap(sub_match_vector<BidiIter> &that)    {        std::swap(this->size_, that.size_);        std::swap(this->sub_matches_, that.sub_matches_);    }private:    friend struct detail::core_access<BidiIter>;    void init_(sub_match_impl<BidiIter> *sub_matches, size_type size)    {        this->size_ = size;        this->sub_matches_ = sub_matches;    }    void init_(sub_match_impl<BidiIter> *sub_matches, size_type size, sub_match_vector<BidiIter> const &that)    {        BOOST_ASSERT(size == that.size_);        this->size_ = size;        this->sub_matches_ = sub_matches;        std::copy(that.sub_matches_, that.sub_matches_ + that.size_, this->sub_matches_);    }    size_type size_;    sub_match_impl<BidiIter> *sub_matches_;};}}} // namespace boost::xpressive::detail#endif

⌨️ 快捷键说明

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