📄 token_iterator.hpp
字号:
public: // Constructor explicit token_iterator_base() : m_is_dropped( use_isspace ), m_is_kept( use_ispunct ), m_keep_empty_tokens( false ), m_token_produced( false ) { }protected: template<typename Modifier> token_iterator_base& use( Modifier const& m ) { m.apply( m_is_dropped, m_is_kept, m_keep_empty_tokens ); return *this; } template<typename Iter> bool get( Iter& begin, Iter end ) { typedef ut_detail::token_assigner<BOOST_DEDUCED_TYPENAME iterator_traversal<Iter>::type> Assigner; Iter checkpoint; Assigner::clear( this->m_value ); if( !m_keep_empty_tokens ) { while( begin != end && m_is_dropped( *begin ) ) ++begin; if( begin == end ) return false; checkpoint = begin; if( m_is_kept( *begin ) ) Assigner::append_move( begin, this->m_value ); else while( begin != end && !m_is_dropped( *begin ) && !m_is_kept( *begin ) ) Assigner::append_move( begin, this->m_value ); } else { // m_keep_empty_tokens ia true checkpoint = begin; if( begin == end ) { if( m_token_produced ) return false; m_token_produced = true; } else if( m_is_kept( *begin ) ) { if( m_token_produced ) Assigner::append_move( begin, this->m_value ); m_token_produced = !m_token_produced; } else if( !m_token_produced && m_is_dropped( *begin ) ) m_token_produced = true; else { if( m_is_dropped( *begin ) ) checkpoint = ++begin; while( begin != end && !m_is_dropped( *begin ) && !m_is_kept( *begin ) ) Assigner::append_move( begin, this->m_value ); m_token_produced = true; } } Assigner::assign( checkpoint, begin, this->m_value ); return true; }private: // Data members delim_policy m_is_dropped; delim_policy m_is_kept; bool m_keep_empty_tokens; bool m_token_produced;};// ************************************************************************** //// ************** basic_string_token_iterator ************** //// ************************************************************************** //template<typename CharT, typename CharCompare = ut_detail::default_char_compare<CharT> >class basic_string_token_iterator: public token_iterator_base<basic_string_token_iterator<CharT,CharCompare>,CharT,CharCompare> { typedef basic_cstring<CharT const> cstring; typedef token_iterator_base<basic_string_token_iterator<CharT,CharCompare>,CharT,CharCompare> base;public: explicit basic_string_token_iterator() {} explicit basic_string_token_iterator( cstring src ) : m_src( src ) { this->init(); } template<typename Src, typename M1> basic_string_token_iterator( Src src, M1 const& m1 ) : m_src( src ) { this->use( m1 ); this->init(); } template<typename Src, typename M1, typename M2> basic_string_token_iterator( Src src, M1 const& m1, M2 const& m2 ) : m_src( src ) { this->use( m1 ); this->use( m2 ); this->init(); } template<typename Src, typename M1, typename M2, typename M3> basic_string_token_iterator( Src src, M1 const& m1, M2 const& m2, M3 const& m3 ) : m_src( src ) { this->use( m1 ); this->use( m2 ); this->use( m3 ); this->init(); }private: friend class input_iterator_core_access; // input iterator implementation bool get() { typename cstring::iterator begin = m_src.begin(); bool res = base::get( begin, m_src.end() ); m_src.assign( begin, m_src.end() ); return res; } // Data members cstring m_src;};typedef basic_string_token_iterator<char> string_token_iterator;typedef basic_string_token_iterator<wchar_t> wstring_token_iterator;// ************************************************************************** //// ************** range_token_iterator ************** //// ************************************************************************** //template<typename Iter, typename CharCompare = ut_detail::default_char_compare<BOOST_DEDUCED_TYPENAME iterator_value<Iter>::type>, typename ValueType = std::basic_string<BOOST_DEDUCED_TYPENAME iterator_value<Iter>::type>, typename Reference = ValueType const&>class range_token_iterator: public token_iterator_base<range_token_iterator<Iter,CharCompare,ValueType,Reference>, typename iterator_value<Iter>::type,CharCompare,ValueType,Reference> { typedef basic_cstring<typename ValueType::value_type> cstring; typedef token_iterator_base<range_token_iterator<Iter,CharCompare,ValueType,Reference>, typename iterator_value<Iter>::type,CharCompare,ValueType,Reference> base;public: explicit range_token_iterator() {} explicit range_token_iterator( Iter begin, Iter end = Iter() ) : m_begin( begin ), m_end( end ) { this->init(); } template<typename M1> range_token_iterator( Iter begin, Iter end, M1 const& m1 ) : m_begin( begin ), m_end( end ) { this->use( m1 ); this->init(); } template<typename M1,typename M2> range_token_iterator( Iter begin, Iter end, M1 const& m1, M2 const& m2 ) : m_begin( begin ), m_end( end ) { this->use( m1 ); this->use( m2 ); this->init(); } template<typename M1,typename M2,typename M3> range_token_iterator( Iter begin, Iter end, M1 const& m1, M2 const& m2, M3 const& m3 ) : m_begin( begin ), m_end( end ) { this->use( m1 ); this->use( m2 ); this->use( m3 ); this->init(); }private: friend class input_iterator_core_access; // input iterator implementation bool get() { return base::get( m_begin, m_end ); } // Data members Iter m_begin; Iter m_end;};// ************************************************************************** //// ************** make_range_token_iterator ************** //// ************************************************************************** //template<typename Iter>inline range_token_iterator<Iter>make_range_token_iterator( Iter begin, Iter end = Iter() ){ return range_token_iterator<Iter>( begin, end );}//____________________________________________________________________________//template<typename Iter,typename M1>inline range_token_iterator<Iter>make_range_token_iterator( Iter begin, Iter end, M1 const& m1 ){ return range_token_iterator<Iter>( begin, end, m1 );}//____________________________________________________________________________//template<typename Iter, typename M1, typename M2>inline range_token_iterator<Iter>make_range_token_iterator( Iter begin, Iter end, M1 const& m1, M2 const& m2 ){ return range_token_iterator<Iter>( begin, end, m1, m2 );}//____________________________________________________________________________//template<typename Iter,typename M1, typename M2, typename M3>inline range_token_iterator<Iter>make_range_token_iterator( Iter begin, Iter end, M1 const& m1, M2 const& m2, M3 const& m3 ){ return range_token_iterator<Iter>( begin, end, m1, m2, m3 );}//____________________________________________________________________________//} // namespace unit_test} // namespace boost// ***************************************************************************// Revision History :// // $Log: token_iterator.hpp,v $// Revision 1.1.1.1 2004/11/20 10:52:25 spion// Import of Boost v. 1.32.0//// Revision 1.7.2.1 2004/10/30 11:34:27 agurtovoy// MSVC/Borland fixes//// Revision 1.7 2004/10/01 10:50:40 rogeeff// gcc 2.95 workarounds//// Revision 1.6 2004/09/27 08:38:08 rogeeff// msvc workaround//// Revision 1.5 2004/09/19 09:22:13 rogeeff// ios fix for classic iostreams//// Revision 1.4 2004/07/20 12:46:39 vladimir_prus// Add "this->", since gcc 3.4 has two-phase lookup.//// Revision 1.3 2004/07/19 12:29:57 rogeeff// guard rename// mingw port//// Revision 1.2 2004/06/07 07:33:50 rogeeff// detail namespace renamed//// Revision 1.1 2004/06/05 11:03:12 rogeeff// input_iterator_adaptor simplified// token_iterator added//// ***************************************************************************#endif // BOOST_TOKEN_ITERATOR_HPP_071894GER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -