// Mide n inserciones en un std::vector<int>, duplicando y creciendo de a 1000.
// Se compila con -O2 y sin sanitizers. Cada tiempo es la mediana de 5 repeticiones.
#include <cstddef>
#include <cstdio>
#include <initializer_list>
#include <vector>

#include "bench.h"

// push_back solo: el vector duplica en este g++.
void fill_doubling(int n) {
    std::vector<int> v;
    for (int i = 0; i < n; i++) {
        v.push_back(i);
    }
    keep(v[n - 1]);
}

// reserve antes de llenarse: el vector crece de a step.
void fill_step(int n, std::size_t step) {
    std::vector<int> v;
    for (int i = 0; i < n; i++) {
        if (v.size() == v.capacity()) {
            v.reserve(v.capacity() + step);
        }
        v.push_back(i);
    }
    keep(v[n - 1]);
}

int main() {
    std::printf("%9s %13s %13s\n", "n", "duplicar(ms)", "de a 1000(ms)");
    for (int n : {100000, 200000, 400000, 800000, 1600000}) {
        double doubling = median_seconds(5, [n] { fill_doubling(n); });
        double step = median_seconds(5, [n] { fill_step(n, 1000); });
        std::printf("%9d %13.3f %13.3f\n", n, doubling * 1000, step * 1000);
    }
    return 0;
}
