blob: 4e2724d5277fc22dda298fe446c3419a3c3c7ab2 [file] [log] [blame]
/*=============================================================================
Copyright (c) 2003 Giovanni Bajo
Copyrigh (c) 2003 Martin Wille
http://spirit.sourceforge.net/
Use, modification and distribution is subject to 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)
=============================================================================*/
#include <boost/spirit/include/classic_multi_pass.hpp>
#include <iterator>
#include "impl/sstream.hpp"
#include <boost/detail/lightweight_test.hpp>
using namespace std;
using namespace BOOST_SPIRIT_CLASSIC_NS;
// Test for bug #720917
// http://sf.net/tracker/index.php?func=detail&aid=720917&group_id=28447&atid=393386
//
// Check that it's possible to use multi_pass
// together with standard library as a normal iterator
//
// a functor to test out the functor_multi_pass
class my_functor
{
public:
typedef char result_type;
my_functor()
: c('A')
{}
char operator()()
{
if (c == 'M')
return eof;
else
return c++;
}
static result_type eof;
private:
char c;
};
my_functor::result_type my_functor::eof = '\0';
////////////////////////////////////////////////
// four types of multi_pass iterators
typedef multi_pass<
my_functor,
multi_pass_policies::functor_input,
multi_pass_policies::first_owner,
multi_pass_policies::no_check,
multi_pass_policies::std_deque
> functor_multi_pass_t;
typedef multi_pass<istream_iterator<char> > default_multi_pass_t;
typedef look_ahead<istream_iterator<char>, 6> fixed_multi_pass_t;
typedef multi_pass<
istream_iterator<char>,
multi_pass_policies::input_iterator,
multi_pass_policies::first_owner,
multi_pass_policies::buf_id_check,
multi_pass_policies::std_deque
> first_owner_multi_pass_t;
////////////////////////////////////////////////
// the test cases
template <typename IterT>
void construct_string_from(void)
{
sstream_t ss;
ss << "test string";
IterT mpend;
istream_iterator<char> a(ss);
IterT mp1(a);
std::string dummy;
#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
dummy.assign(mp1, mpend);
#else
copy(mp1, mpend, inserter(dummy, dummy.end()));
#endif
}
template <>
void construct_string_from<functor_multi_pass_t>(void)
{
functor_multi_pass_t mpend;
functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
std::string dummy;
#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
dummy.assign(mp1, mpend);
#else
copy(mp1, mpend, inserter(dummy, dummy.end()));
#endif
}
////////////////////////////////////////////////
// Definition of the test suite
int
main()
{
construct_string_from<default_multi_pass_t>();
construct_string_from<fixed_multi_pass_t>();
construct_string_from<first_owner_multi_pass_t>();
construct_string_from<functor_multi_pass_t>();
return boost::report_errors();
}