// Muestra las cadenas de una tabla, paso a paso. Se inserta al inicio de la cadena.
#include <cstddef>
#include <iostream>
#include <string>
#include <vector>

#include "chain_table.h"

void print_table(const ChainTable<int>& table) {
    for (std::size_t i = 0; i < table.capacity(); i++) {
        std::cout << "  " << i << ":";
        for (const std::string& key : table.chain_keys(i)) {
            std::cout << " " << key;
        }
        std::cout << "\n";
    }
}

int main() {
    std::cout << "Con la suma y 8 casillas\n";
    ChainTable<int> small(8, sum_hash);
    for (const std::string word : {"lima", "amor", "roma", "ad", "bc", "mora"}) {
        small.set(word, 1);
        std::cout << "set(" << word << "): suma " << sum_hash(word) << ", casilla " << sum_hash(word) % 8 << "\n";
    }
    print_table(small);
    std::cout << "comparaciones para mora: " << small.comparisons_for("mora") << ", para amor: "
              << small.comparisons_for("amor") << ", para ramo: " << small.comparisons_for("ramo") << "\n";

    const std::vector<std::string> cities = {"lima", "cusco", "puno", "tacna", "ica", "piura"};
    for (std::size_t capacity : {4u, 8u}) {
        std::cout << "Con FNV-1a y " << capacity << " casillas\n";
        ChainTable<int> table(capacity, fnv1a);
        for (const std::string& city : cities) {
            table.set(city, 1);
        }
        print_table(table);
    }
}
