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& append(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.append(first, last); 26 LIBCPP_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.append(first, last); 38 assert(false); 39 } 40 catch (...) {} 41 LIBCPP_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("12345")); 57 test(S("12345"), s, s+1, S("12345A")); 58 test(S("12345"), s, s+10, S("12345ABCDEFGHIJ")); 59 test(S("12345"), s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 60 61 test(S("1234567890"), s, s, S("1234567890")); 62 test(S("1234567890"), s, s+1, S("1234567890A")); 63 test(S("1234567890"), s, s+10, S("1234567890ABCDEFGHIJ")); 64 test(S("1234567890"), s, s+52, S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 65 66 test(S("12345678901234567890"), s, s, S("12345678901234567890")); 67 test(S("12345678901234567890"), s, s+1, S("12345678901234567890""A")); 68 test(S("12345678901234567890"), s, s+10, S("12345678901234567890""ABCDEFGHIJ")); 69 test(S("12345678901234567890"), s, s+52, 70 S("12345678901234567890""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("12345")); 81 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 82 S("12345A")); 83 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 84 S("12345ABCDEFGHIJ")); 85 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 86 S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 87 88 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 89 S("1234567890")); 90 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 91 S("1234567890A")); 92 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 93 S("1234567890ABCDEFGHIJ")); 94 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 95 S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 96 97 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 98 S("12345678901234567890")); 99 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 100 S("12345678901234567890""A")); 101 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 102 S("12345678901234567890""ABCDEFGHIJ")); 103 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 104 S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 105 } 106 #if TEST_STD_VER >= 11 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("12345")); 116 test(S("12345"), s, s+1, S("12345A")); 117 test(S("12345"), s, s+10, S("12345ABCDEFGHIJ")); 118 test(S("12345"), s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 119 120 test(S("1234567890"), s, s, S("1234567890")); 121 test(S("1234567890"), s, s+1, S("1234567890A")); 122 test(S("1234567890"), s, s+10, S("1234567890ABCDEFGHIJ")); 123 test(S("1234567890"), s, s+52, S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 124 125 test(S("12345678901234567890"), s, s, S("12345678901234567890")); 126 test(S("12345678901234567890"), s, s+1, S("12345678901234567890""A")); 127 test(S("12345678901234567890"), s, s+10, S("12345678901234567890""ABCDEFGHIJ")); 128 test(S("12345678901234567890"), s, s+52, 129 S("12345678901234567890""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("12345")); 140 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 141 S("12345A")); 142 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 143 S("12345ABCDEFGHIJ")); 144 test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 145 S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 146 147 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 148 S("1234567890")); 149 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 150 S("1234567890A")); 151 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 152 S("1234567890ABCDEFGHIJ")); 153 test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 154 S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")); 155 156 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s), 157 S("12345678901234567890")); 158 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1), 159 S("12345678901234567890""A")); 160 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10), 161 S("12345678901234567890""ABCDEFGHIJ")); 162 test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52), 163 S("12345678901234567890""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 { // test appending to self 183 typedef std::string S; 184 S s_short = "123/"; 185 S s_long = "Lorem ipsum dolor sit amet, consectetur/"; 186 187 s_short.append(s_short.begin(), s_short.end()); 188 assert(s_short == "123/123/"); 189 s_short.append(s_short.begin(), s_short.end()); 190 assert(s_short == "123/123/123/123/"); 191 s_short.append(s_short.begin(), s_short.end()); 192 assert(s_short == "123/123/123/123/123/123/123/123/"); 193 194 s_long.append(s_long.begin(), s_long.end()); 195 assert(s_long == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/"); 196 } 197 198 { // test appending a different type 199 typedef std::string S; 200 const uint8_t p[] = "ABCD"; 201 202 S s; 203 s.append(p, p + 4); 204 assert(s == "ABCD"); 205 } 206 207 { // test with a move iterator that returns char&& 208 typedef forward_iterator<const char*> It; 209 typedef std::move_iterator<It> MoveIt; 210 const char p[] = "ABCD"; 211 std::string s; 212 s.append(MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1))); 213 assert(s == "ABCD"); 214 } 215 { // test with a move iterator that returns char&& 216 typedef const char* It; 217 typedef std::move_iterator<It> MoveIt; 218 const char p[] = "ABCD"; 219 std::string s; 220 s.append(MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1))); 221 assert(s == "ABCD"); 222 } 223 } 224