// std::move solo es un cast: quien mueve es el constructor o la asignación que se elige.
#include <iostream>
#include <utility>

#include "alloc_count.h"
#include "int_buffer.h"

void report(const char* step) {
    std::cout << step << ": new[]=" << array_news() << " delete[]=" << array_deletes() << "\n";
}

int main() {
    IntBuffer a(1000);
    a.at(0) = 42;
    report("a creado");

    IntBuffer&& same = std::move(a);
    report("solo std::move(a)");
    std::cout << "same.size()=" << same.size() << " a.size()=" << a.size() << " a.at(0)=" << a.at(0) << "\n";

    IntBuffer b = std::move(a);
    report("constructor de movimiento");
    std::cout << "a.size()=" << a.size() << " b.size()=" << b.size() << " b.at(0)=" << b.at(0) << "\n";
    a.check_invariants();

    IntBuffer c(10);
    report("c creado");
    c = std::move(b);
    report("asignación de movimiento");
    std::cout << "b.size()=" << b.size() << " c.size()=" << c.size() << " c.at(0)=" << c.at(0) << "\n";
    b.check_invariants();

    b = c;
    report("se reutiliza b, con una copia");
    std::cout << "b.size()=" << b.size() << " b.at(0)=" << b.at(0) << "\n";

    const IntBuffer d(20);
    report("d creado, const");
    IntBuffer e = std::move(d);
    report("std::move de un const");
    std::cout << "d.size()=" << d.size() << " e.size()=" << e.size() << "\n";
    return 0;
}
