1 // Copyright (c) 2010 Larry Evans
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Demonstrate error in non-classic multi_pass iterator compilation.
10 #include <boost/spirit/home/qi.hpp>
11 #include <boost/spirit/home/support.hpp>
12 #include <boost/spirit/home/support/multi_pass.hpp>
13 #include <boost/spirit/home/support/iterators/detail/functor_input_policy.hpp>
19 // http://www.boost.org/doc/libs/1_41_0/libs/spirit/doc/html/spirit/support/multi_pass.html
21 // define the function object
22 template<typename CharT
=char>
23 class istreambuf_functor
27 std::istreambuf_iterator
<CharT
>
30 typename
buf_iterator_type::int_type
36 istreambuf_functor(void)
40 istreambuf_functor(std::ifstream
& input
)
45 result_type
operator()()
47 buf_iterator_type last
;
52 current_chr
=*my_first
;
58 buf_iterator_type my_first
;
59 result_type current_chr
;
62 template<typename CharT
>
63 typename istreambuf_functor
<CharT
>::result_type
64 istreambuf_functor
<CharT
>::
66 ( istreambuf_functor
<CharT
>::buf_iterator_type::traits_type::eof()
72 typedef istreambuf_functor
<char> base_iterator_type
;
75 boost::spirit::multi_pass
77 , boost::spirit::iterator_policies::default_policy
78 < boost::spirit::iterator_policies::first_owner
79 , boost::spirit::iterator_policies::no_check
80 , boost::spirit::iterator_policies::functor_input
81 , boost::spirit::iterator_policies::split_std_deque
86 // ======================================================================
90 std::ifstream
in("multi_pass.txt");
93 unsigned const max_toks
=10;
95 base_iterator_type
base_first(in
);
96 chr_iterator_type
chr_first(base_first
);
97 chr_iterator_type chr_last
;
100 ; (chr_first
!= chr_last
&& ++num_toks
< max_toks
)
104 std::cout
<<":num_toks="<<num_toks
<<":chr="<<*chr_first
<<"\n";