equal_range.pass.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // <multimap>
  9. // class multimap
  10. // pair<iterator, iterator> equal_range(const key_type& k);
  11. // pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
  12. #include <map>
  13. #include <cassert>
  14. #include "test_macros.h"
  15. #include "min_allocator.h"
  16. #include "private_constructor.h"
  17. #include "is_transparent.h"
  18. int main(int, char**)
  19. {
  20. typedef std::pair<const int, double> V;
  21. {
  22. typedef std::multimap<int, double> M;
  23. {
  24. typedef std::pair<M::iterator, M::iterator> R;
  25. V ar[] =
  26. {
  27. V(5, 1),
  28. V(5, 2),
  29. V(5, 3),
  30. V(7, 1),
  31. V(7, 2),
  32. V(7, 3),
  33. V(9, 1),
  34. V(9, 2),
  35. V(9, 3)
  36. };
  37. M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  38. R r = m.equal_range(4);
  39. assert(r.first == m.begin());
  40. assert(r.second == m.begin());
  41. r = m.equal_range(5);
  42. assert(r.first == m.begin());
  43. assert(r.second == next(m.begin(), 3));
  44. r = m.equal_range(6);
  45. assert(r.first == next(m.begin(), 3));
  46. assert(r.second == next(m.begin(), 3));
  47. r = m.equal_range(7);
  48. assert(r.first == next(m.begin(), 3));
  49. assert(r.second == next(m.begin(), 6));
  50. r = m.equal_range(8);
  51. assert(r.first == next(m.begin(), 6));
  52. assert(r.second == next(m.begin(), 6));
  53. r = m.equal_range(9);
  54. assert(r.first == next(m.begin(), 6));
  55. assert(r.second == next(m.begin(), 9));
  56. r = m.equal_range(10);
  57. assert(r.first == m.end());
  58. assert(r.second == m.end());
  59. }
  60. {
  61. typedef std::pair<M::const_iterator, M::const_iterator> R;
  62. V ar[] =
  63. {
  64. V(5, 1),
  65. V(5, 2),
  66. V(5, 3),
  67. V(7, 1),
  68. V(7, 2),
  69. V(7, 3),
  70. V(9, 1),
  71. V(9, 2),
  72. V(9, 3)
  73. };
  74. const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  75. R r = m.equal_range(4);
  76. assert(r.first == m.begin());
  77. assert(r.second == m.begin());
  78. r = m.equal_range(5);
  79. assert(r.first == m.begin());
  80. assert(r.second == next(m.begin(), 3));
  81. r = m.equal_range(6);
  82. assert(r.first == next(m.begin(), 3));
  83. assert(r.second == next(m.begin(), 3));
  84. r = m.equal_range(7);
  85. assert(r.first == next(m.begin(), 3));
  86. assert(r.second == next(m.begin(), 6));
  87. r = m.equal_range(8);
  88. assert(r.first == next(m.begin(), 6));
  89. assert(r.second == next(m.begin(), 6));
  90. r = m.equal_range(9);
  91. assert(r.first == next(m.begin(), 6));
  92. assert(r.second == next(m.begin(), 9));
  93. r = m.equal_range(10);
  94. assert(r.first == m.end());
  95. assert(r.second == m.end());
  96. }
  97. }
  98. #if TEST_STD_VER >= 11
  99. {
  100. typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
  101. {
  102. typedef std::pair<M::iterator, M::iterator> R;
  103. V ar[] =
  104. {
  105. V(5, 1),
  106. V(5, 2),
  107. V(5, 3),
  108. V(7, 1),
  109. V(7, 2),
  110. V(7, 3),
  111. V(9, 1),
  112. V(9, 2),
  113. V(9, 3)
  114. };
  115. M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  116. R r = m.equal_range(4);
  117. assert(r.first == m.begin());
  118. assert(r.second == m.begin());
  119. r = m.equal_range(5);
  120. assert(r.first == m.begin());
  121. assert(r.second == next(m.begin(), 3));
  122. r = m.equal_range(6);
  123. assert(r.first == next(m.begin(), 3));
  124. assert(r.second == next(m.begin(), 3));
  125. r = m.equal_range(7);
  126. assert(r.first == next(m.begin(), 3));
  127. assert(r.second == next(m.begin(), 6));
  128. r = m.equal_range(8);
  129. assert(r.first == next(m.begin(), 6));
  130. assert(r.second == next(m.begin(), 6));
  131. r = m.equal_range(9);
  132. assert(r.first == next(m.begin(), 6));
  133. assert(r.second == next(m.begin(), 9));
  134. r = m.equal_range(10);
  135. assert(r.first == m.end());
  136. assert(r.second == m.end());
  137. }
  138. {
  139. typedef std::pair<M::const_iterator, M::const_iterator> R;
  140. V ar[] =
  141. {
  142. V(5, 1),
  143. V(5, 2),
  144. V(5, 3),
  145. V(7, 1),
  146. V(7, 2),
  147. V(7, 3),
  148. V(9, 1),
  149. V(9, 2),
  150. V(9, 3)
  151. };
  152. const M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  153. R r = m.equal_range(4);
  154. assert(r.first == m.begin());
  155. assert(r.second == m.begin());
  156. r = m.equal_range(5);
  157. assert(r.first == m.begin());
  158. assert(r.second == next(m.begin(), 3));
  159. r = m.equal_range(6);
  160. assert(r.first == next(m.begin(), 3));
  161. assert(r.second == next(m.begin(), 3));
  162. r = m.equal_range(7);
  163. assert(r.first == next(m.begin(), 3));
  164. assert(r.second == next(m.begin(), 6));
  165. r = m.equal_range(8);
  166. assert(r.first == next(m.begin(), 6));
  167. assert(r.second == next(m.begin(), 6));
  168. r = m.equal_range(9);
  169. assert(r.first == next(m.begin(), 6));
  170. assert(r.second == next(m.begin(), 9));
  171. r = m.equal_range(10);
  172. assert(r.first == m.end());
  173. assert(r.second == m.end());
  174. }
  175. }
  176. #endif
  177. #if TEST_STD_VER > 11
  178. {
  179. typedef std::multimap<int, double, std::less<>> M;
  180. typedef std::pair<M::iterator, M::iterator> R;
  181. V ar[] =
  182. {
  183. V(5, 1),
  184. V(5, 2),
  185. V(5, 3),
  186. V(7, 1),
  187. V(7, 2),
  188. V(7, 3),
  189. V(9, 1),
  190. V(9, 2),
  191. V(9, 3)
  192. };
  193. M m(ar, ar+sizeof(ar)/sizeof(ar[0]));
  194. R r = m.equal_range(4);
  195. assert(r.first == m.begin());
  196. assert(r.second == m.begin());
  197. r = m.equal_range(5);
  198. assert(r.first == m.begin());
  199. assert(r.second == next(m.begin(), 3));
  200. r = m.equal_range(6);
  201. assert(r.first == next(m.begin(), 3));
  202. assert(r.second == next(m.begin(), 3));
  203. r = m.equal_range(7);
  204. assert(r.first == next(m.begin(), 3));
  205. assert(r.second == next(m.begin(), 6));
  206. r = m.equal_range(8);
  207. assert(r.first == next(m.begin(), 6));
  208. assert(r.second == next(m.begin(), 6));
  209. r = m.equal_range(9);
  210. assert(r.first == next(m.begin(), 6));
  211. assert(r.second == next(m.begin(), 9));
  212. r = m.equal_range(10);
  213. assert(r.first == m.end());
  214. assert(r.second == m.end());
  215. r = m.equal_range(C2Int(4));
  216. assert(r.first == m.begin());
  217. assert(r.second == m.begin());
  218. r = m.equal_range(C2Int(5));
  219. assert(r.first == m.begin());
  220. assert(r.second == next(m.begin(), 3));
  221. r = m.equal_range(C2Int(6));
  222. assert(r.first == next(m.begin(), 3));
  223. assert(r.second == next(m.begin(), 3));
  224. r = m.equal_range(C2Int(7));
  225. assert(r.first == next(m.begin(), 3));
  226. assert(r.second == next(m.begin(), 6));
  227. r = m.equal_range(C2Int(8));
  228. assert(r.first == next(m.begin(), 6));
  229. assert(r.second == next(m.begin(), 6));
  230. r = m.equal_range(C2Int(9));
  231. assert(r.first == next(m.begin(), 6));
  232. assert(r.second == next(m.begin(), 9));
  233. r = m.equal_range(C2Int(10));
  234. assert(r.first == m.end());
  235. assert(r.second == m.end());
  236. }
  237. {
  238. typedef PrivateConstructor PC;
  239. typedef std::multimap<PC, double, std::less<>> M;
  240. typedef std::pair<M::iterator, M::iterator> R;
  241. M m;
  242. m.insert ( std::make_pair<PC, double> ( PC::make(5), 1 ));
  243. m.insert ( std::make_pair<PC, double> ( PC::make(5), 2 ));
  244. m.insert ( std::make_pair<PC, double> ( PC::make(5), 3 ));
  245. m.insert ( std::make_pair<PC, double> ( PC::make(7), 1 ));
  246. m.insert ( std::make_pair<PC, double> ( PC::make(7), 2 ));
  247. m.insert ( std::make_pair<PC, double> ( PC::make(7), 3 ));
  248. m.insert ( std::make_pair<PC, double> ( PC::make(9), 1 ));
  249. m.insert ( std::make_pair<PC, double> ( PC::make(9), 2 ));
  250. m.insert ( std::make_pair<PC, double> ( PC::make(9), 3 ));
  251. // assert(m.size() == 9);
  252. R r = m.equal_range(4);
  253. assert(r.first == m.begin());
  254. assert(r.second == m.begin());
  255. r = m.equal_range(5);
  256. assert(r.first == m.begin());
  257. assert(r.second == next(m.begin(), 3));
  258. r = m.equal_range(6);
  259. assert(r.first == next(m.begin(), 3));
  260. assert(r.second == next(m.begin(), 3));
  261. r = m.equal_range(7);
  262. assert(r.first == next(m.begin(), 3));
  263. assert(r.second == next(m.begin(), 6));
  264. r = m.equal_range(8);
  265. assert(r.first == next(m.begin(), 6));
  266. assert(r.second == next(m.begin(), 6));
  267. r = m.equal_range(9);
  268. assert(r.first == next(m.begin(), 6));
  269. assert(r.second == next(m.begin(), 9));
  270. r = m.equal_range(10);
  271. assert(r.first == m.end());
  272. assert(r.second == m.end());
  273. }
  274. #endif
  275. return 0;
  276. }