iterator.pass.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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& assign(InputIterator first, InputIterator last);
  12. #include <string>
  13. #include <cassert>
  14. #include "test_macros.h"
  15. #include "test_iterators.h"
  16. #include "min_allocator.h"
  17. template <class S, class It>
  18. void
  19. test(S s, It first, It last, S expected)
  20. {
  21. s.assign(first, last);
  22. LIBCPP_ASSERT(s.__invariants());
  23. assert(s == expected);
  24. }
  25. #ifndef TEST_HAS_NO_EXCEPTIONS
  26. template <class S, class It>
  27. void
  28. test_exceptions(S s, It first, It last)
  29. {
  30. S aCopy = s;
  31. try {
  32. s.assign(first, last);
  33. assert(false);
  34. }
  35. catch (...) {}
  36. LIBCPP_ASSERT(s.__invariants());
  37. assert(s == aCopy);
  38. }
  39. #endif
  40. int main()
  41. {
  42. {
  43. typedef std::string S;
  44. const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  45. test(S(), s, s, S());
  46. test(S(), s, s+1, S("A"));
  47. test(S(), s, s+10, S("ABCDEFGHIJ"));
  48. test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  49. test(S("12345"), s, s, S());
  50. test(S("12345"), s, s+1, S("A"));
  51. test(S("12345"), s, s+10, S("ABCDEFGHIJ"));
  52. test(S("12345"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  53. test(S("1234567890"), s, s, S());
  54. test(S("1234567890"), s, s+1, S("A"));
  55. test(S("1234567890"), s, s+10, S("ABCDEFGHIJ"));
  56. test(S("1234567890"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  57. test(S("12345678901234567890"), s, s, S());
  58. test(S("12345678901234567890"), s, s+1, S("A"));
  59. test(S("12345678901234567890"), s, s+10, S("ABCDEFGHIJ"));
  60. test(S("12345678901234567890"), s, s+52,
  61. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  62. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S());
  63. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
  64. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  65. S("ABCDEFGHIJ"));
  66. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  67. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  68. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  69. S());
  70. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  71. S("A"));
  72. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  73. S("ABCDEFGHIJ"));
  74. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  75. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  76. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  77. S());
  78. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  79. S("A"));
  80. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  81. S("ABCDEFGHIJ"));
  82. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  83. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  84. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  85. S());
  86. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  87. S("A"));
  88. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  89. S("ABCDEFGHIJ"));
  90. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  91. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  92. }
  93. #if TEST_STD_VER >= 11
  94. {
  95. typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
  96. const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  97. test(S(), s, s, S());
  98. test(S(), s, s+1, S("A"));
  99. test(S(), s, s+10, S("ABCDEFGHIJ"));
  100. test(S(), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  101. test(S("12345"), s, s, S());
  102. test(S("12345"), s, s+1, S("A"));
  103. test(S("12345"), s, s+10, S("ABCDEFGHIJ"));
  104. test(S("12345"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  105. test(S("1234567890"), s, s, S());
  106. test(S("1234567890"), s, s+1, S("A"));
  107. test(S("1234567890"), s, s+10, S("ABCDEFGHIJ"));
  108. test(S("1234567890"), s, s+52, S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  109. test(S("12345678901234567890"), s, s, S());
  110. test(S("12345678901234567890"), s, s+1, S("A"));
  111. test(S("12345678901234567890"), s, s+10, S("ABCDEFGHIJ"));
  112. test(S("12345678901234567890"), s, s+52,
  113. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  114. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s), S());
  115. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+1), S("A"));
  116. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  117. S("ABCDEFGHIJ"));
  118. test(S(), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  119. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  120. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  121. S());
  122. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  123. S("A"));
  124. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  125. S("ABCDEFGHIJ"));
  126. test(S("12345"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  127. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  128. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  129. S());
  130. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  131. S("A"));
  132. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  133. S("ABCDEFGHIJ"));
  134. test(S("1234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  135. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  136. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s),
  137. S());
  138. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+1),
  139. S("A"));
  140. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+10),
  141. S("ABCDEFGHIJ"));
  142. test(S("12345678901234567890"), input_iterator<const char*>(s), input_iterator<const char*>(s+52),
  143. S("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"));
  144. }
  145. #endif
  146. #ifndef TEST_HAS_NO_EXCEPTIONS
  147. { // test iterator operations that throw
  148. typedef std::string S;
  149. typedef ThrowingIterator<char> TIter;
  150. typedef input_iterator<TIter> IIter;
  151. const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  152. test_exceptions(S(), IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter());
  153. test_exceptions(S(), IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter());
  154. test_exceptions(S(), IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter());
  155. test_exceptions(S(), TIter(s, s+10, 4, TIter::TAIncrement), TIter());
  156. test_exceptions(S(), TIter(s, s+10, 5, TIter::TADereference), TIter());
  157. test_exceptions(S(), TIter(s, s+10, 6, TIter::TAComparison), TIter());
  158. }
  159. #endif
  160. }