iterator.pass.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. // <string>
  10. // template<class InputIterator>
  11. // basic_string& append(InputIterator first, InputIterator last);
  12. #include <string>
  13. #include <cassert>
  14. #include "test_iterators.h"
  15. #include "min_allocator.h"
  16. template <class S, class It>
  17. void
  18. test(S s, It first, It last, S expected)
  19. {
  20. s.append(first, last);
  21. LIBCPP_ASSERT(s.__invariants());
  22. assert(s == expected);
  23. }
  24. #ifndef TEST_HAS_NO_EXCEPTIONS
  25. template <class S, class It>
  26. void
  27. test_exceptions(S s, It first, It last)
  28. {
  29. S aCopy = s;
  30. try {
  31. s.append(first, last);
  32. assert(false);
  33. }
  34. catch (...) {}
  35. LIBCPP_ASSERT(s.__invariants());
  36. assert(s == aCopy);
  37. }
  38. #endif
  39. int main()
  40. {
  41. {
  42. typedef std::string S;
  43. const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  44. test(S(), s, s, S());
  45. test(S(), s, s+1, S("A"));
  46. test(S(), s, s+10, S("ABCDEFGHIJ"));
  47. test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  48. test(S("12345"), s, s, S("12345"));
  49. test(S("12345"), s, s+1, S("12345A"));
  50. test(S("12345"), s, s+10, S("12345ABCDEFGHIJ"));
  51. test(S("12345"), s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  52. test(S("1234567890"), s, s, S("1234567890"));
  53. test(S("1234567890"), s, s+1, S("1234567890A"));
  54. test(S("1234567890"), s, s+10, S("1234567890ABCDEFGHIJ"));
  55. test(S("1234567890"), s, s+52, S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  56. test(S("12345678901234567890"), s, s, S("12345678901234567890"));
  57. test(S("12345678901234567890"), s, s+1, S("12345678901234567890""A"));
  58. test(S("12345678901234567890"), s, s+10, S("12345678901234567890""ABCDEFGHIJ"));
  59. test(S("12345678901234567890"), s, s+52,
  60. S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  61. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S());
  62. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
  63. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  64. S("ABCDEFGHIJ"));
  65. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  66. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  67. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  68. S("12345"));
  69. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  70. S("12345A"));
  71. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  72. S("12345ABCDEFGHIJ"));
  73. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  74. S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  75. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  76. S("1234567890"));
  77. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  78. S("1234567890A"));
  79. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  80. S("1234567890ABCDEFGHIJ"));
  81. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  82. S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  83. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  84. S("12345678901234567890"));
  85. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  86. S("12345678901234567890""A"));
  87. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  88. S("12345678901234567890""ABCDEFGHIJ"));
  89. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  90. S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  91. }
  92. #if TEST_STD_VER >= 11
  93. {
  94. typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
  95. const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  96. test(S(), s, s, S());
  97. test(S(), s, s+1, S("A"));
  98. test(S(), s, s+10, S("ABCDEFGHIJ"));
  99. test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  100. test(S("12345"), s, s, S("12345"));
  101. test(S("12345"), s, s+1, S("12345A"));
  102. test(S("12345"), s, s+10, S("12345ABCDEFGHIJ"));
  103. test(S("12345"), s, s+52, S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  104. test(S("1234567890"), s, s, S("1234567890"));
  105. test(S("1234567890"), s, s+1, S("1234567890A"));
  106. test(S("1234567890"), s, s+10, S("1234567890ABCDEFGHIJ"));
  107. test(S("1234567890"), s, s+52, S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  108. test(S("12345678901234567890"), s, s, S("12345678901234567890"));
  109. test(S("12345678901234567890"), s, s+1, S("12345678901234567890""A"));
  110. test(S("12345678901234567890"), s, s+10, S("12345678901234567890""ABCDEFGHIJ"));
  111. test(S("12345678901234567890"), s, s+52,
  112. S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  113. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S());
  114. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
  115. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  116. S("ABCDEFGHIJ"));
  117. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  118. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  119. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  120. S("12345"));
  121. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  122. S("12345A"));
  123. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  124. S("12345ABCDEFGHIJ"));
  125. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  126. S("12345ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  127. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  128. S("1234567890"));
  129. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  130. S("1234567890A"));
  131. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  132. S("1234567890ABCDEFGHIJ"));
  133. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  134. S("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  135. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  136. S("12345678901234567890"));
  137. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  138. S("12345678901234567890""A"));
  139. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  140. S("12345678901234567890""ABCDEFGHIJ"));
  141. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  142. S("12345678901234567890""ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  143. }
  144. #endif
  145. #ifndef TEST_HAS_NO_EXCEPTIONS
  146. { // test iterator operations that throw
  147. typedef std::string S;
  148. typedef ThrowingIterator<char> TIter;
  149. typedef input_iterator<TIter> IIter;
  150. const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  151. test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter());
  152. test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter());
  153. test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter());
  154. test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter());
  155. test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter());
  156. test_exceptions(S(), TIter(s, s+10, 6, TIter::TAComparison), TIter());
  157. }
  158. #endif
  159. { // test appending to self
  160. typedef std::string S;
  161. S s_short = "123/";
  162. S s_long = "Lorem ipsum dolor sit amet, consectetur/";
  163. s_short.append(s_short.begin(), s_short.end());
  164. assert(s_short == "123/123/");
  165. s_short.append(s_short.begin(), s_short.end());
  166. assert(s_short == "123/123/123/123/");
  167. s_short.append(s_short.begin(), s_short.end());
  168. assert(s_short == "123/123/123/123/123/123/123/123/");
  169. s_long.append(s_long.begin(), s_long.end());
  170. assert(s_long == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
  171. }
  172. { // test appending a different type
  173. typedef std::string S;
  174. const uint8_t p[] = "ABCD";
  175. S s;
  176. s.append(p, p + 4);
  177. assert(s == "ABCD");
  178. }
  179. { // test with a move iterator that returns char&&
  180. typedef forward_iterator<const char*> It;
  181. typedef std::move_iterator<It> MoveIt;
  182. const char p[] = "ABCD";
  183. std::string s;
  184. s.append(MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
  185. assert(s == "ABCD");
  186. }
  187. { // test with a move iterator that returns char&&
  188. typedef const char* It;
  189. typedef std::move_iterator<It> MoveIt;
  190. const char p[] = "ABCD";
  191. std::string s;
  192. s.append(MoveIt(It(std::begin(p))), MoveIt(It(std::end(p) - 1)));
  193. assert(s == "ABCD");
  194. }
  195. }