iterator.pass.cpp 7.6 KB

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