//  File: main2.C
//
//

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <time.h>

#include "integer.h"
#include "mystring.h"
#include "quicksort4.h"


static void CrashOnNULL(void *ptr) {
   if (ptr == NULL) {
      cerr << "Ouch!" << endl ;
      exit(1) ;
   }
}


main() {
   Ordered **A ;
   int i ;

   srand48(time(NULL)) ;

   A = new Ordered*[50] ;
   CrashOnNULL(A) ;

   cout << "\nOriginal array: " << endl ;
   for (i = 0 ; i < 50 ; i++) {
      A[i] = new Integer(lrand48()) ;
      CrashOnNULL(A[i]) ;
      A[i]->print() ;
      cout << "  " ;
      if (i%5 == 4) cout << endl ;
   }

   QuickSort(A, 50) ;

   cout << "\nSorted array: " << endl ;
   for (i = 0 ; i < 50 ; i++) {
      A[i]->print() ;
      cout << "  " ;
      if (i%5 == 4) cout << endl ;
   }

   // Do it again with an array of strings

   Ordered **C = new Ordered*[12] ;
   CrashOnNULL(C) ;
   C[0]  = new String("Space,") ;
   C[1]  = new String("the") ;
   C[2]  = new String("final") ;
   C[3]  = new String("frontier.") ;
   C[4]  = new String("These") ;
   C[5]  = new String("are") ;
   C[6]  = new String("the") ;
   C[7]  = new String("voyages") ;
   C[8]  = new String("of") ;
   C[9]  = new String("the") ;
   C[10] = new String("Starship") ;
   C[11] = new String("Enterprise") ;

   cout << "\nOriginal Array: " << endl ;
   for (i = 0 ; i < 12 ; i++) {
      CrashOnNULL(C[i]) ;
      C[i]->print() ;
      if (i % 5 == 4) cout << endl ;
   }
   cout << endl ;

   QuickSort(C, 12) ;

   cout << "\nSorted Array: " << endl ;
   for (i = 0 ; i < 12 ; i++) {
      C[i]->print() ;
      if (i % 5 == 4) cout << endl ;
   }
   cout << endl ;


   // Mixing apples and oranges
   for (i = 20 ; i < 32 ; i++) {
      delete A[i] ;
      A[i] = C[i-20] ;
   }

   cout << "\nOriginal Mixed Array: " << endl ;
   for (i = 0 ; i < 50 ; i++) {
      A[i]->print() ;
      if (i % 5 == 4) cout << endl ;
   }
   cout << endl ;


   QuickSort(A, 50) ;

   cout << "\nSorted array: " << endl ;
   for (i = 0 ; i < 50 ; i++) {
      A[i]->print() ;
      delete A[i] ;
      cout << "  " ;
      if (i%5 == 4) cout << endl ;
   }
}
