Skip to content

MapInsertR

Description

Insert a new (key, value) pair. R-value form: key and value are treated as temporary values and are never zeroed on the caller side.

Parameters

Name Direction Description
m in,out Map handle.
in_key in Key expression.
in_value in Value expression.

Success

Returns true. A new (key, value) entry is stored in the map; length grows by one. Both source expressions are untouched. A rehash may have grown the underlying probe table.

Failure

Returns false on allocation failure or policy violation. The map is unchanged.

Usage example (Cross-references)

Usage examples (Cross-references)
    #define MapMustInsertR(m, in_key, in_value)                                                                            \
        do {                                                                                                               \
            if (!MapInsertR((m), (in_key), (in_value))) {                                                                  \
                LOG_FATAL("MapMustInsertR failed");                                                                        \
            }                                                                                                              \
        }
    
        if (!MapInsertR(&self->live, user_p, rec)) {
            if (self->config.force_page_backing)
                AllocatorFree(&self->page, user_p);
    
        Str key_copy = StrInitFromCstr(StrBegin(name), StrLen(name), alloc);
        MapInsertR(index, key_copy, id);
        return id;
    }
        Float k1 = FloatFromStr("3.14", &alloc.base);
        Float k2 = FloatFromStr("2.71", &alloc.base);
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
        Float k2 = FloatFromStr("2.71", &alloc.base);
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
    
        Float probe   = FloatFromStr("314e-2", &alloc.base); // same value as k1
        BitVecPush(&k2, true);
    
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
    
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
    
        BitVec probe = BitVecInit(base);
        Int k3 = IntFrom(100u, &alloc.base); // duplicate of k1 by value
    
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
    
        MapInsertR(&counts, k1, 1u);
        MapInsertR(&counts, k2, 2u);
    
        Int  probe   = IntFrom(100u, &alloc.base);
    
        MapSetOnlyR(&map, "red", "apple");
        MapInsertR(&map, "red", "cherry");
        MapSetOnlyR(&map, "yellow", "banana");
        MapSetOnlyR(&map, "green", "pear");
        IntIntMap        second = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&first, 1, 10);
        MapInsertR(&first, 1, 11);
        MapInsertR(&first, 2, 20);
    
        MapInsertR(&first, 1, 10);
        MapInsertR(&first, 1, 11);
        MapInsertR(&first, 2, 20);
        MapRemoveFirst(&first, 1);
        MapInsertR(&first, 1, 10);
        MapInsertR(&first, 1, 11);
        MapInsertR(&first, 2, 20);
        MapRemoveFirst(&first, 1);
        MapRemoveFirst(&first, 1);
    
        MapInsertR(&second, 9, 90);
        MapInsertR(&second, 10, 100);
    
        MapInsertR(&second, 9, 90);
        MapInsertR(&second, 10, 100);
    
        bool result = (MapTombstones(&first) == 1);
        bool result = MapEmpty(&map);
    
        MapInsertR(&map, 1, 10);
        result = result && !MapEmpty(&map);
        result = result && !MapEmpty(&map);
    
        MapInsertR(&map, 2, 20);
        result = result && !MapEmpty(&map);
    
        // Refill then clear -> empty.
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 4, 40);
        result = result && !MapEmpty(&map);
        // Refill then clear -> empty.
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 4, 40);
        result = result && !MapEmpty(&map);
        MapClear(&map);
        IntIntMap        map   = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapRemoveFirst(&map, 2);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapRemoveFirst(&map, 2);
        IntIntMap        map   = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
        MapInsertR(&map, 3, 30);
        MapRemoveFirst(&map, 1);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
        MapInsertR(&map, 3, 30);
        MapRemoveFirst(&map, 1);
        int              threshold = 30;
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 4, 40);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 4, 40);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 4, 40);
    
        bool result = (MapRetainIf(&map, retain_values_above_threshold, &threshold) == 2);
        IntIntMap        map   = MapInitWithValueCompare(const_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 0, 500);
        MapInsertR(&map, 1, 510);
        MapInsertR(&map, 2, 520);
    
        MapInsertR(&map, 0, 500);
        MapInsertR(&map, 1, 510);
        MapInsertR(&map, 2, 520);
        MapInsertR(&map, 0, 500);
        MapInsertR(&map, 1, 510);
        MapInsertR(&map, 2, 520);
    
        MapClear(&map);
        MapClear(&map);
    
        MapInsertR(&map, 0, 999);
    
        int *v      = MapGetFirstPtr(&map, 0);
        reserved_capacity = (size)MapCapacity(&map);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapRemoveFirst(&map, 1);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapRemoveFirst(&map, 1);
        MapClear(&map);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapMustReserve(&map, 48);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapMustReserve(&map, 48);
        IntIntMap        map   = MapInitT(map, i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 6, 60);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 6, 60);
    
        bool result = (MapKeyHash(&map) == i32_hash) && (MapKeyCompare(&map) == i32_compare) && (MapPairCount(&map) == 2);
                      (MapValueCopyDeinit(&map) == (GenericCopyDeinit)zstr_deinit);
    
        MapInsertR(&map, "alpha", "first");
        result = result && (MapPairCount(&map) == 1);
        result = result && MapGetFirstPtr(&map, "alpha") && (ZstrCompare(*MapGetFirstPtr(&map, "alpha"), "first") == 0);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapSetOnlyR(&map, 2, 200);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapSetOnlyR(&map, 2, 200);
        MapSetOnlyR(&map, 3, 30);
        IntIntMap        map   = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 1, 12);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 1, 12);
        MapSetFirstR(&map, 1, 100);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 1, 12);
        MapSetFirstR(&map, 1, 100);
        result      = result && (MapPairCount(&map) == 0) && !MapContainsKey(&map, 7);
    
        MapInsertR(&map, 1, 10);
    
        // Miss on a populated map (key absent): returns false, map unchanged.
        IntIntMap        map   = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
        bool result = (MapValueCountForKey(&map, 5) == 3);
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
        bool result = (MapValueCountForKey(&map, 5) == 3);
        int              value = 84;
    
        MapInsertR(&map, key, value);
    
        bool result = (key == 42) && (value == 84);
        int              value = 110;
    
        MapInsertR(&map, 11, 10);
    
        // Update-existing path: first value replaced, value source zeroed.
        // Phase 1: fill past the first few growth thresholds.
        for (int i = 0; i < 600; ++i) {
            MapInsertR(&map, i, i * 10);
        }
        result = result && (MapPairCount(&map) == 600);
            int key = 600 + (i & 0x3f); // small cycling window
            MapRemoveAll(&map, key);
            MapInsertR(&map, key, i);
        }
        // Deterministic count: 600 base keys (0..599) survive untouched, plus
    
        // MapSet aliases MapSetOnlyL: replace + zero both sources.
        MapInsertR(&map, 1, 99); // give key 1 a second value
        result = result && (MapValueCountForKey(&map, 1) == 2);
        int k2 = 1;
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        MapPolicy bad = make_validate_only_reject_policy();
    
        result = result && (MapPairCount(&map) == 0);
        MapInsertR(&map, 5, 50);
        result = result && MapGetFirstPtr(&map, 5) && (*MapGetFirstPtr(&map, 5) == 50);
    
        bool result = MapCompact(&map);
        MapInsertR(&map, 7, 70);
        result = result && MapGetFirstPtr(&map, 7) && (*MapGetFirstPtr(&map, 7) == 70);
    
        bool result = MapCompact(&map);
        MapInsertR(&map, 8, 80);
        MapInsertR(&map, 9, 90);
        result = result && MapGetFirstPtr(&map, 8) && (*MapGetFirstPtr(&map, 8) == 80);
        bool result = MapCompact(&map);
        MapInsertR(&map, 8, 80);
        MapInsertR(&map, 9, 90);
        result = result && MapGetFirstPtr(&map, 8) && (*MapGetFirstPtr(&map, 8) == 80);
        result = result && MapGetFirstPtr(&map, 9) && (*MapGetFirstPtr(&map, 9) == 90);
    
        bool result = MapCompact(&map);
        MapInsertR(&map, 11, 110);
        result = result && MapGetFirstPtr(&map, 11) && (*MapGetFirstPtr(&map, 11) == 110);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        MapPolicy tight  = make_tight_policy();
    
        for (int k = 0; k < 10; k++)
            MapInsertR(&map, k, k * 10);
    
        MapPolicy sab = make_sabotage_policy();
    
        for (int k = 0; k < 6; k++)
            MapInsertR(&map, k, k * 10);
    
        fa.fail_now = true;              // force the new-table allocation to fail
        const int keys[] = {0, 8, 16, 24, 32, 40};
        for (int i = 0; i < 6; i++)
            MapInsertR(&map, keys[i], keys[i] + 1);
    
        bool result = (MapPairCount(&map) == 6);
    
        for (int k = 0; k < 6; k++)
            result = result && MapInsertR(&map, k, k * 100 + 1);
    
        result = result && (MapPairCount(&map) == 6);
    
        for (int k = 0; k < 8; k++)
            result = result && MapInsertR(&map, k, k * 100 + 3);
    
        result = result && MapInsertR(&map, 8, 8 * 100 + 3);
            result = result && MapInsertR(&map, k, k * 100 + 3);
    
        result = result && MapInsertR(&map, 8, 8 * 100 + 3);
    
        result = result && (MapPairCount(&map) == 9);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 7, 70);
        MapRemoveFirst(&map, 7);
        bool result = (MapTombstones(&map) == 1);
        bool result = (MapTombstones(&map) == 1);
    
        MapInsertR(&map, 7, 71); // reuses the tombstone slot for key 7
        result = result && (MapTombstones(&map) == 0);
        result = result && MapGetFirstPtr(&map, 7) && (*MapGetFirstPtr(&map, 7) == 71);
    
        g_value_copy_should_fail = false;
        bool result              = MapInsertR(&map, 5, 50);
        MapRemoveFirst(&map, 5);
        result = result && (MapTombstones(&map) == 1);
    
        g_value_copy_should_fail = true;
        bool reinserted          = MapInsertR(&map, 5, 51);
        g_value_copy_should_fail = false;
        const int keys[] = {0, 16, 32, 48, 64};
        for (int i = 0; i < 5; i++)
            MapInsertR(&map, keys[i], keys[i] + 1);
    
        MapRehashWithPolicy(&map, 8, policy);
        IntIntMap        map    = MapInitWithPolicy(i32_hash, i32_compare, policy, &alloc);
    
        MapInsertR(&map, 1, 10);
        bool result = (MapCapacity(&map) == 42);
    
        for (int k = 0; k < 7; k++)
            MapInsertR(&map, k, k);
    
        bool result = (MapCapacity(&map) == 16);
    
        for (int k = 0; k < 5; k++)
            MapInsertR(&map, k, k);
        MapRemoveAll(&map, 1);
        MapRemoveAll(&map, 3);
        bool result = (MapTombstones(&map) == 2);
    
        MapInsertR(&map, 200, 200); // exactly on the 3/4 boundary -> must rehash
    
        result = result && (MapTombstones(&map) == 0);
    
        for (int k = 0; k < 6; k++)
            MapInsertR(&map, k, k);
    
        bool result = (MapCapacity(&map) == 8);
        IntIntMap        map   = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 7, 70);
        bool result = (MapTombstones(&map) == 0);
    
        for (int k = 0; k < 8; k++)
            MapInsertR(&map, k, k * 100 + 3);
        bool result = (MapCapacity(&map) == 8) && (MapPairCount(&map) == 8);
        bool result = (MapCapacity(&map) == 8) && (MapPairCount(&map) == 8);
    
        MapInsertR(&map, 8, 803); // probe budget exhausted -> recover with n = cap+1 = 9
    
        result = result && (MapCapacity(&map) == 16);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        GenericMap *g           = GENERIC_MAP(&map);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
    
        GenericMap *g   = GENERIC_MAP(&map);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);          // capacity becomes 8
    
        GenericMap *g  = GENERIC_MAP(&map);
        };
        IntIntMap map    = MapInitWithPolicy(i32_hash, i32_compare, policy, &alloc);
        bool      result = MapInsertR(&map, 1, 10);
        result           = result && MapGetFirstPtr(&map, 1) && (*MapGetFirstPtr(&map, 1) == 10);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        bool result = MapInsertR(&map, 7, 70); // first ops clear the validated bit
        result      = result && MapGetFirstPtr(&map, 7) && (*MapGetFirstPtr(&map, 7) == 70);
    
        MapSetOnlyR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapSetOnlyR(&map, 2, 20);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 2, 20);
    
        u64 length_before     = MapPairCount(&map);
        IntIntMap        map   = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
    
        bool result = MapRemovePair(&map, 5, 51);
        IntIntMap        map   = MapInitWithValueCompare(i32_hash, i32_compare, i32_compare, &alloc);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
    
        u64 length_before     = MapPairCount(&map);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 5, 50);
        bool result = (MapTombstones(&map) == 0);
        result = result && !MapContainsKey(&map, 5);
    
        MapInsertR(&map, 5, 51);
        result     = result && (MapTombstones(&map) == 0);
        result     = result && (MapPairCount(&map) == 1);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 31);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 31);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 31);
    
        bool result = (MapRemoveIf(&map, remove_even_values, NULL) == 2);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
        MapInsertR(&map, 9, 90);
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
        MapInsertR(&map, 9, 90);
        MapInsertR(&map, 5, 51);
        MapInsertR(&map, 5, 52);
        MapInsertR(&map, 9, 90);
    
        bool result = (MapRemoveAll(&map, 5) == 3);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 9, 90);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 9, 90);
    
        u64 length_before     = MapPairCount(&map);
        );
    
        MapInsertR(&map, "alpha", "one");
        MapInsertR(&map, "alpha", "two");
        MapInsertR(&map, "beta", "three");
    
        MapInsertR(&map, "alpha", "one");
        MapInsertR(&map, "alpha", "two");
        MapInsertR(&map, "beta", "three");
        MapInsertR(&map, "gamma", "four");
        MapInsertR(&map, "alpha", "one");
        MapInsertR(&map, "alpha", "two");
        MapInsertR(&map, "beta", "three");
        MapInsertR(&map, "gamma", "four");
        MapInsertR(&map, "alpha", "two");
        MapInsertR(&map, "beta", "three");
        MapInsertR(&map, "gamma", "four");
    
        // Live allocations are non-zero here (clones + table storage).
    
        // The chain still accepts new keys, and every live key stays retrievable.
        result  = result && MapInsertR(&map, 5, 55) && MapInsertR(&map, 6, 66);
        result  = result && (MapPairCount(&map) == 4);
        int *v5 = MapGetFirstPtr(&map, 5);
            MapSetOnlyR(&map, i, i * 10);
        }
        MapInsertR(&map, 2, 25);
    
        MapForeachPairPtr(&map, key_ptr, value_ptr) {
        int              key_two_sum    = 0;
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 2, 21);
        MapInsertR(&map, 3, 30);
    
        MapForeachKey(&map, key) {
        for (int i = 1; i <= 4; i++)
            MapSetOnlyR(&map, i, i * 10);
        MapInsertR(&map, 2, 25);
    
        MapForeachPair(&map, key, value) {
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
    
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 1, 10);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
        MapInsertR(&map, 1, 11);
        MapInsertR(&map, 2, 20);
        MapInsertR(&map, 3, 30);
    
        int before_sum = 0;
    
        for (int k = 0; k < 60; k++)
            MapInsertR(&map, k, k * 10 + 1);
    
        MapInsertR(&map, 0, 7777);
            MapInsertR(&map, k, k * 10 + 1);
    
        MapInsertR(&map, 0, 7777);
    
        bool result = (MapValueCountForKey(&map, 0) == 2);
        MapReserve(&map, 6);
        for (int k = 10; k <= 15; k++)
            MapInsertR(&map, k, k);
    
        MapValueCursor cursor = MapFindFirstForKey(&map, 15);
    
        MapSetOnlyR(&map, 7, 70);
        MapInsertR(&map, 7, 71);
        MapSetOnlyR(&map, 9, 90);
    
        MapSetOnlyR(&map, 11, 110);
        MapInsertR(&map, 11, 111);
    
        int *value  = MapGetFirstPtr(&map, 11);
    
        MapSetOnlyR(&map, 11, 110);
        MapInsertR(&map, 11, 111);
    
        int *value  = MapGetFirstPtr(&map, 11);
    
        MapSetOnlyR(&map, 11, 110);
        MapInsertR(&map, 11, 111);
    
        int  found  = MapGetOrDefault(&map, 11, 999);
        int              seen      = 0;
    
        MapInsertR(&map, 4, 40);
        MapInsertR(&map, 4, 41);
        MapInsertR(&map, 4, 42);
    
        MapInsertR(&map, 4, 40);
        MapInsertR(&map, 4, 41);
        MapInsertR(&map, 4, 42);
        MapInsertR(&map, 9, 90);
        MapInsertR(&map, 4, 40);
        MapInsertR(&map, 4, 41);
        MapInsertR(&map, 4, 42);
        MapInsertR(&map, 9, 90);
        MapInsertR(&map, 4, 41);
        MapInsertR(&map, 4, 42);
        MapInsertR(&map, 9, 90);
    
        cursor = MapFindFirstForKey(&map, 4);
        MapValueCursor   cursor = MapValueCursorInvalid();
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
    
        MapInsertR(&map, 5, 50);
        MapInsertR(&map, 5, 51);
    
        cursor = MapFindFirstForKey(&map, 5);
        // Distinct keys, all in one bucket.
        for (int k = 0; k < 8; k++)
            MapInsertR(&map, k, k * 100 + 7);
    
        bool result = (MapPairCount(&map) == 8) && (MapUniqueKeyCount(&map) == 8);
        // Multivalued key inside the colliding chain: count is per-key, not
        // per-bucket.
        MapInsertR(&map, 3, 999);
        result = result && (MapValueCountForKey(&map, 3) == 2);
        result = result && (MapValueCountForKey(&map, 4) == 1);
        // Insert: distinct keys, all colliding into one bucket.
        for (int k = 0; k < KEY_COUNT; k++)
            MapInsertR(&map, k, k * 100 + 7);
    
        bool result = (MapPairCount(&map) == KEY_COUNT) && (MapUniqueKeyCount(&map) == KEY_COUNT);
Last updated on