multi_pass.hpp

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

HPP
1,308
字号
    typename CheckingPolicy,    typename StoragePolicy>inlinemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::multi_pass(InputT input)    : OP()    , CHP()    , SP()    , IP(input){}#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)    // The standard library shipped with gcc-3.1 has a bug in    // bits/basic_string.tcc. It tries  to use iter::iter(0) to    // construct an iterator. Ironically, this  happens in sanity    // checking code that isn't required by the standard.    // The workaround is to provide an additional constructor that    // ignores its int argument and behaves like the default constructor.template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::multi_pass(int)    : OP()    , CHP()    , SP()    , IP(){}#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::~multi_pass(){    if (OP::release())    {        CHP::destroy();        SP::destroy();        IP::destroy();    }}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::multi_pass(        multi_pass const& x)    : OP(x)    , CHP(x)    , SP(x)    , IP(x){    OP::clone();}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::operator=(        multi_pass const& x){    multi_pass temp(x);    temp.swap(*this);    return *this;}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inline voidmulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::swap(multi_pass& x){    OP::swap(x);    CHP::swap(x);    SP::swap(x);    IP::swap(x);}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinetypename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::referencemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::operator*() const{    CHP::check();    return SP::dereference(*this);}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinetypename multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::pointermulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::operator->() const{    return &(operator*());}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>&multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::operator++(){    CHP::check();    SP::increment(*this);    return *this;}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinemulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::operator++(int){    multi_pass    <        InputT,        InputPolicy,        OwnershipPolicy,        CheckingPolicy,        StoragePolicy    > tmp(*this);    ++*this;    return tmp;}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inline voidmulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::clear_queue(){    SP::clear_queue();    CHP::clear_queue();}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inline boolmulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::is_eof() const{    return SP::is_eof(*this);}///// Comparisonstemplate<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inline boolmulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::operator==(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,        StoragePolicy>& y) const{    bool is_eof_ = SP::is_eof(*this);    bool y_is_eof_ = SP::is_eof(y);        if (is_eof_ && y_is_eof_)    {        return true;  // both are EOF    }    else if (is_eof_ ^ y_is_eof_)    {        return false; // one is EOF, one isn't    }    else if (!IP::same_input(y))    {        return false;    }    else    {        return SP::equal_to(y);    }}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inline boolmulti_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy>::operator<(const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,        StoragePolicy>& y) const{    return SP::less_than(y);}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinebool operator!=(        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& x,        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& y){    return !(x == y);}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinebool operator>(        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& x,        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& y){    return y < x;}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinebool operator>=(        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& x,        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& y){    return !(x < y);}template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>inlinebool operator<=(        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& x,        const multi_pass<InputT, InputPolicy, OwnershipPolicy, CheckingPolicy,                        StoragePolicy>& y){    return !(y < x);}///// Generator functiontemplate <typename InputT>inline multi_pass<InputT,     multi_pass_policies::input_iterator, multi_pass_policies::ref_counted,    multi_pass_policies::buf_id_check, multi_pass_policies::std_deque>make_multi_pass(InputT i){    return multi_pass<InputT,         multi_pass_policies::input_iterator, multi_pass_policies::ref_counted,        multi_pass_policies::buf_id_check, multi_pass_policies::std_deque>(i);}// this could be a template typedef, since such a thing doesn't// exist in C++, we'll use inheritance to accomplish the same thing.template <typename InputT, std::size_t N>class look_ahead :    public multi_pass<        InputT,        multi_pass_policies::input_iterator,        multi_pass_policies::first_owner,        multi_pass_policies::no_check,        multi_pass_policies::fixed_size_queue<N> >{        typedef multi_pass<            InputT,            multi_pass_policies::input_iterator,            multi_pass_policies::first_owner,            multi_pass_policies::no_check,            multi_pass_policies::fixed_size_queue<N> > base_t;    public:        look_ahead()            : base_t() {}        explicit look_ahead(InputT x)            : base_t(x) {}        look_ahead(look_ahead const& x)            : base_t(x) {}#if BOOST_WORKAROUND(__GLIBCPP__, == 20020514)        look_ahead(int)         // workaround for a bug in the library            : base_t() {}       // shipped with gcc 3.1#endif // BOOST_WORKAROUND(__GLIBCPP__, == 20020514)    // default generated operators destructor and assignment operator are okay.};template<    typename InputT,    typename InputPolicy,    typename OwnershipPolicy,    typename CheckingPolicy,    typename StoragePolicy>void swap(    multi_pass<        InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy    > &x,    multi_pass<        InputT, InputPolicy, OwnershipPolicy, CheckingPolicy, StoragePolicy    > &y){    x.swap(y);}namespace impl {    template <typename T>    inline void mp_swap(T& t1, T& t2)    {        using std::swap;        using BOOST_SPIRIT_CLASSIC_NS::swap;        swap(t1, t2);    }}BOOST_SPIRIT_CLASSIC_NAMESPACE_END}} // namespace BOOST_SPIRIT_CLASSIC_NS#endif // BOOST_SPIRIT_ITERATOR_MULTI_PASS_HPP

⌨️ 快捷键说明

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