iter_iter_iter.pass.cpp 10 KB

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