Skip to content

MapTombstones

Description

Tombstone count: slots that previously held a key but are now reserved for probe-chain continuity. Reset to zero by rehash.

Parameters

Name Direction Description
m in Map.

Usage example (Cross-references)

Usage examples (Cross-references)
        MapInsertR(&second, 10, 100);
    
        bool result = (MapTombstones(&first) == 1);
        MapCompact(&first);
        MapCompact(&first);
    
        result = result && (MapTombstones(&first) == 0);
        result = result && MapContainsPair(&first, 1, 11);
        result = result && MapContainsPair(&first, 2, 20);
        MapRemoveFirst(&map, 2);
    
        bool result = (MapTombstones(&map) == 1);
    
        MapMustCompact(&map);
    
        // Returned to caller; tombstones cleared, survivors intact, length exact.
        result = result && (MapTombstones(&map) == 0);
        result = result && MapContainsPair(&map, 1, 10);
        result = result && MapContainsPair(&map, 3, 30);
        MapRemoveFirst(&map, 1);
    
        bool result = (MapTombstones(&map) == 1);
    
        MapMustRehashWithPolicy(&map, MapPairCount(&map), MapPolicyQuadratic);
        result = result && (MapPolicy(&map).should_rehash == MapPolicyQuadratic.should_rehash);
        // Tombstones gone, survivors intact, exact counts preserved.
        result = result && (MapTombstones(&map) == 0);
        result = result && !MapContainsKey(&map, 1);
        result = result && MapContainsPair(&map, 2, 20);
        MapClear(&map);
    
        bool result = (reserved_capacity >= 32) && (MapCapacity(&map) == reserved_capacity) && (MapTombstones(&map) == 0) &&
                      (MapPairCount(&map) == 0) && MapEmpty(&map) && !MapContainsKey(&map, 1) && !MapContainsKey(&map, 2);
                      (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);
    
        MapDeinit(&map);
        MapInsertR(&map, 7, 70);
        MapRemoveFirst(&map, 7);
        bool result = (MapTombstones(&map) == 1);
    
        MapInsertR(&map, 7, 71); // reuses the tombstone slot for key 7
    
        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);
        bool result              = MapInsertR(&map, 5, 50);
        MapRemoveFirst(&map, 5);
        result = result && (MapTombstones(&map) == 1);
    
        g_value_copy_should_fail = true;
    
        result = result && !reinserted;
        result = result && (MapTombstones(&map) == 1);
    
        MapDeinit(&map);
        MapRemoveAll(&map, 1);
        MapRemoveAll(&map, 3);
        bool result = (MapTombstones(&map) == 2);
    
        MapInsertR(&map, 200, 200); // exactly on the 3/4 boundary -> must rehash
        MapInsertR(&map, 200, 200); // exactly on the 3/4 boundary -> must rehash
    
        result = result && (MapTombstones(&map) == 0);
        result = result && MapGetFirstPtr(&map, 200) && (*MapGetFirstPtr(&map, 200) == 200);
    
        MapInsertR(&map, 7, 70);
        bool result = (MapTombstones(&map) == 0);
    
        MapSetOnlyR(&map, 7, 700); // remove-all (tomb=1) then raw reinsert into the tombstone
        MapSetOnlyR(&map, 7, 700); // remove-all (tomb=1) then raw reinsert into the tombstone
    
        result = result && (MapTombstones(&map) == 0);
        result = result && (MapPairCount(&map) == 1);
        result = result && (MapValueCountForKey(&map, 7) == 1);
        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 &&
    
        u64 length_before     = MapPairCount(&map);
        u64 tombstones_before = MapTombstones(&map);
    
        bool result = !MapRemoveFirst(&map, 99);
        bool result = !MapRemoveFirst(&map, 99);
        result      = result && (MapPairCount(&map) == length_before);
        result      = result && (MapTombstones(&map) == tombstones_before);
        result      = result && MapContainsKey(&map, 1);
        result      = result && MapContainsKey(&map, 2);
    
        u64 length_before     = MapPairCount(&map);
        u64 tombstones_before = MapTombstones(&map);
    
        // Key present, value absent.
    
        result = result && (MapPairCount(&map) == length_before);
        result = result && (MapTombstones(&map) == tombstones_before);
        result = result && MapContainsPair(&map, 5, 50);
        result = result && MapContainsPair(&map, 5, 51);
    
        MapInsertR(&map, 5, 50);
        bool result = (MapTombstones(&map) == 0);
    
        MapRemoveFirst(&map, 5);
    
        MapRemoveFirst(&map, 5);
        result = result && (MapTombstones(&map) == 1);
        result = result && !MapContainsKey(&map, 5);
    
        MapInsertR(&map, 5, 51);
        result     = result && (MapTombstones(&map) == 0);
        result     = result && (MapPairCount(&map) == 1);
        int *value = MapGetFirstPtr(&map, 5);
    
        u64 length_before     = MapPairCount(&map);
        u64 tombstones_before = MapTombstones(&map);
    
        bool result = (MapRemoveAll(&map, 77) == 0);
        bool result = (MapRemoveAll(&map, 77) == 0);
        result      = result && (MapPairCount(&map) == length_before);
        result      = result && (MapTombstones(&map) == tombstones_before);
        result      = result && MapContainsKey(&map, 5);
        result      = result && MapContainsKey(&map, 9);
Last updated on