1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <string> 11 12 // template<class InputIterator> 13 // basic_string& assign(InputIterator first, InputIterator last); 14 15 #include <string> 16 #include <cassert> 17 18 #include "test_iterators.h" 19 #include "min_allocator.h" 20 21 template <class S, class It> 22 void 23 test(S s, It first, It last, S expected) 24 { 25 s.assign(first, last); 26 assert(s.__invariants()); 27 assert(s == expected); 28 } 29 30 #ifndef TEST_HAS_NO_EXCEPTIONS 31 template <class S, class It> 32 void 33 test_exceptions(S s, It first, It last) 34 { 35 S aCopy = s; 36 try { 37 s.assign(first, last); 38 assert(false); 39 } 40 catch (...) {} 41 assert(s.__invariants()); 42 assert(s == aCopy); 43 } 44 #endif 45 46 int main() 47 { 48 { 49 typedef std::string S; 50 const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 51 test(S(), s, s, S()); 52 test(S(), s, s+1, S("A")); 53 test(S(), s, s+10, S("ABCDEFGHIJ")); 54 test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 55 56 test(S("12345"), s, s, S()); 57 test(S("12345"), s, s+1, S("A")); 58 test(S("12345"), s, s+10, S("ABCDEFGHIJ")); 59 test(S("12345"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 60 61 test(S("1234567890"), s, s, S()); 62 test(S("1234567890"), s, s+1, S("A")); 63 test(S("1234567890"), s, s+10, S("ABCDEFGHIJ")); 64 test(S("1234567890"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 65 66 test(S("12345678901234567890"), s, s, S()); 67 test(S("12345678901234567890"), s, s+1, S("A")); 68 test(S("12345678901234567890"), s, s+10, S("ABCDEFGHIJ")); 69 test(S("12345678901234567890"), s, s+52, 70 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 71 72 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S()); 73 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A")); 74 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 75 S("ABCDEFGHIJ")); 76 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 77 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 78 79 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s), 80 S()); 81 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 82 S("A")); 83 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 84 S("ABCDEFGHIJ")); 85 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 86 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 87 88 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 89 S()); 90 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 91 S("A")); 92 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 93 S("ABCDEFGHIJ")); 94 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 95 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 96 97 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 98 S()); 99 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 100 S("A")); 101 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 102 S("ABCDEFGHIJ")); 103 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 104 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 105 } 106 #if __cplusplus >= 201103L 107 { 108 typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S; 109 const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 110 test(S(), s, s, S()); 111 test(S(), s, s+1, S("A")); 112 test(S(), s, s+10, S("ABCDEFGHIJ")); 113 test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 114 115 test(S("12345"), s, s, S()); 116 test(S("12345"), s, s+1, S("A")); 117 test(S("12345"), s, s+10, S("ABCDEFGHIJ")); 118 test(S("12345"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 119 120 test(S("1234567890"), s, s, S()); 121 test(S("1234567890"), s, s+1, S("A")); 122 test(S("1234567890"), s, s+10, S("ABCDEFGHIJ")); 123 test(S("1234567890"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 124 125 test(S("12345678901234567890"), s, s, S()); 126 test(S("12345678901234567890"), s, s+1, S("A")); 127 test(S("12345678901234567890"), s, s+10, S("ABCDEFGHIJ")); 128 test(S("12345678901234567890"), s, s+52, 129 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 130 131 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S()); 132 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A")); 133 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 134 S("ABCDEFGHIJ")); 135 test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 136 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 137 138 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s), 139 S()); 140 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 141 S("A")); 142 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 143 S("ABCDEFGHIJ")); 144 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 145 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 146 147 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 148 S()); 149 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 150 S("A")); 151 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 152 S("ABCDEFGHIJ")); 153 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 154 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 155 156 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 157 S()); 158 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 159 S("A")); 160 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 161 S("ABCDEFGHIJ")); 162 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 163 S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 164 } 165 #endif 166 #ifndef TEST_HAS_NO_EXCEPTIONS 167 { // test iterator operations that throw 168 typedef std::string S; 169 typedef ThrowingIterator<char> TIter; 170 typedef input_iterator<TIter> IIter; 171 const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 172 test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter()); 173 test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter()); 174 test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter()); 175 176 test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter()); 177 test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter()); 178 test_exceptions(S(), TIter(s, s+10, 6, TIter::TAComparison), TIter()); 179 } 180 #endif 181 } 182