// Las cuatro formas de guardar el diccionario. Todas ofrecen lo mismo:
//     construirse con una lista de palabras y responder contains(word).
// SortedDict se les da hecho. Completen TableDict y StdDict.
#ifndef DICTIONARIES_H
#define DICTIONARIES_H

#include <algorithm>
#include <string>
#include <unordered_map>
#include <vector>

#include "hash_map.h"
#include "not_implemented.h"
#include "probing_hash_map.h"

// Arreglo ordenado con búsqueda binaria.
class SortedDict {
public:
    explicit SortedDict(const std::vector<std::string>& words) : words_(words) {
        std::sort(words_.begin(), words_.end());
    }

    bool contains(const std::string& word) const {
        return std::binary_search(words_.begin(), words_.end(), word);
    }

private:
    std::vector<std::string> words_;
};

// Sirve para las dos tablas del curso: TableDict<HashMap> y TableDict<ProbingHashMap>. Solo
// importan las claves, así que usen Table<char> y guarden cualquier valor.
template <template <typename> class Table>
class TableDict {
public:
    // Fijen el factor de carga máximo ANTES de insertar.
    TableDict(const std::vector<std::string>& words, double max_load) {
        (void)words;
        (void)max_load;
        not_implemented("TableDict");
    }

    bool contains(const std::string& word) const {
        (void)word;
        not_implemented("TableDict::contains");
    }

    // Factor de carga real: size() / capacity(). Se les da hecho.
    double load_factor() const {
        return static_cast<double>(table_.size()) / static_cast<double>(table_.capacity());
    }

private:
    Table<char> table_;
};

// Con std::unordered_map, de la biblioteca (o std::unordered_set, si prefieren).
class StdDict {
public:
    StdDict(const std::vector<std::string>& words, float max_load) {
        (void)words;
        (void)max_load;
        not_implemented("StdDict");
    }

    bool contains(const std::string& word) const {
        (void)word;
        not_implemented("StdDict::contains");
    }

private:
    std::unordered_map<std::string, char> table_;
};

#endif
