//string example
//http://www.yolinux.com/TUTORIALS/LinuxTutorialC++StringClass.html
/*
 *  
 *  Is a virtual tape 
 *
 *  @author http://bumble.sf.net
 */

// good examples
// http://www.josuttis.com/libbook/i18n/loc1.cpp.html

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include "Tape.h"

using namespace std;
  

  //--------------------------------------------
  Tape::Tape() 
  {
    vector<string> array;
    pointer = 0;
  }


  //--------------------------------------------
  string Tape::toString()
  {
    string sReturn("");
    stringstream ssReturn;
    string currentItem("");
    
    ssReturn << "Pointer==" << this->pointer << endl;
    for (int ii = 0; ii < array.size(); ii++)
    {
      currentItem = this->array[ii];
      ssReturn << ii << ":" << currentItem << endl;
    }
    
    sReturn = ssReturn.str();
    return sReturn;
  } //-- method:

  //--------------------------------------------
  string Tape::print()
  {
    string sReturn("");
    stringstream ssReturn;
    string currentItem("");
    
    ssReturn << "Pointer==" << this->pointer << endl;

    for (int ii = 0; ii < array.size(); ii++)
    {
      currentItem = this->array[ii];
      ssReturn << ii << ":" << currentItem << endl;
      //cout << ii << ":" << currentItem << endl;
    }
    
    return ssReturn.str();
    //cout << ssReturn.str();
  } //-- method:



  //--------------------------------------------
  void Tape::put(string sNewElement)
  {
    if (this->pointer == this->array.size())
    {
      this->array.push_back(sNewElement);
      return;
    }

    this->array[this->pointer] = sNewElement;
  } //-- method:

  
  //--------------------------------------------
  string Tape::get()
  {
    if (this->pointer == this->array.size())
     { return ""; }
    return this->array[this->pointer];
  } //-- method:

  //--------------------------------------------
  void Tape::incrementPointer()
  {
    if (this->pointer == this->array.size())
    {
      this->array.push_back("");
    }

    this->pointer++;
  } //-- method:

  //--------------------------------------------
  /*  */
  void Tape::decrementPointer()
  {
    if (this->pointer == 0)
     { return; }

    this->pointer--;
  } //-- method:


  //--------------------------------------------
  /* a main method for testing */
/*
  int main()
  {
    
    stringstream ssUsageMessage;
    ssUsageMessage << "test usage: java Tape ";

    string sMessage("");


    //String sText = args[0];
    //char cChar = args[1].charAt(0);


    Tape testTape;

    cout << "put 'diffle'               " << endl;
    testTape.put("diffle");
    cout << testTape.toString() << endl;

    cout << "put 'buff'               " << endl;
    testTape.put("buff");
    cout << testTape.toString() << endl;

    cout << ".incrementPointer()       " << endl;
    testTape.incrementPointer();
    cout << testTape.toString() << endl;

    cout << "put 'diffle'               " << endl;
    testTape.put("diffle");
    testTape.print();
    cout << testTape.toString() << endl;



  } //-- main()

*/