/*============================================================================= 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 #include #include "impl/sstream.hpp" #include using namespace std; using namespace boost::spirit; // 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 > default_multi_pass_t; typedef look_ahead, 6> fixed_multi_pass_t; typedef multi_pass< istream_iterator, 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 void construct_string_from(void) { sstream_t ss; ss << "test string"; IterT mpend; istream_iterator 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(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(); construct_string_from(); construct_string_from(); construct_string_from(); return boost::report_errors(); }