Changeset 544eae5 in mainline


Ignore:
Timestamp:
2018-07-05T21:41:21Z (6 years ago)
Author:
Dzejrou <dzejrou@…>
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)
Message:

cpp: added try_emplace and insert_or_assign to unordered_map

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/cpp/include/impl/unordered_map.hpp

    r49343fe r544eae5  
    422422            pair<iterator, bool> try_emplace(const key_type& key, Args&&... args)
    423423            {
    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                }
    425464            }
    426465
     
    428467            pair<iterator, bool> try_emplace(key_type&& key, Args&&... args)
    429468            {
    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                }
    431502            }
    432503
    433504            template<class... Args>
    434             iterator try_emplace(const_iterator hint, const key_type& key, Args&&... args)
    435             {
    436                 // TODO: implement
     505            iterator try_emplace(const_iterator, const key_type& key, Args&&... args)
     506            {
     507                return try_emplace(key, forward<Args>(args)...).first;
    437508            }
    438509
    439510            template<class... Args>
    440             iterator try_emplace(const_iterator hint, key_type&& key, Args&&... args)
    441             {
    442                 // TODO: implement
     511            iterator try_emplace(const_iterator, key_type&& key, Args&&... args)
     512            {
     513                return try_emplace(move(key), forward<Args>(args)...).first;
    443514            }
    444515
     
    446517            pair<iterator, bool> insert_or_assign(const key_type& key, T&& val)
    447518            {
    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                }
    449553            }
    450554
     
    452556            pair<iterator, bool> insert_or_assign(key_type&& key, T&& val)
    453557            {
    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                }
    455592            }
    456593
    457594            template<class T>
    458             iterator insert_or_assign(const_iterator hint, const key_type& key, T&& val)
    459             {
    460                 // TODO: implement
     595            iterator insert_or_assign(const_iterator, const key_type& key, T&& val)
     596            {
     597                return insert_or_assign(key, forward<T>(val)).first;
    461598            }
    462599
    463600            template<class T>
    464             iterator insert_or_assign(const_iterator hint, key_type&& key, T&& val)
    465             {
    466                 // TODO: implement
     601            iterator insert_or_assign(const_iterator, key_type&& key, T&& val)
     602            {
     603                return insert_or_assign(move(key), forward<T>(val)).first;
    467604            }
    468605
Note: See TracChangeset for help on using the changeset viewer.