// Clase que escribe qué función especial corre en cada momento.
#ifndef TRACED_H
#define TRACED_H

#include <iostream>
#include <string>
#include <utility>

class Traced {
public:
    explicit Traced(const std::string& name) : name_(name) {
        std::cout << "  constructor " << name_ << "\n";
    }
    ~Traced() {
        std::cout << "  destructor " << name_ << "\n";
    }
    Traced(const Traced& other) : name_(other.name_ + "+c") {
        std::cout << "  constructor de copia, desde " << other.name_ << "\n";
    }
    Traced& operator=(const Traced& other) {
        std::cout << "  asignación de copia, " << name_ << " = " << other.name_ << "\n";
        return *this;
    }
    Traced(Traced&& other) noexcept : name_(other.name_ + "+m") {
        std::cout << "  constructor de movimiento, desde " << other.name_ << "\n";
    }
    Traced& operator=(Traced&& other) noexcept {
        std::cout << "  asignación de movimiento, " << name_ << " = " << other.name_ << "\n";
        return *this;
    }

private:
    std::string name_;
};

#endif
