blob: 4b241c6bf42ad3e0c98fd8b4547577165079dd2e [file] [log] [blame]
// 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 <boost/spirit/home/qi.hpp>
#include <boost/spirit/home/support.hpp>
#include <boost/spirit/home/support/multi_pass.hpp>
#include <boost/spirit/home/support/iterators/detail/functor_input_policy.hpp>
#include <fstream>
//[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<typename CharT=char>
class istreambuf_functor
{
public:
typedef
std::istreambuf_iterator<CharT>
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 CharT>
typename istreambuf_functor<CharT>::result_type
istreambuf_functor<CharT>::
eof
( istreambuf_functor<CharT>::buf_iterator_type::traits_type::eof()
)
;
//]iterate_a2m:
typedef istreambuf_functor<char> 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(int argc, char** argv)
{
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="<<num_toks<<":chr="<<*chr_first<<"\n";
}
return 0;
}