1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <algorithm>
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <sstream>
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <functional>
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <iterator>
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <vector>
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <string>
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h"
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std;
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass IStreamIteratorTest : public CPPUNIT_NS::TestCase
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE(IStreamIteratorTest);
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && defined (_STLP_USE_NO_IOSTREAMS)
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_IGNORE;
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(istmit1);
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS)
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_IGNORE;
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST(copy_n_test);
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_TEST_SUITE_END();
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected:
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void istmit1();
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void copy_n_test();
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(IStreamIteratorTest);
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (STLPORT) || !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef istream_iterator<char> istream_char_ite;
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef istream_iterator<int> istream_int_ite;
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef istream_iterator<string> istream_string_ite;
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef istream_iterator<char, ptrdiff_t> istream_char_ite;
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef istream_iterator<int, ptrdiff_t> istream_int_ite;
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef istream_iterator<string, ptrdiff_t> istream_string_ite;
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IStreamIteratorTest::istmit1()
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  const char* buff = "MyString";
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  istringstream istr(buff);
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char buffer[100];
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t i = 0;
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  istr.unsetf(ios::skipws); // Disable white-space skipping.
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  istream_char_ite s(istr), meos;
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  while (!(s == meos)  &&
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //*TY 01/10/1999 - added end of stream check
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // NOTE operator!= should not be used here ifndef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott         (*s != '\n') &&
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott         (i < sizeof(buffer) / sizeof(buffer[0]))) {  //*TY 07/28/98 - added index check
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    buffer[i++] = *s++;
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  buffer[i] = '\0'; // Null terminate buffer.
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  CPPUNIT_ASSERT(!strcmp(buffer, buff));
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istringstream empty_istr;
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( istream_char_ite(empty_istr) == istream_char_ite() );
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid IStreamIteratorTest::copy_n_test()
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && !defined (_STLP_USE_NO_IOSTREAMS)
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //This test check that no character is lost while reading the istream
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //through a istream_iterator.
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istringstream istr("aabbcd");
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    string chars;
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istream_char_ite ite = copy_n(copy_n(istream_char_ite(istr),
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                         2, back_inserter(chars)).first,
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                                  2, back_inserter(chars)).first;
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( chars == "aabb" );
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy_n(ite, 2, back_inserter(chars));
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( chars == "aabbcd" );
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istringstream istr("11 22 AA BB 33 44 CC DD");
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> ints;
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<string> strings;
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy_n(istream_int_ite(istr), 2, back_inserter(ints));
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints.size() == 2 );
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[0] == 11 );
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[1] == 22 );
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ints.clear();
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istr.clear();
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy_n(istream_string_ite(istr), 2, back_inserter(strings));
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( strings.size() == 2 );
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( strings[0] == "AA" );
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( strings[1] == "BB" );
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    strings.clear();
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istr.clear();
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* The following code cannot work, '33' is extracted as a string
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * in the previous copy_n call, this value is returned in the pair
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * returned by copy_n but is lost as this istream_iterator is not used.
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * copy_n and istream_iterator can only be combined safely if:
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * - you always extract the same type of istream_iterator and you always reuse
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * the istream_iterator returned by copy_n (see previous test with "aabbcd")
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * - you extract different type of object and no object is convertible to an other
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * as in this current test when you extract int and string (when you extract ints
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     * again it fails as int can be converted to strings.
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     *
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy_n(istream_int_ite(istr), 2, back_inserter(ints));
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints.size() == 2 );
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[0] == 33 );
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[1] == 44 );
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istr.clear();
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    copy_n(istream_string_ite(istr), 2, back_inserter(strings));
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( strings.size() == 2 );
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( strings[0] == "CC" );
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( strings[1] == "DD" );
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    */
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istringstream is("1 2 3 4 5 6 7 8 9 10");
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<int> ints;
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    istream_iterator<int> itr(is);
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    itr = copy_n(itr, 0, back_inserter(ints)).first;
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints.empty() );
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    itr = copy_n(itr, -1, back_inserter(ints)).first;
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints.empty() );
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    itr = copy_n(itr, 2, back_inserter(ints)).first;
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints.size() == 2 );
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[0] == 1 );
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[1] == 2 );
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    itr = copy_n(itr, 2, back_inserter(ints)).first;
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints.size() == 4 );
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[2] == 3 );
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[3] == 4 );
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    itr = copy_n(itr, 2, back_inserter(ints)).first;
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints.size() == 6 );
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[4] == 5 );
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( ints[5] == 6 );
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
160