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