// Copyright (c) 2010 Larry Evans // // 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) //Purpose: // Demonstrate error in non-classic multi_pass iterator compilation. // #include #include #include #include #include //[iterate_a2m: // copied from: // http://www.boost.org/doc/libs/1_41_0/libs/spirit/doc/html/spirit/support/multi_pass.html // define the function object template class istreambuf_functor { public: typedef std::istreambuf_iterator buf_iterator_type; typedef typename buf_iterator_type::int_type result_type; static result_type eof; istreambuf_functor(void) : current_chr(eof) {} istreambuf_functor(std::ifstream& input) : my_first(input) , current_chr(eof) {} result_type operator()() { buf_iterator_type last; if (my_first == last) { return eof; } current_chr=*my_first; ++my_first; return current_chr; } private: buf_iterator_type my_first; result_type current_chr; }; template typename istreambuf_functor::result_type istreambuf_functor:: eof ( istreambuf_functor::buf_iterator_type::traits_type::eof() ) ; //]iterate_a2m: typedef istreambuf_functor base_iterator_type; typedef boost::spirit::multi_pass < base_iterator_type , boost::spirit::iterator_policies::default_policy < boost::spirit::iterator_policies::first_owner , boost::spirit::iterator_policies::no_check , boost::spirit::iterator_policies::functor_input , boost::spirit::iterator_policies::split_std_deque > > chr_iterator_type; // ====================================================================== // Main int main() { std::ifstream in("multi_pass.txt"); unsigned num_toks=0; unsigned const max_toks=10; base_iterator_type base_first(in); chr_iterator_type chr_first(base_first); chr_iterator_type chr_last; for ( ; (chr_first != chr_last && ++num_toks < max_toks) ; ++chr_first ) { std::cout<<":num_toks="<