iterator.pass.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. // <map>
  10. // class multimap
  11. // iterator begin();
  12. // const_iterator begin() const;
  13. // iterator end();
  14. // const_iterator end() const;
  15. //
  16. // reverse_iterator rbegin();
  17. // const_reverse_iterator rbegin() const;
  18. // reverse_iterator rend();
  19. // const_reverse_iterator rend() const;
  20. //
  21. // const_iterator cbegin() const;
  22. // const_iterator cend() const;
  23. // const_reverse_iterator crbegin() const;
  24. // const_reverse_iterator crend() const;
  25. #include <map>
  26. #include <cassert>
  27. #include "min_allocator.h"
  28. int main()
  29. {
  30. {
  31. typedef std::pair<const int, double> V;
  32. V ar[] =
  33. {
  34. V(1, 1),
  35. V(1, 1.5),
  36. V(1, 2),
  37. V(2, 1),
  38. V(2, 1.5),
  39. V(2, 2),
  40. V(3, 1),
  41. V(3, 1.5),
  42. V(3, 2),
  43. V(4, 1),
  44. V(4, 1.5),
  45. V(4, 2),
  46. V(5, 1),
  47. V(5, 1.5),
  48. V(5, 2),
  49. V(6, 1),
  50. V(6, 1.5),
  51. V(6, 2),
  52. V(7, 1),
  53. V(7, 1.5),
  54. V(7, 2),
  55. V(8, 1),
  56. V(8, 1.5),
  57. V(8, 2)
  58. };
  59. std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  60. assert(std::distance(m.begin(), m.end()) == m.size());
  61. assert(std::distance(m.rbegin(), m.rend()) == m.size());
  62. std::multimap<int, double>::iterator i;
  63. i = m.begin();
  64. std::multimap<int, double>::const_iterator k = i;
  65. assert(i == k);
  66. for (int j = 1; j <= 8; ++j)
  67. for (double d = 1; d <= 2; d += .5, ++i)
  68. {
  69. assert(i->first == j);
  70. assert(i->second == d);
  71. i->second = 2.5;
  72. assert(i->second == 2.5);
  73. }
  74. }
  75. {
  76. typedef std::pair<const int, double> V;
  77. V ar[] =
  78. {
  79. V(1, 1),
  80. V(1, 1.5),
  81. V(1, 2),
  82. V(2, 1),
  83. V(2, 1.5),
  84. V(2, 2),
  85. V(3, 1),
  86. V(3, 1.5),
  87. V(3, 2),
  88. V(4, 1),
  89. V(4, 1.5),
  90. V(4, 2),
  91. V(5, 1),
  92. V(5, 1.5),
  93. V(5, 2),
  94. V(6, 1),
  95. V(6, 1.5),
  96. V(6, 2),
  97. V(7, 1),
  98. V(7, 1.5),
  99. V(7, 2),
  100. V(8, 1),
  101. V(8, 1.5),
  102. V(8, 2)
  103. };
  104. const std::multimap<int, double> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  105. assert(std::distance(m.begin(), m.end()) == m.size());
  106. assert(std::distance(m.cbegin(), m.cend()) == m.size());
  107. assert(std::distance(m.rbegin(), m.rend()) == m.size());
  108. assert(std::distance(m.crbegin(), m.crend()) == m.size());
  109. std::multimap<int, double>::const_iterator i;
  110. i = m.begin();
  111. for (int j = 1; j <= 8; ++j)
  112. for (double d = 1; d <= 2; d += .5, ++i)
  113. {
  114. assert(i->first == j);
  115. assert(i->second == d);
  116. }
  117. }
  118. #if TEST_STD_VER >= 11
  119. {
  120. typedef std::pair<const int, double> V;
  121. V ar[] =
  122. {
  123. V(1, 1),
  124. V(1, 1.5),
  125. V(1, 2),
  126. V(2, 1),
  127. V(2, 1.5),
  128. V(2, 2),
  129. V(3, 1),
  130. V(3, 1.5),
  131. V(3, 2),
  132. V(4, 1),
  133. V(4, 1.5),
  134. V(4, 2),
  135. V(5, 1),
  136. V(5, 1.5),
  137. V(5, 2),
  138. V(6, 1),
  139. V(6, 1.5),
  140. V(6, 2),
  141. V(7, 1),
  142. V(7, 1.5),
  143. V(7, 2),
  144. V(8, 1),
  145. V(8, 1.5),
  146. V(8, 2)
  147. };
  148. std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  149. assert(std::distance(m.begin(), m.end()) == m.size());
  150. assert(std::distance(m.rbegin(), m.rend()) == m.size());
  151. std::multimap<int, double, std::less<int>, min_allocator<V>>::iterator i;
  152. i = m.begin();
  153. std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator k = i;
  154. assert(i == k);
  155. for (int j = 1; j <= 8; ++j)
  156. for (double d = 1; d <= 2; d += .5, ++i)
  157. {
  158. assert(i->first == j);
  159. assert(i->second == d);
  160. i->second = 2.5;
  161. assert(i->second == 2.5);
  162. }
  163. }
  164. {
  165. typedef std::pair<const int, double> V;
  166. V ar[] =
  167. {
  168. V(1, 1),
  169. V(1, 1.5),
  170. V(1, 2),
  171. V(2, 1),
  172. V(2, 1.5),
  173. V(2, 2),
  174. V(3, 1),
  175. V(3, 1.5),
  176. V(3, 2),
  177. V(4, 1),
  178. V(4, 1.5),
  179. V(4, 2),
  180. V(5, 1),
  181. V(5, 1.5),
  182. V(5, 2),
  183. V(6, 1),
  184. V(6, 1.5),
  185. V(6, 2),
  186. V(7, 1),
  187. V(7, 1.5),
  188. V(7, 2),
  189. V(8, 1),
  190. V(8, 1.5),
  191. V(8, 2)
  192. };
  193. const std::multimap<int, double, std::less<int>, min_allocator<V>> m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  194. assert(std::distance(m.begin(), m.end()) == m.size());
  195. assert(std::distance(m.cbegin(), m.cend()) == m.size());
  196. assert(std::distance(m.rbegin(), m.rend()) == m.size());
  197. assert(std::distance(m.crbegin(), m.crend()) == m.size());
  198. std::multimap<int, double, std::less<int>, min_allocator<V>>::const_iterator i;
  199. i = m.begin();
  200. for (int j = 1; j <= 8; ++j)
  201. for (double d = 1; d <= 2; d += .5, ++i)
  202. {
  203. assert(i->first == j);
  204. assert(i->second == d);
  205. }
  206. }
  207. #endif
  208. #if _LIBCPP_STD_VER > 11
  209. { // N3644 testing
  210. typedef std::multimap<int, double> C;
  211. C::iterator ii1{}, ii2{};
  212. C::iterator ii4 = ii1;
  213. C::const_iterator cii{};
  214. assert ( ii1 == ii2 );
  215. assert ( ii1 == ii4 );
  216. assert (!(ii1 != ii2 ));
  217. assert ( (ii1 == cii ));
  218. assert ( (cii == ii1 ));
  219. assert (!(ii1 != cii ));
  220. assert (!(cii != ii1 ));
  221. }
  222. #endif
  223. }