//  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;
}    
