#ifndef __FILENAME_H__
#define __FILENAME_H__

#include <string>
using namespace std;


/*****************************************************************************
*
*  Class: Filename
*
*  Purpose: When 'valid' filenames are found, this class allows simple
*           insertion and deletion of those names in a list.
*           If a "remove()" is called without a corresponding "insert()", then
*           the return value is a blank string.
*
*  Usage:   Filename class_name;
*           class_name.insert(some_filename);
*           class_name.insert(another_filename);
*           string temp1 = class_name.remove(); // value of 'some_filename'
*           string temp2 = class_name.remove(); // value of 'another_filename'
*
*****************************************************************************/
class Filename
{
   public:
      Filename();
      Filename(const Filename &);
      ~Filename();

      void insert(string);
      string remove(void);

      int getNumFiles(void);
      Filename &operator=(const Filename &);
   private:
      int numFiles;
      string *array;
};


/*****************************************************************************
*
*  Function: Filename()
*
*  Parameters - none
*
*  Return Value - none
*
*  Purpose - Constructor function for Filename class
*****************************************************************************/
Filename::Filename()
{
   numFiles = 0;
   array = new string[numFiles + 1];
}


/*****************************************************************************
*
*  Function: Filename()
*
*  Parameters - orig: Original
*
*  Return Value - none
*
*  Purpose - Copy constructor function for Filename class
*****************************************************************************/
Filename::Filename(const Filename &orig)
{
   numFiles = orig.numFiles;
   array = new string[numFiles];
   
   for (int curFilename = 0; curFilename < numFiles; curFilename++)
   {
      array[curFilename] = orig.array[curFilename];
   }
}


/*****************************************************************************
*
*  Function: ~Filename()
*
*  Parameters - none
*
*  Return Value - none
*
*  Purpose - Destructor function for Filename class
*****************************************************************************/
Filename::~Filename()
{
   delete [] array;
}


/*****************************************************************************
*
*  Function: insert()
*
*  Parameters - newFilename: a string value to add to the list
*
*  Return Value - none
*
*  Purpose - Inserts the given string into the array
*****************************************************************************/
void Filename::insert(string newFilename)
{
   string *newArray;
   newArray = new string[numFiles + 1];
   for (int curFile = 0; curFile < numFiles; curFile++)
   {
      newArray[curFile] = array[curFile];
   }
   newArray[numFiles] = newFilename;
   numFiles++;

   delete [] array;
   array = newArray;
}


/*****************************************************************************
*
*  Function: remove()
*
*  Parameters - none
*
*  Return Value - Oldest string value in list (FIFO)
*
*  Purpose - Removes a string value out of the array
*****************************************************************************/
string Filename::remove(void)
{
   string *newArray = NULL;
   string result = "";

   if (numFiles <= 0)
      return result;

   newArray = new string[numFiles - 1];

   for (int curFile = 1; curFile < numFiles; curFile++)
   {
      newArray[curFile - 1] = array[curFile];
   }
   result = array[0];
   numFiles--;

   delete [] array;
   array = newArray;

   return result;
}


/*****************************************************************************
*
*  Function: getNumFiles()
*
*  Parameters - none
*
*  Return Value - Number of strings (filenames) stored in the array
*
*  Purpose - Simply returns the size of the array
*****************************************************************************/
int Filename::getNumFiles(void)
{
   return numFiles;
}


/*****************************************************************************
*
*  Function: operator=
*
*  Parameters - orig: Original to copy from
*
*  Return Value - exact copy of 'orig' object
*
*  Purpose - Assignment operator for Filename class
*****************************************************************************/
Filename &Filename::operator=(const Filename &orig)
{
   numFiles = orig.numFiles;
   array = new string[numFiles];
   
   for (int curFilename = 0; curFilename < numFiles; curFilename++)
   {
      array[curFilename] = orig.array[curFilename];
   }
}

#endif   // __FILENAME_H__
