// test.cpp - Punteros inteligentes
#include <iostream>
#include <string>
#include <memory>      // para auto_ptr
#include "vector.h"    // plantilla Vector
//#include <vector>
//#include <algorithm> // para sort
#define LONGNOM 30
using namespace std;

typedef struct
{
  char nombre[LONGNOM];
  long tfno;
} t_tfno;

void leer(auto_ptr<Vector<t_tfno> >& pa)
{
  for (int i = 0; i < (*pa).longitud(); i++)
  {
    cout << "Nombre:   "; cin.getline((*pa)[i].nombre, LONGNOM);
    cout << "Teléfono: "; cin >> ((*pa)[i].tfno);
    cin.ignore();
  }
}

void mostrar(auto_ptr<Vector<t_tfno> >& pa)
{
  for (int i = 0; i < (*pa).longitud(); i++)
  {
    cout << "Nombre:   " << ((*pa)[i].nombre) << endl;
    cout << "Teléfono: " << ((*pa)[i].tfno) << endl;
  }
}

int main()
{
  auto_ptr<Vector<t_tfno> > pa;
  int n = 3;
  pa = auto_ptr<Vector<t_tfno> >(new Vector<t_tfno>(n));
  leer(pa);
  mostrar(pa);

  auto_ptr<Vector<t_tfno> > pta1(new Vector<t_tfno>(n));
  auto_ptr<Vector<t_tfno> > pta2;
  leer(pta1);    // correcto
  pta2 = pta1;   // ahora pta2 posee el puntero y pta1 no
  mostrar(pta2); // correcto
  // Cuando el flujo de ejecución sale fuera del ámbito de pta1 y
  // pta2, el destructor de auto_ptr borra el objeto apuntado por
  // pta2, pero no hace nada sobre pta1.

  // Utilización de reset
  Vector<t_tfno> *p = new Vector<t_tfno>(1);
  cout << "Nombre:   "; cin.getline((*p)[0].nombre, LONGNOM);
  cout << "Teléfono: "; cin >> (*p)[0].tfno;
  pta2.reset(p);
  p = 0;         // ahora pta2 posee el objeto vector y p no
  mostrar(pta2);
  // Utilización de ->
  long ne = pta2->longitud(); // devuelve el número de elementos
  cout << "Número de elementos: " << ne << endl;
  // Utilización de *
  ne = (*pta2).longitud(); // devuelve el número de elementos
  cout << "Número de elementos: " << ne << endl;
  // Utilización de release
  p = pta2.release(); // ahora p posee el objeto vector y pta2 no
  cout << "Nombre:   " << (*p)[0].nombre << endl;
  cout << "Teléfono: " << (*p)[0].tfno << endl;
  delete p;

  //vector<auto_ptr<t_tfno> > lista;
  // ...
  //sort(lista.begin(), lista.end());

  system("pause");
}

