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 + -
显示快捷键?