Skip to content

MapPairCount

Description

Number of stored key/value pairs in the multimap.

Parameters

Name Direction Description
m in Map.

Usage example (Cross-references)

Usage examples (Cross-references)
    /// TAGS: Map, Empty, Query, Ops
    ///
    #define MapEmpty(m) (MapPairCount(m) == 0)
    
    ///
        // bytes_in_use is non-zero; conversely zero live entries means
        // every byte has been returned.
        if (MapPairCount(&self->live) == 0 && self->bytes_in_use != 0) {
            LOG_FATAL("DebugAllocator: bytes_in_use {} with no live records", (u64)self->bytes_in_use);
        }
    
        // Report leaks for anything still in `live`.
        if (MapAllocator(&self->live) && MapPairCount(&self->live) > 0) {
            LOG_ERROR("DebugAllocator: {} live allocation(s) at deinit time:", (u64)MapPairCount(&self->live));
            MapForeachPairPtr(&self->live, key_ptr, val_ptr) {
        // Report leaks for anything still in `live`.
        if (MapAllocator(&self->live) && MapPairCount(&self->live) > 0) {
            LOG_ERROR("DebugAllocator: {} live allocation(s) at deinit time:", (u64)MapPairCount(&self->live));
            MapForeachPairPtr(&self->live, key_ptr, val_ptr) {
                LOG_ERROR("  leaked {x} ({} bytes)", (u64)*key_ptr, (u64)val_ptr->requested_size);
        if (!self)
            return 0;
        return (size)MapPairCount(&self->live);
    }
        if (!self || !out)
            return;
        if (MapPairCount(&self->live) == 0)
            return;
            return;
    
        StrAppendFmt(out, "DebugAllocator: {} live allocation(s):\n", (u64)MapPairCount(&self->live));
        MapForeachPairPtr(&self->live, key_ptr, val_ptr) {
            StrAppendFmt(out, "  leak: {x} ({} bytes)\n", (u64)*key_ptr, (u64)val_ptr->requested_size);
        bool result = (got != NULL && *got == 1u);
        result      = result && (gone == NULL);
        result      = result && (MapPairCount(&counts) == 2);
    
        FloatDeinit(&k1);
        bool result = (got != NULL && *got == 1u);
        result      = result && (gone == NULL);
        result      = result && (MapPairCount(&counts) == 2);
    
        BitVecDeinit(&k1);
        bool result = (got != NULL && *got == 1u);
        result      = result && (gone == NULL);
        result      = result && (MapPairCount(&counts) == 2);
    
        IntDeinit(&k1);
        MapSetOnlyR(&map, "yellow", "banana");
        MapSetOnlyR(&map, "green", "pear");
        MapRehashWithPolicy(&map, MapPairCount(&map), MapPolicyQuadratic);
    
        bool result = (MapPolicy(&map).first_index == MapPolicyQuadratic.first_index) &&
        result = result && MapContainsPair(&first, 1, 11);
        result = result && MapContainsPair(&first, 2, 20);
        result = result && (MapPairCount(&first) == 2);
        result = result && (MapUniqueKeyCount(&first) == 2);
        result = result && MapContainsPair(&first, 9, 90);
        result = result && MapContainsPair(&first, 10, 100);
        result = result && (MapPairCount(&first) == 2);
        result = result && MapContainsPair(&second, 1, 11);
        result = result && MapContainsPair(&second, 2, 20);
        result = result && MapContainsPair(&second, 1, 11);
        result = result && MapContainsPair(&second, 2, 20);
        result = result && (MapPairCount(&second) == 2);
    
        MapDeinit(&first);
        MapRemoveFirst(&map, 2);
        result = result && MapEmpty(&map);
        result = result && (MapPairCount(&map) == 0);
    
        // Refill then clear -> empty.
        MapClear(&map);
        result = result && MapEmpty(&map);
        result = result && (MapPairCount(&map) == 0);
    
        MapDeinit(&map);
        result = result && MapContainsPair(&map, 3, 30);
        result = result && !MapContainsKey(&map, 2);
        result = result && (MapPairCount(&map) == 2);
        result = result && (MapUniqueKeyCount(&map) == 2);
        bool result = (MapTombstones(&map) == 1);
    
        MapMustRehashWithPolicy(&map, MapPairCount(&map), MapPolicyQuadratic);
    
        // Policy is now quadratic (copied in by value).
        result = result && MapContainsPair(&map, 3, 30);
        result = result && (MapValueCountForKey(&map, 2) == 2);
        result = result && (MapPairCount(&map) == 3);
        result = result && (MapUniqueKeyCount(&map) == 2);
        result      = result && MapContainsKey(&map, 3);
        result      = result && MapContainsKey(&map, 4);
        result      = result && (MapPairCount(&map) == 2);
    
        MapDeinit(&map);
    
        bool result = (reserved_capacity >= 32) && (MapCapacity(&map) == reserved_capacity) && (MapTombstones(&map) == 0) &&
                      (MapPairCount(&map) == 0) && MapEmpty(&map) && !MapContainsKey(&map, 1) && !MapContainsKey(&map, 2);
    
        MapSetOnlyR(&map, 7, 70);
    
        MapSetOnlyR(&map, 7, 70);
        result = result && (MapPairCount(&map) == 1) && (MapValueCountForKey(&map, 7) == 1);
        result = result && MapGetFirstPtr(&map, 7) && (*MapGetFirstPtr(&map, 7) == 70);
        }
    
        MapRehashWithPolicy(&map, MapPairCount(&map), MapPolicyQuadratic);
    
        bool result = (MapPolicy(&map).first_index == MapPolicyQuadratic.first_index) &&
                      (MapPolicy(&map).first_index == MapPolicyLinear.first_index) &&
                      (MapPolicy(&map).next_index == MapPolicyLinear.next_index) &&
                      (MapPolicy(&map).max_probe_count == MapPolicyLinear.max_probe_count) && (MapPairCount(&map) == 0) &&
                      (MapCapacity(&map) == 0) && (MapTombstones(&map) == 0) && MapEmpty(&map);
        result = MapReserve(&map, 64);
        result = result && (MapCapacity(&map) >= 64);
        result = result && (MapPairCount(&map) == 8);
    
        for (i = 0; i < 8; i++) {
        MapMustReserve(&map, 48);
    
        bool result = (MapCapacity(&map) >= 48) && (MapPairCount(&map) == 2);
        result      = result && MapGetFirstPtr(&map, 1) && (*MapGetFirstPtr(&map, 1) == 10);
        result      = result && MapGetFirstPtr(&map, 2) && (*MapGetFirstPtr(&map, 2) == 20);
        MapInsertR(&map, 6, 60);
    
        bool result = (MapKeyHash(&map) == i32_hash) && (MapKeyCompare(&map) == i32_compare) && (MapPairCount(&map) == 2);
        result      = result && MapGetFirstPtr(&map, 5) && (*MapGetFirstPtr(&map, 5) == 50);
        result      = result && MapGetFirstPtr(&map, 6) && (*MapGetFirstPtr(&map, 6) == 60);
    
        MapInsertR(&map, "alpha", "first");
        result = result && (MapPairCount(&map) == 1);
        result = result && MapGetFirstPtr(&map, "alpha") && (ZstrCompare(*MapGetFirstPtr(&map, "alpha"), "first") == 0);
            MapMustInsertR(&map, i, i * 7 + 1);
    
        bool result = (MapPairCount(&map) == N);
        for (int i = 0; i < N; i++) {
            int *value = MapGetFirstPtr(&map, i);
        MapSetOnlyR(&map, 3, 30);
    
        bool result = MapPairCount(&map) == 4;
        result      = result && (MapValueCountForKey(&map, 1) == 2);
        result      = result && (MapValueCountForKey(&map, 2) == 1);
        MapSetFirstR(&map, 1, 100);
    
        bool result = (MapPairCount(&map) == 3);
        result      = result && (MapValueCountForKey(&map, 1) == 3);
        result      = result && MapGetFirstPtr(&map, 1) && (*MapGetFirstPtr(&map, 1) == 100);
        // Miss on an empty (capacity 0) map: returns false, nothing inserted.
        bool result = !MapSetFirstR(&map, 7, 70);
        result      = result && (MapPairCount(&map) == 0) && !MapContainsKey(&map, 7);
    
        MapInsertR(&map, 1, 10);
        result = result && !MapContainsKey(&map, 7);
        result = result && (MapValueCountForKey(&map, 7) == 0);
        result = result && (MapPairCount(&map) == 1);
        // Pre-existing entry is untouched.
        result = result && MapGetFirstPtr(&map, 1) && (*MapGetFirstPtr(&map, 1) == 10);
        result = result && !MapContainsPair(&map, 5, 51);
        result = result && !MapContainsPair(&map, 5, 52);
        result = result && (MapPairCount(&map) == 1);
    
        MapDeinit(&map);
        result   = result && (miss == 220);
        result   = result && !MapContainsKey(&map, 99);
        result   = result && (MapPairCount(&map) == 1);
    
        MapDeinit(&map);
            MapInsertR(&map, i, i * 10);
        }
        result = result && (MapPairCount(&map) == 600);
    
        // Phase 2: alternating remove+insert at the same churn point. Each
        // Deterministic count: 600 base keys (0..599) survive untouched, plus
        // the 64 churned keys (600..663) each ending with exactly one value.
        result = result && (MapPairCount(&map) == 664);
    
        MapDeinit(&map);
        value_ptr = MapEnsurePtr(&map, 8, 80);
        result    = value_ptr && (*value_ptr == 80);
        result    = result && (MapPairCount(&map) == 1);
        result    = result && (MapValueCountForKey(&map, 8) == 1);
        value_ptr = MapEnsurePtr(&map, 8, 800);
        result    = result && value_ptr && (*value_ptr == 80);
        result    = result && (MapPairCount(&map) == 1);
        result    = result && (MapValueCountForKey(&map, 8) == 1);
        // Mutation must not have spawned a second entry.
        result = result && (MapValueCountForKey(&map, 3) == 1);
        result = result && (MapPairCount(&map) == 1);
    
        MapDeinit(&map);
        bool result = MapCompact(&map); // empty map: must succeed via fast path
    
        result = result && (MapPairCount(&map) == 0);
        MapInsertR(&map, 5, 50);
        result = result && MapGetFirstPtr(&map, 5) && (*MapGetFirstPtr(&map, 5) == 50);
        bool      result = MapRehashWithPolicy(&map, 0, tight);
    
        result = result && (MapPairCount(&map) == 3);
        result = result && MapGetFirstPtr(&map, 1) && (*MapGetFirstPtr(&map, 1) == 10);
        result = result && MapGetFirstPtr(&map, 2) && (*MapGetFirstPtr(&map, 2) == 20);
        fa.fail_now = false;
    
        bool result = failed && (MapPairCount(&map) == 6);
        for (int k = 0; k < 6; k++)
            result = result && MapGetFirstPtr(&map, k) && (*MapGetFirstPtr(&map, k) == k * 10);
            MapInsertR(&map, keys[i], keys[i] + 1);
    
        bool result = (MapPairCount(&map) == 6);
    
        result = result && MapCompact(&map);
        result = result && (MapCapacity(&map) == 16);
    
        result = result && (MapPairCount(&map) == 6);
        for (int i = 0; i < 6; i++)
            result = result && MapGetFirstPtr(&map, keys[i]) && (*MapGetFirstPtr(&map, keys[i]) == keys[i] + 1);
            result = result && MapInsertR(&map, k, k * 100 + 1);
    
        result = result && (MapPairCount(&map) == 6);
        for (int k = 0; k < 6; k++) {
            int *v = MapGetFirstPtr(&map, k);
        result = result && MapInsertR(&map, 8, 8 * 100 + 3);
    
        result = result && (MapPairCount(&map) == 9);
        for (int k = 0; k < 9; k++) {
            int *v = MapGetFirstPtr(&map, k);
        MapRehashWithPolicy(&map, 8, policy);
    
        bool result = (MapPairCount(&map) == 5);
        for (int i = 0; i < 5; i++) {
            int *v = MapGetFirstPtr(&map, keys[i]);
    
        result = result && (MapTombstones(&map) == 0);
        result = result && (MapPairCount(&map) == 1);
        result = result && (MapValueCountForKey(&map, 7) == 1);
        result = result && MapGetFirstPtr(&map, 7) && (*MapGetFirstPtr(&map, 7) == 700);
        for (int k = 0; k < 8; k++)
            MapInsertR(&map, k, k * 100 + 3);
        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);
        result = result && (MapPairCount(&map) == 9);
        for (int k = 0; k < 9; k++)
            result = result && MapGetFirstPtr(&map, k) && (*MapGetFirstPtr(&map, k) == k * 100 + 3);
        IntIntMap        map   = MapInit(i32_hash, i32_compare, &alloc);
    
        bool result = MapPairCount(&map) == 0 && MapCapacity(&map) == 0 && MapTombstones(&map) == 0 &&
                      MapEntries(&map) == NULL && MapStates(&map) == NULL && MapKeyCompare(&map) == i32_compare &&
                      MapValueCompare(&map) == NULL && MapKeyHash(&map) == i32_hash &&
        MapSetOnlyR(&map, 2, 20);
    
        u64 length_before = MapPairCount(&map);
    
        bool result = MapRemoveFirst(&map, 1);
        result      = result && (MapValueCountForKey(&map, 1) == 1);
        result      = result && MapGetFirstPtr(&map, 1) && (*MapGetFirstPtr(&map, 1) == 11);
        result      = result && (MapPairCount(&map) == 2);
        // Length shrinks by exactly one.
        result = result && (MapPairCount(&map) == length_before - 1);
        result      = result && (MapPairCount(&map) == 2);
        // Length shrinks by exactly one.
        result = result && (MapPairCount(&map) == length_before - 1);
        // Unrelated key untouched.
        result = result && MapGetFirstPtr(&map, 2) && (*MapGetFirstPtr(&map, 2) == 20);
        MapInsertR(&map, 2, 20);
    
        u64 length_before     = MapPairCount(&map);
        u64 tombstones_before = MapTombstones(&map);
    
        bool result = !MapRemoveFirst(&map, 99);
        result      = result && (MapPairCount(&map) == length_before);
        result      = result && (MapTombstones(&map) == tombstones_before);
        result      = result && MapContainsKey(&map, 1);
        MapInsertR(&map, 5, 51);
    
        u64 length_before     = MapPairCount(&map);
        u64 tombstones_before = MapTombstones(&map);
        result = result && !MapRemovePair(&map, 6, 50);
    
        result = result && (MapPairCount(&map) == length_before);
        result = result && (MapTombstones(&map) == tombstones_before);
        result = result && MapContainsPair(&map, 5, 50);
        MapInsertR(&map, 5, 51);
        result     = result && (MapTombstones(&map) == 0);
        result     = result && (MapPairCount(&map) == 1);
        int *value = MapGetFirstPtr(&map, 5);
        result     = result && value && (*value == 51);
    
        bool result = (MapRetainIf(&map, always_retain, NULL) == 0);
        result      = result && (MapPairCount(&map) == 0);
    
        MapDeinit(&map);
    
        size removed = MapRemoveIf(&map, always_true_predicate, NULL);
        bool result  = (removed == 0) && (MapPairCount(&map) == 0);
    
        MapDeinit(&map);
        result      = result && MapGetFirstPtr(&map, 1) && (*MapGetFirstPtr(&map, 1) == 11);
        result      = result && MapContainsKey(&map, 3);
        result      = result && (MapPairCount(&map) == 2);
    
        MapDeinit(&map);
        result      = result && (MapValueCountForKey(&map, 5) == 0);
        result      = result && MapContainsKey(&map, 9);
        result      = result && (MapPairCount(&map) == 1);
    
        MapDeinit(&map);
        MapInsertR(&map, 9, 90);
    
        u64 length_before     = MapPairCount(&map);
        u64 tombstones_before = MapTombstones(&map);
    
        bool result = (MapRemoveAll(&map, 77) == 0);
        result      = result && (MapPairCount(&map) == length_before);
        result      = result && (MapTombstones(&map) == tombstones_before);
        result      = result && MapContainsKey(&map, 5);
            MapSetOnlyR(&map, i, i + 100);
    
        u64 length_before = MapPairCount(&map);
    
        MapRemoveFirst(&map, 5);
        MapRemoveFirst(&map, 5);
        bool result = !MapContainsKey(&map, 5);
        result      = result && (MapPairCount(&map) == length_before - 1);
    
        MapSetOnlyR(&map, 5, 205);
        result = result && MapContainsKey(&map, 5);
        result = result && MapGetFirstPtr(&map, 5) && (*MapGetFirstPtr(&map, 5) == 205);
        result = result && (MapPairCount(&map) == length_before);
        // Unrelated keys remain intact.
        result = result && MapGetFirstPtr(&map, 4) && (*MapGetFirstPtr(&map, 4) == 104);
        // Remove two interior keys; the ones before and after must stay reachable.
        bool result = MapRemoveFirst(&map, 1) && MapRemoveFirst(&map, 2);
        result      = result && (MapPairCount(&map) == 2);
        result      = result && !MapContainsKey(&map, 1) && !MapContainsKey(&map, 2);
        result      = result && MapGetFirstPtr(&map, 0) && (*MapGetFirstPtr(&map, 0) == 0);
        // 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);
        int *v6 = MapGetFirstPtr(&map, 6);
        result      = result && (MapValueCountForKey(&map, 7) == 0); // map_value_count early-out
        result      = result && (MapUniqueKeyCount(&map) == 0);
        result      = result && (MapPairCount(&map) == 0);
    
        // Cursor APIs on an empty map are invalid / NULL.
        int got = MapGetOrDefault(&map, 7, 1234);
        result  = result && (got == 1234);
        result  = result && (MapPairCount(&map) == 0);
        result  = result && !MapContainsKey(&map, 7);
            MapInsertR(&map, k, k * 100 + 7);
    
        bool result = (MapPairCount(&map) == 8) && (MapUniqueKeyCount(&map) == 8);
        for (int k = 0; k < 8; k++) {
            int *v = MapGetFirstPtr(&map, k);
            MapInsertR(&map, k, k * 100 + 7);
    
        bool result = (MapPairCount(&map) == KEY_COUNT) && (MapUniqueKeyCount(&map) == KEY_COUNT);
    
        // Lookup: every inserted key must return ITS OWN value, not a neighbour's.
    
        // Count dropped by exactly one; the removed key is gone.
        result = result && (MapPairCount(&map) == (KEY_COUNT - 1));
        result = result && (MapUniqueKeyCount(&map) == (KEY_COUNT - 1));
        result = result && !MapContainsKey(&map, removed) && (MapGetFirstPtr(&map, removed) == NULL);
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 2);
        result = result && KvConfigGetI64(&cfg, "a", &a) && (a == 1);
        result = result && KvConfigGetI64(&cfg, "b", &b) && (b == 2);
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 2);
        result = result && KvConfigGetI64(&cfg, "a", &a) && (a == 1);
        result = result && KvConfigGetI64(&cfg, "b", &b) && (b == 2);
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 1);
        v      = KvConfigGetPtr(&cfg, "k");
        result = result && v && (StrCmp(v, "v") == 0);
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 1);
        v      = KvConfigGetPtr(&cfg, "k");
        result = result && v && (StrCmp(v, "v") == 0);
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 1);
        result = result && KvConfigContains(&cfg, "k");
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 3);
        result = result && KvConfigContains(&cfg, "host");
        result = result && host && StrCmp(host, "localhost") == 0;
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 4);
        result = result && path && StrCmp(path, "/srv/my app") == 0;
        result = result && user && StrCmp(user, "root") == 0;
    
        result = result && (StrIterIndex(&si) == StrIterLength(&si));
        result = result && (MapPairCount(&cfg) == 3);
        // The CR must not survive in the parsed value.
        result = result && host && (StrCmp(host, "localhost") == 0);
Last updated on