// Lo que se usa para medir AvlMap, RedBlackMap y std::map con el mismo código.
// Paso 5: completen time_inserts y time_finds. Compilar con -O2 y sin sanitizers.
#ifndef MEASURE_H
#define MEASURE_H

#include <map>
#include <vector>

#include "bench.h"
#include "not_implemented.h"

// put y has dejan usar los tres mapas igual: std::map tiene otra interfaz.
template <typename Map>
void put(Map& map, int key) {
    map.insert(key, key);
}

inline void put(std::map<int, int>& map, int key) {
    map.insert({key, key});
}

template <typename Map>
bool has(const Map& map, int key) {
    return map.find(key) != nullptr;
}

inline bool has(const std::map<int, int>& map, int key) {
    return map.find(key) != map.end();
}

// Mediana de reps repeticiones, en segundos. En cada una, crea un mapa vacío e inserta todas las claves.
template <typename Map>
double time_inserts(const std::vector<int>&, int) {
    not_implemented("time_inserts");
}

// Mediana de reps repeticiones, en segundos. En cada una, busca todas las claves de lookups en map,
// que ya está armado. Usen keep con lo que encontraron, para que el compilador no borre el ciclo.
template <typename Map>
double time_finds(const Map&, const std::vector<int>&, int) {
    not_implemented("time_finds");
}

#endif
