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 10 // <unordered_set> 11 12 // template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, 13 // class Alloc = allocator<Value>> 14 // class unordered_multiset 15 16 // local_iterator begin (size_type n); 17 // local_iterator end (size_type n); 18 // const_local_iterator begin (size_type n) const; 19 // const_local_iterator end (size_type n) const; 20 // const_local_iterator cbegin(size_type n) const; 21 // const_local_iterator cend (size_type n) const; 22 23 #include <unordered_set> 24 #include <cassert> 25 26 #include "min_allocator.h" 27 28 int main() 29 { 30 { 31 typedef std::unordered_multiset<int> C; 32 typedef int P; 33 typedef C::local_iterator I; 34 P a[] = 35 { 36 P(1), 37 P(2), 38 P(3), 39 P(4), 40 P(1), 41 P(2) 42 }; 43 C c(a, a + sizeof(a)/sizeof(a[0])); 44 assert(c.bucket_count() >= 7); 45 C::size_type b = c.bucket(0); 46 I i = c.begin(b); 47 I j = c.end(b); 48 assert(std::distance(i, j) == 0); 49 50 b = c.bucket(1); 51 i = c.begin(b); 52 j = c.end(b); 53 assert(std::distance(i, j) == 2); 54 assert(*i == 1); 55 ++i; 56 assert(*i == 1); 57 58 b = c.bucket(2); 59 i = c.begin(b); 60 j = c.end(b); 61 assert(std::distance(i, j) == 2); 62 assert(*i == 2); 63 ++i; 64 assert(*i == 2); 65 66 b = c.bucket(3); 67 i = c.begin(b); 68 j = c.end(b); 69 assert(std::distance(i, j) == 1); 70 assert(*i == 3); 71 72 b = c.bucket(4); 73 i = c.begin(b); 74 j = c.end(b); 75 assert(std::distance(i, j) == 1); 76 assert(*i == 4); 77 78 b = c.bucket(5); 79 i = c.begin(b); 80 j = c.end(b); 81 assert(std::distance(i, j) == 0); 82 83 b = c.bucket(6); 84 i = c.begin(b); 85 j = c.end(b); 86 assert(std::distance(i, j) == 0); 87 } 88 { 89 typedef std::unordered_multiset<int> C; 90 typedef int P; 91 typedef C::const_local_iterator I; 92 P a[] = 93 { 94 P(1), 95 P(2), 96 P(3), 97 P(4), 98 P(1), 99 P(2) 100 }; 101 const C c(a, a + sizeof(a)/sizeof(a[0])); 102 assert(c.bucket_count() >= 7); 103 C::size_type b = c.bucket(0); 104 I i = c.begin(b); 105 I j = c.end(b); 106 assert(std::distance(i, j) == 0); 107 108 b = c.bucket(1); 109 i = c.begin(b); 110 j = c.end(b); 111 assert(std::distance(i, j) == 2); 112 assert(*i == 1); 113 ++i; 114 assert(*i == 1); 115 116 b = c.bucket(2); 117 i = c.begin(b); 118 j = c.end(b); 119 assert(std::distance(i, j) == 2); 120 assert(*i == 2); 121 ++i; 122 assert(*i == 2); 123 124 b = c.bucket(3); 125 i = c.begin(b); 126 j = c.end(b); 127 assert(std::distance(i, j) == 1); 128 assert(*i == 3); 129 130 b = c.bucket(4); 131 i = c.begin(b); 132 j = c.end(b); 133 assert(std::distance(i, j) == 1); 134 assert(*i == 4); 135 136 b = c.bucket(5); 137 i = c.begin(b); 138 j = c.end(b); 139 assert(std::distance(i, j) == 0); 140 141 b = c.bucket(6); 142 i = c.begin(b); 143 j = c.end(b); 144 assert(std::distance(i, j) == 0); 145 } 146 { 147 typedef std::unordered_multiset<int> C; 148 typedef int P; 149 typedef C::const_local_iterator I; 150 P a[] = 151 { 152 P(1), 153 P(2), 154 P(3), 155 P(4), 156 P(1), 157 P(2) 158 }; 159 C c(a, a + sizeof(a)/sizeof(a[0])); 160 assert(c.bucket_count() >= 7); 161 C::size_type b = c.bucket(0); 162 I i = c.cbegin(b); 163 I j = c.cend(b); 164 assert(std::distance(i, j) == 0); 165 166 b = c.bucket(1); 167 i = c.cbegin(b); 168 j = c.cend(b); 169 assert(std::distance(i, j) == 2); 170 assert(*i == 1); 171 ++i; 172 assert(*i == 1); 173 174 b = c.bucket(2); 175 i = c.cbegin(b); 176 j = c.cend(b); 177 assert(std::distance(i, j) == 2); 178 assert(*i == 2); 179 ++i; 180 assert(*i == 2); 181 182 b = c.bucket(3); 183 i = c.cbegin(b); 184 j = c.cend(b); 185 assert(std::distance(i, j) == 1); 186 assert(*i == 3); 187 188 b = c.bucket(4); 189 i = c.cbegin(b); 190 j = c.cend(b); 191 assert(std::distance(i, j) == 1); 192 assert(*i == 4); 193 194 b = c.bucket(5); 195 i = c.cbegin(b); 196 j = c.cend(b); 197 assert(std::distance(i, j) == 0); 198 199 b = c.bucket(6); 200 i = c.cbegin(b); 201 j = c.cend(b); 202 assert(std::distance(i, j) == 0); 203 } 204 { 205 typedef std::unordered_multiset<int> C; 206 typedef int P; 207 typedef C::const_local_iterator I; 208 P a[] = 209 { 210 P(1), 211 P(2), 212 P(3), 213 P(4), 214 P(1), 215 P(2) 216 }; 217 const C c(a, a + sizeof(a)/sizeof(a[0])); 218 assert(c.bucket_count() >= 7); 219 C::size_type b = c.bucket(0); 220 I i = c.cbegin(b); 221 I j = c.cend(b); 222 assert(std::distance(i, j) == 0); 223 224 b = c.bucket(1); 225 i = c.cbegin(b); 226 j = c.cend(b); 227 assert(std::distance(i, j) == 2); 228 assert(*i == 1); 229 ++i; 230 assert(*i == 1); 231 232 b = c.bucket(2); 233 i = c.cbegin(b); 234 j = c.cend(b); 235 assert(std::distance(i, j) == 2); 236 assert(*i == 2); 237 ++i; 238 assert(*i == 2); 239 240 b = c.bucket(3); 241 i = c.cbegin(b); 242 j = c.cend(b); 243 assert(std::distance(i, j) == 1); 244 assert(*i == 3); 245 246 b = c.bucket(4); 247 i = c.cbegin(b); 248 j = c.cend(b); 249 assert(std::distance(i, j) == 1); 250 assert(*i == 4); 251 252 b = c.bucket(5); 253 i = c.cbegin(b); 254 j = c.cend(b); 255 assert(std::distance(i, j) == 0); 256 257 b = c.bucket(6); 258 i = c.cbegin(b); 259 j = c.cend(b); 260 assert(std::distance(i, j) == 0); 261 } 262 #if __cplusplus >= 201103L 263 { 264 typedef std::unordered_multiset<int, std::hash<int>, 265 std::equal_to<int>, min_allocator<int>> C; 266 typedef int P; 267 typedef C::local_iterator I; 268 P a[] = 269 { 270 P(1), 271 P(2), 272 P(3), 273 P(4), 274 P(1), 275 P(2) 276 }; 277 C c(a, a + sizeof(a)/sizeof(a[0])); 278 assert(c.bucket_count() >= 7); 279 C::size_type b = c.bucket(0); 280 I i = c.begin(b); 281 I j = c.end(b); 282 assert(std::distance(i, j) == 0); 283 284 b = c.bucket(1); 285 i = c.begin(b); 286 j = c.end(b); 287 assert(std::distance(i, j) == 2); 288 assert(*i == 1); 289 ++i; 290 assert(*i == 1); 291 292 b = c.bucket(2); 293 i = c.begin(b); 294 j = c.end(b); 295 assert(std::distance(i, j) == 2); 296 assert(*i == 2); 297 ++i; 298 assert(*i == 2); 299 300 b = c.bucket(3); 301 i = c.begin(b); 302 j = c.end(b); 303 assert(std::distance(i, j) == 1); 304 assert(*i == 3); 305 306 b = c.bucket(4); 307 i = c.begin(b); 308 j = c.end(b); 309 assert(std::distance(i, j) == 1); 310 assert(*i == 4); 311 312 b = c.bucket(5); 313 i = c.begin(b); 314 j = c.end(b); 315 assert(std::distance(i, j) == 0); 316 317 b = c.bucket(6); 318 i = c.begin(b); 319 j = c.end(b); 320 assert(std::distance(i, j) == 0); 321 } 322 { 323 typedef std::unordered_multiset<int, std::hash<int>, 324 std::equal_to<int>, min_allocator<int>> C; 325 typedef int P; 326 typedef C::const_local_iterator I; 327 P a[] = 328 { 329 P(1), 330 P(2), 331 P(3), 332 P(4), 333 P(1), 334 P(2) 335 }; 336 const C c(a, a + sizeof(a)/sizeof(a[0])); 337 assert(c.bucket_count() >= 7); 338 C::size_type b = c.bucket(0); 339 I i = c.begin(b); 340 I j = c.end(b); 341 assert(std::distance(i, j) == 0); 342 343 b = c.bucket(1); 344 i = c.begin(b); 345 j = c.end(b); 346 assert(std::distance(i, j) == 2); 347 assert(*i == 1); 348 ++i; 349 assert(*i == 1); 350 351 b = c.bucket(2); 352 i = c.begin(b); 353 j = c.end(b); 354 assert(std::distance(i, j) == 2); 355 assert(*i == 2); 356 ++i; 357 assert(*i == 2); 358 359 b = c.bucket(3); 360 i = c.begin(b); 361 j = c.end(b); 362 assert(std::distance(i, j) == 1); 363 assert(*i == 3); 364 365 b = c.bucket(4); 366 i = c.begin(b); 367 j = c.end(b); 368 assert(std::distance(i, j) == 1); 369 assert(*i == 4); 370 371 b = c.bucket(5); 372 i = c.begin(b); 373 j = c.end(b); 374 assert(std::distance(i, j) == 0); 375 376 b = c.bucket(6); 377 i = c.begin(b); 378 j = c.end(b); 379 assert(std::distance(i, j) == 0); 380 } 381 { 382 typedef std::unordered_multiset<int, std::hash<int>, 383 std::equal_to<int>, min_allocator<int>> C; 384 typedef int P; 385 typedef C::const_local_iterator I; 386 P a[] = 387 { 388 P(1), 389 P(2), 390 P(3), 391 P(4), 392 P(1), 393 P(2) 394 }; 395 C c(a, a + sizeof(a)/sizeof(a[0])); 396 assert(c.bucket_count() >= 7); 397 C::size_type b = c.bucket(0); 398 I i = c.cbegin(b); 399 I j = c.cend(b); 400 assert(std::distance(i, j) == 0); 401 402 b = c.bucket(1); 403 i = c.cbegin(b); 404 j = c.cend(b); 405 assert(std::distance(i, j) == 2); 406 assert(*i == 1); 407 ++i; 408 assert(*i == 1); 409 410 b = c.bucket(2); 411 i = c.cbegin(b); 412 j = c.cend(b); 413 assert(std::distance(i, j) == 2); 414 assert(*i == 2); 415 ++i; 416 assert(*i == 2); 417 418 b = c.bucket(3); 419 i = c.cbegin(b); 420 j = c.cend(b); 421 assert(std::distance(i, j) == 1); 422 assert(*i == 3); 423 424 b = c.bucket(4); 425 i = c.cbegin(b); 426 j = c.cend(b); 427 assert(std::distance(i, j) == 1); 428 assert(*i == 4); 429 430 b = c.bucket(5); 431 i = c.cbegin(b); 432 j = c.cend(b); 433 assert(std::distance(i, j) == 0); 434 435 b = c.bucket(6); 436 i = c.cbegin(b); 437 j = c.cend(b); 438 assert(std::distance(i, j) == 0); 439 } 440 { 441 typedef std::unordered_multiset<int, std::hash<int>, 442 std::equal_to<int>, min_allocator<int>> C; 443 typedef int P; 444 typedef C::const_local_iterator I; 445 P a[] = 446 { 447 P(1), 448 P(2), 449 P(3), 450 P(4), 451 P(1), 452 P(2) 453 }; 454 const C c(a, a + sizeof(a)/sizeof(a[0])); 455 assert(c.bucket_count() >= 7); 456 C::size_type b = c.bucket(0); 457 I i = c.cbegin(b); 458 I j = c.cend(b); 459 assert(std::distance(i, j) == 0); 460 461 b = c.bucket(1); 462 i = c.cbegin(b); 463 j = c.cend(b); 464 assert(std::distance(i, j) == 2); 465 assert(*i == 1); 466 ++i; 467 assert(*i == 1); 468 469 b = c.bucket(2); 470 i = c.cbegin(b); 471 j = c.cend(b); 472 assert(std::distance(i, j) == 2); 473 assert(*i == 2); 474 ++i; 475 assert(*i == 2); 476 477 b = c.bucket(3); 478 i = c.cbegin(b); 479 j = c.cend(b); 480 assert(std::distance(i, j) == 1); 481 assert(*i == 3); 482 483 b = c.bucket(4); 484 i = c.cbegin(b); 485 j = c.cend(b); 486 assert(std::distance(i, j) == 1); 487 assert(*i == 4); 488 489 b = c.bucket(5); 490 i = c.cbegin(b); 491 j = c.cend(b); 492 assert(std::distance(i, j) == 0); 493 494 b = c.bucket(6); 495 i = c.cbegin(b); 496 j = c.cend(b); 497 assert(std::distance(i, j) == 0); 498 } 499 #endif 500 } 501