// ERROR A PROPÓSITO: la inserción usa el primer tombstone sin terminar de buscar la clave.
// Compilar: g++ -Wall -Wextra -std=c++20 errors/duplicate_at_tombstone.cpp -o build/duplicate_at_tombstone
#include <array>
#include <cstddef>
#include <iostream>

namespace {

constexpr int kEmpty = -1;
constexpr int kTombstone = -2;

std::size_t home(int key) { return static_cast<std::size_t>(key) % 7; }

void insert(std::array<int, 7>& table, int key) {
    std::size_t i = home(key);
    // Aquí está el error: la clave podría estar más adelante, pasando el tombstone.
    while (table[i] >= 0 && table[i] != key) {
        i = (i + 1) % table.size();
    }
    table[i] = key;
}

void erase(std::array<int, 7>& table, int key) {
    std::size_t i = home(key);
    while (table[i] != kEmpty) {
        if (table[i] == key) {
            table[i] = kTombstone;
            return;
        }
        i = (i + 1) % table.size();
    }
}

}  // namespace

int main() {
    std::array<int, 7> table;
    table.fill(kEmpty);
    insert(table, 8);
    insert(table, 15);
    erase(table, 8);
    insert(table, 15);  // ya estaba: no debería cambiar nada
    int copies = 0;
    for (int value : table) {
        copies += value == 15 ? 1 : 0;
    }
    std::cout << "copias de 15 en la tabla: " << copies << "\n";
    return 0;
}
