• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2003 Giovanni Bajo
3     Copyrigh (c) 2003 Martin Wille
4     http://spirit.sourceforge.net/
5 
6     Use, modification and distribution is subject to the Boost Software
7     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8     http://www.boost.org/LICENSE_1_0.txt)
9 =============================================================================*/
10 #include <boost/spirit/include/classic_multi_pass.hpp>
11 #include <iterator>
12 #include "impl/sstream.hpp"
13 #include <boost/detail/lightweight_test.hpp>
14 
15 using namespace std;
16 using namespace BOOST_SPIRIT_CLASSIC_NS;
17 
18 // Test for bug #720917
19 // http://sf.net/tracker/index.php?func=detail&aid=720917&group_id=28447&atid=393386
20 //
21 // Check that it's possible to use multi_pass
22 // together with standard library as a normal iterator
23 //
24 
25 // a functor to test out the functor_multi_pass
26 class my_functor
27 {
28     public:
29         typedef char result_type;
my_functor()30         my_functor()
31             : c('A')
32         {}
33 
operator ()()34         char operator()()
35         {
36             if (c == 'M')
37                 return eof;
38             else
39                 return c++;
40         }
41 
42         static result_type eof;
43     private:
44         char c;
45 };
46 
47 my_functor::result_type my_functor::eof = '\0';
48 
49 ////////////////////////////////////////////////
50 // four types of multi_pass iterators
51 typedef multi_pass<
52     my_functor,
53     multi_pass_policies::functor_input,
54     multi_pass_policies::first_owner,
55     multi_pass_policies::no_check,
56     multi_pass_policies::std_deque
57 > functor_multi_pass_t;
58 
59 typedef multi_pass<istream_iterator<char> > default_multi_pass_t;
60 typedef look_ahead<istream_iterator<char>, 6> fixed_multi_pass_t;
61 
62 typedef multi_pass<
63     istream_iterator<char>,
64     multi_pass_policies::input_iterator,
65     multi_pass_policies::first_owner,
66     multi_pass_policies::buf_id_check,
67     multi_pass_policies::std_deque
68 > first_owner_multi_pass_t;
69 
70 
71 ////////////////////////////////////////////////
72 // the test cases
73 template <typename IterT>
construct_string_from(void)74 void construct_string_from(void)
75 {
76     sstream_t ss;
77     ss << "test string";
78 
79     IterT mpend;
80     istream_iterator<char> a(ss);
81     IterT mp1(a);
82 
83     std::string dummy;
84 #ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
85     dummy.assign(mp1, mpend);
86 #else
87     copy(mp1, mpend, inserter(dummy, dummy.end()));
88 #endif
89 }
90 
91 template <>
construct_string_from(void)92 void construct_string_from<functor_multi_pass_t>(void)
93 {
94     functor_multi_pass_t mpend;
95     functor_multi_pass_t mp1 = functor_multi_pass_t(my_functor());
96 
97     std::string dummy;
98 #ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
99     dummy.assign(mp1, mpend);
100 #else
101     copy(mp1, mpend, inserter(dummy, dummy.end()));
102 #endif
103 }
104 
105 ////////////////////////////////////////////////
106 // Definition of the test suite
107 int
main()108 main()
109 {
110     construct_string_from<default_multi_pass_t>();
111     construct_string_from<fixed_multi_pass_t>();
112     construct_string_from<first_owner_multi_pass_t>();
113     construct_string_from<functor_multi_pass_t>();
114     return boost::report_errors();
115 }
116