Changeset 544eae5 in mainline
- Timestamp:
- 2018-07-05T21:41:21Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c23f16d8
- Parents:
- 49343fe
- git-author:
- Dzejrou <dzejrou@…> (2018-04-25 18:10:33)
- git-committer:
- Dzejrou <dzejrou@…> (2018-07-05 21:41:21)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/cpp/include/impl/unordered_map.hpp
r49343fe r544eae5 422 422 pair<iterator, bool> try_emplace(const key_type& key, Args&&... args) 423 423 { 424 // TODO: implement 424 /** 425 * Note: If anyone (like me) wonders what is the difference between 426 * emplace and try_emplace, the former always constructs the value 427 * (in order to get the key) and the latter does it only if 428 * an insertion takes place. 429 */ 430 431 table_.increment_size(); 432 433 auto spot = table_.find_insertion_spot(key); 434 auto bucket = get<0>(spot); 435 auto idx = get<2>(spot); 436 437 if (!bucket) 438 return make_pair(end(), false); 439 440 auto target = table_.find_node_or_return_head(key, *bucket); 441 if (target && table_.keys_equal(key, target->value)) 442 { 443 table_.decrement_size(); 444 445 return make_pair( 446 iterator{ 447 table_.table(), idx, table_.bucket_count(), 448 target 449 }, 450 false 451 ); 452 } 453 else 454 { 455 auto node = new node_type{key, forward<Args>(args)...}; 456 bucket->append(node); 457 458 return make_pair(iterator{ 459 table_.table(), idx, 460 table_.bucket_count(), 461 node 462 }, true); 463 } 425 464 } 426 465 … … 428 467 pair<iterator, bool> try_emplace(key_type&& key, Args&&... args) 429 468 { 430 // TODO: implement 469 table_.increment_size(); 470 471 auto spot = table_.find_insertion_spot(key); 472 auto bucket = get<0>(spot); 473 auto idx = get<2>(spot); 474 475 if (!bucket) 476 return make_pair(end(), false); 477 478 auto target = table_.find_node_or_return_head(key, *bucket); 479 if (target && table_.keys_equal(key, target->value)) 480 { 481 table_.decrement_size(); 482 483 return make_pair( 484 iterator{ 485 table_.table(), idx, table_.bucket_count(), 486 target 487 }, 488 false 489 ); 490 } 491 else 492 { 493 auto node = new node_type{move(key), forward<Args>(args)...}; 494 bucket->append(node); 495 496 return make_pair(iterator{ 497 table_.table(), idx, 498 table_.bucket_count(), 499 node 500 }, true); 501 } 431 502 } 432 503 433 504 template<class... Args> 434 iterator try_emplace(const_iterator hint, const key_type& key, Args&&... args)435 { 436 // TODO: implement505 iterator try_emplace(const_iterator, const key_type& key, Args&&... args) 506 { 507 return try_emplace(key, forward<Args>(args)...).first; 437 508 } 438 509 439 510 template<class... Args> 440 iterator try_emplace(const_iterator hint, key_type&& key, Args&&... args)441 { 442 // TODO: implement511 iterator try_emplace(const_iterator, key_type&& key, Args&&... args) 512 { 513 return try_emplace(move(key), forward<Args>(args)...).first; 443 514 } 444 515 … … 446 517 pair<iterator, bool> insert_or_assign(const key_type& key, T&& val) 447 518 { 448 // TODO: implement 519 table_.increment_size(); 520 521 auto spot = table_.find_insertion_spot(key); 522 auto bucket = get<0>(spot); 523 auto idx = get<2>(spot); 524 525 if (!bucket) 526 return make_pair(end(), false); 527 528 auto target = table_.find_node_or_return_head(key, *bucket); 529 if (target && table_.keys_equal(key, target->value)) 530 { 531 table_.decrement_size(); 532 target->value.second = forward<T>(val); 533 534 return make_pair( 535 iterator{ 536 table_.table(), idx, table_.bucket_count(), 537 target 538 }, 539 false 540 ); 541 } 542 else 543 { 544 auto node = new node_type{key, forward<T>(val)}; 545 bucket->append(node); 546 547 return make_pair(iterator{ 548 table_.table(), idx, 549 table_.bucket_count(), 550 node 551 }, true); 552 } 449 553 } 450 554 … … 452 556 pair<iterator, bool> insert_or_assign(key_type&& key, T&& val) 453 557 { 454 // TODO: implement 558 table_.increment_size(); 559 560 auto spot = table_.find_insertion_spot(key); 561 auto bucket = get<0>(spot); 562 auto idx = get<2>(spot); 563 564 if (!bucket) 565 return make_pair(end(), false); 566 567 auto target = table_.find_node_or_return_head(key, *bucket); 568 if (target && table_.keys_equal(key, target->value)) 569 { 570 table_.decrement_size(); 571 target->value.second = forward<T>(val); 572 573 return make_pair( 574 iterator{ 575 table_.table(), idx, table_.bucket_count(), 576 target 577 }, 578 false 579 ); 580 } 581 else 582 { 583 auto node = new node_type{move(key), forward<T>(val)}; 584 bucket->append(node); 585 586 return make_pair(iterator{ 587 table_.table(), idx, 588 table_.bucket_count(), 589 node 590 }, true); 591 } 455 592 } 456 593 457 594 template<class T> 458 iterator insert_or_assign(const_iterator hint, const key_type& key, T&& val)459 { 460 // TODO: implement595 iterator insert_or_assign(const_iterator, const key_type& key, T&& val) 596 { 597 return insert_or_assign(key, forward<T>(val)).first; 461 598 } 462 599 463 600 template<class T> 464 iterator insert_or_assign(const_iterator hint, key_type&& key, T&& val)465 { 466 // TODO: implement601 iterator insert_or_assign(const_iterator, key_type&& key, T&& val) 602 { 603 return insert_or_assign(move(key), forward<T>(val)).first; 467 604 } 468 605
Note:
See TracChangeset
for help on using the changeset viewer.