// Cuántos objetos vivos hay: new T[n] frente a std::vector.
#include <iostream>
#include <vector>

#include "tracked.h"

// No tiene constructor sin argumentos.
class NoDefault {
public:
    explicit NoDefault(int value) : value_(value) {}
    int value() const { return value_; }

private:
    int value_;
};

void report(const char* what) {
    std::cout << what << ": vivos " << Tracked::counts.alive() << ", construidos sin argumentos "
              << Tracked::counts.default_built << ", destruidos " << Tracked::counts.destroyed << "\n";
}

int main() {
    Tracked::reset();
    Tracked* block = new Tracked[100];
    report("new Tracked[100]");
    delete[] block;
    report("delete[]");

    Tracked::reset();
    {
        std::vector<Tracked> v;
        v.reserve(100);
        report("reserve(100) de std::vector");
        v.push_back(Tracked(1));
        v.push_back(Tracked(2));
        report("dos push_back");
        v.pop_back();
        report("un pop_back");
    }
    report("fin del vector");

    std::vector<NoDefault> values;
    values.push_back(NoDefault(7));
    std::cout << "std::vector<NoDefault> compila, y guarda " << values[0].value() << "\n";
    return 0;
}
