//Simple application of ADT List using templates
// File:    list-app2.cc
// Author:  Henry M. Walker
// Date:    May 29, 1998

#include "list-temp.h"

// declaration of four lists, two for integers, two for characters
// in each case, one list is unordered, the other is ordered

int main () {
    char ch, choice;
    int i;
    List<char>         listch;  // variable declarations, filling in List type
    List<int>          listin;
    OrderedList<char>  olistch;
    OrderedList<int>   olistin;

    cout << "program to test List ADT and Ordered List ADT" << endl;
    
    do {
        cout << endl << "options" << endl;
        cout << "   a - search for item on integer list"  << endl;
        cout << "   b - search for item on character list"  << endl;
        cout << "   c - search for item on ordered integer list" << endl;
        cout << "   d - search for item on ordered character list" << endl << endl;

        cout << "   e - count items on integer list"  << endl;
        cout << "   f - count items on character list"  << endl;
        cout << "   g - count items on ordered integer list"  << endl;
        cout << "   h - count items on ordered character list"  << endl<< endl;

        cout << "   i - insert integer into integer list"  << endl;
        cout << "   j - insert character into character list"  << endl;
        cout << "   k - insert integer into ordered integer list"  << endl;
        cout << "   l - insert character into ordered character list" << endl << endl;

        cout << "   n - print integer list in order" << endl;
        cout << "   o - print character list in order" << endl;
        cout << "   p - print ordered integer list in order" << endl;
        cout << "   q - print ordered character list in order" << endl << endl;
        
        cout << "   r - print integer list from back to front" << endl;
        cout << "   s - print character list from back to front" << endl;
        cout << "   t - print ordered integer list from back to front" << endl;
        cout << "   u - print ordered character list from back to front" << endl << endl;

        cout << "   x - exit" << endl;

        cout << "   enter choice: ";
        cin >> choice;
        switch (choice) {
 	   case 'a': cout << "enter integer for search: ";
                     cin >> i;
                     if (listin.isin(i))
                        {cout << "integer found in list" << endl;}
                        else {cout << "integer not found in list" << endl;}
                     break;          
 	   case 'b': cout << "enter character for search: ";
                     cin >> ch;
                     if (listch.isin(ch))
                        {cout << "character found in list" << endl;}
                        else {cout << "character not found in list" << endl;}
                     break;          
 	   case 'c': cout << "enter integer for search: ";
                     cin >> i;
                     if (olistin.isin(i))
                        {cout << "integer found in list" << endl;}
                        else {cout << "integer not found in list" << endl;}
                     break;          
 	   case 'd': cout << "enter character for search: ";
                     cin >> ch;
                     if (olistch.isin(ch))
                        {cout << "character found in list" << endl;}
                        else {cout << "character not found in list" << endl;}
                     break;
          
           case 'e': listin.count(); break;
           case 'f': listch.count(); break;
           case 'g': olistin.count(); break;
           case 'h': olistch.count(); break;

	   case 'i': cout << "enter integer to be inserted: ";
                     cin >> i;
                     listin.insert(i);
                     break;
	   case 'j': cout << "enter character to be inserted: ";
                     cin >> ch;
                     listch.insert(ch);
                     break;
	   case 'k': cout << "enter integer to be inserted: ";
                     cin >> i;
                     olistin.insert(i);
                     break;
	   case 'l': cout << "enter character to be inserted: ";
                     cin >> ch;
                     olistch.insert(ch);
                     break;

           case 'n': listin.print(); break;
           case 'o': listch.print(); break;
           case 'p': olistin.print(); break;
           case 'q': olistch.print(); break;

	   case 'r': listin.print_reverse(); break;
	   case 's': listch.print_reverse(); break;
	   case 't': olistin.print_reverse(); break;
	   case 'u': olistch.print_reverse(); break;

           case 'x':  cout << "program terminated" << endl; break;
           default:  cout << "invalid option" << endl;
           }
    }
    while (choice != 'x');
    

} /* main */
