#ifndef __EstructuraABC__
#define __EstructuraABC__


#include <stdio.h>
#include <list>
#include <iostream>
#include <fstream>
#include <string>
#include "Registro.hpp"



using namespace std;


/// Clase base para manipular Altas-Bajas-Cambios.
/**
 * Clase base para manipular Altas-Bajas-Cambios.
 * @author Antonio Carrillo Ledesma
 * @date Verano 2011
 * @version 0.0.1
 * @bug No errors detected
 * @todo ...
 */
class EstructuraABC
{

protected:

   /// Lista doblemente ligada de la libreria STL
   list<Registro *> lista;

   /// Iterador bidireccional para manipular a la lista
   list<Registro *>::iterator It;

   /// Borra todo el contenido de la lista
   void borrarTodo(void)
   {
      for (It = lista.begin(); It != lista.end(); ++It)
      {
         Registro *a = *It;
         delete a;
      }
      lista.clear();
   }


public:

   /// Constructor de la clase
   EstructuraABC(void)
   {
   }

   /// Destructor de la clase
   ~EstructuraABC(void)
   {
      borrarTodo();
   }

   /// Adiciona un registro al final de la lista
   virtual int adicionar(void) = 0;

   /// Adiciona un registro en la posicion indicada en la lista
   virtual int adicionar(int pos) = 0;

   /// Adiciona un registro al final de la lista
   virtual int leerAdiciona(FILE *file) = 0;

   /// Visualiza el contenido del registro solicitado
   int visualiza(int pos);

   /// Visualiza todo el contenido de la lista
   int visualizaTodos(void);

   /// Visualiza el registro de la lista solicitado
   int borrar(int pos);

   /// Modifica el registro de la lista solicitado
   int modificar(int pos);

   /// Leer una lista de disco
   int leer(const char *file);

   /// Grabar una lista en disco
   int grabar(const char *file);


   /// Regresa el numero de registros en la lista
   inline int regresaNRegs(void)
   {
      return lista.size();
   }

};


/**
 * Clase base para manipular Altas-Bajas-Cambios.
 *
 * @example main.cpp
 */

#endif