123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- /*=============================================================================
- 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();
- }
|