//list_ct.cpp
// This file contains code that will exercise the List "C" style impl.
#include <iostream.h>
#include <string.h>
#include <fstream.h>
#include "list_c.h"
void print_with_at(ostream &out, List& list)	{
   out << "entries=" << entries(&list) << endl;
   for(int i=0;i<entries(&list);i++)	{
	out << at(&list,i) << " ";
   }
   out << endl;
}

void print_with_get(ostream &out, List& list)	{
   out << "entries=" << entries(&list) << endl;
   for(void *value=getFirst(&list);(value);value=next(&list))	{
	out << value << " ";
   }
   out << endl;
}

int charStarWriter(void* item, ostream& str) {
   char* cstring = static_cast<char*>(item);
   str << strlen(cstring) << endl;
   str << cstring << endl;

   return (str.fail()) ? -1 : 0;
}

int charStarReader(void*& item, istream& str) {
   int length;
   str >> length;
   str.ignore(1); //throw away \n after length
   char* cstring = new char[length+1];
   str.get(cstring, length+1);
   item = cstring;

   return (str.fail()) ? -1 : 0;
}

int main()	{
   List* list1 = List_ctor();		   //1a
   List* list2 = List_ctor(*list1);	   //1b

   print_with_at(cout,*list1);		   //2a
   print_with_at(cout,*list2);		   //2b

   char* one = new char[4];		   //3a-heap
   strcpy(one,"one");
   char two[4];				   //3b-stack
   strcpy(two,"two");

   insert(list1,one);			   //4a
   insert(list1,two);			   //4b

   print_with_at(cout,*list1);		   //5a
   print_with_at(cout,*list2);		   //5b

   char* three = new char[6];		   //6a-heap
   strcpy(three,"three");
   insert(list1,three);
   char four[5];			   //6b-stack
   strcpy(four,"four");
   insert(list1,four);

   print_with_get(cout,*list1);		   //7a
   print_with_get(cout,*list2);		   //7b

   List* list3 = List_ctor(*list1);	   //8

   assign(list2,*list3);		   //9

   if (isEqual(list1,*list2) &&		   //10
	    isEqual(list2,*list3) && isEqual(list3,*list1))
   	cout << "everybody's equal" << endl;
   else
	   cout << "woops!?!" << endl;

   fstream file("list.dat", ios::in | ios::out);
   saveOn(list1, file, charStarWriter);      //11a
   file.seekg(0);
   List* list4 = List_ctor();
   restoreFrom(list4, file, charStarReader); //12
   cout << "entries=" << entries(list4) << endl;
   {for(int i=0; i<entries(list4); i++) {    //13
      char* cstring = static_cast<char*>(at(list4,i));
      cout << at(list4,i) << " " << cstring << " ";
      delete [] cstring;
   }}
   cout << endl;

   dtor(list1);                            //14a
   dtor(list2);                            //14b
   dtor(list3);                            //14c
   dtor(list4);                            //14d

   delete [] one;			   //15a
   delete [] three;			   //15b

   return 0;
}
/***********output********************
entries=0

entries=0

entries=2
0x599700f6 0x39a7258c
entries=0

entries=4
0x599700f6 0x39a7258c 0x599700ea 0x39a72582
entries=0

everybody's equal
entries=4
0x56f701f2 one 0x56f701ea two 0x56f701de three 0x56f701d2 four
*************************************/

