0ac381dcf3
[SVN r44371]
116 lines
3.0 KiB
C++
116 lines
3.0 KiB
C++
/*=============================================================================
|
|
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();
|
|
}
|