/*
    * ----------------------------------------------------------------------------
    * Course      : COSC 1437 Programming Fundamentals II
    * Subject     : Project II
    * Due Date    : WK 10 Wed - 10:00AM
    * Instructor  : James Sasitorn
    * ----------------------------------------------------------------------------
    */

   Problem: Coscimon Development Center
   +-----------------------------+

   You have been hired as the hotshot developer for the Coscimon Project. Coscimon
   are creatures of the land, air, and water that Coscimon trainers have collected
   to raise and battle. Your requirement for this project is to write C++ code to 
   do the following:

   1. Write C++ classes supporting Coscimon. 

      1. Coscimon possess the following attributes (private visibility):

         1. name : string
         2. age : int
         3. weight : double
         4. gender : Gender 
   
        where gender is an enum type with values 'male', or 'female' (no quotes)
   
      2. You will need to provide getters (accessors) and setters (mutators) for all 
      Coscimon attributes. 

      3. Support the following Constructors:
         a. Constructor that receives values for all 4 attributes
 
         b. Constructor that receives only a name, and assigns the values
            age = 1, weight = 10.5, gender = male
 
         Note: that when a new Coscimon is created the static member population
         listed below needs to be incremented.

      4. Static member (private visibility)

            population : int specifying the size of the population
   
      5. Static getter for population

      6. Destructor that decrements the population by 1

      7. Provide overloaded operators for <<, >>, ==, !=, >, >=, <, <=
         A Coscimon should be outputted as follows:

             Coscimon(name,age, weight, gender);

         Coscimon are ranked by their weight and then their Gender (male then female)

   2. Create derived classes from Coscimon to support the different kinds of Coscimon:
     LandCoscimon, WaterCoscimon, AirCoscimon. 
      
      1. Each subclass must define its own constructor that passes its parameters to
        the parent Coscimon, and also increments the population by 1
   
      2. Each subclass must have a static member (private visibility)
   
          population : int specifying the size of the population for the sub class

      3. Static getter for population

      4. Destructor that decrements the population by 1

      5. Provide overloaded operators for <<
         Each subclass of Coscimon should be outputted as follows:

         LandCoscimon(name,age, weight, gender);
         WaterCoscimon(name,age, weight, gender);
         AirCoscimon(name,age, weight, gender);

   3. Provide a UML Diagram for the above functionality (use Visio, ArgoUml, etc)
 
   4. Implement the functionality required in the Coscimon interface. Specifically,
      provide implementations for the following:
         1. Create new Coscimon
         2. Rename a Coscimon
         3. Destroy a Coscimon
         4. List All Coscimon (unordered)

    5. Provide support to be able to sort functionality to list Coscimon by
         a. by Name
         b. by Age
         c. by Rank (see the overloaded operations <,<=,>,>= above)

    6. Support File Input/Output to load and save a collection of Coscimon into the 
       Coscimon Development Center. The format of the file is:

          [Name]\t[Age]\t[Weight]\t[Gender]

       where Gender is either 'male' or 'female'. You can assume all data is well formatted.
       Sample input data will be provided soon.
       
       After completing file I/O. Add the following functionality to your Coscimon
       interface:
           4. Import Data
           5. Export Data

   Additional Requirements
   +------------------------------+
   1. Source code must be documented.
   2. Implement the Coscimon menu System
   3. Source code is formatted.
   4. Submit the Source code by email and printed out.


  Grading Outline
  +-----------------------+
  Auto Grading              / 60
  Coding Style              / 20
  Unit Testing              / 10
  Documentation             / 10
  ---------------------------
  Final Grade        [      /100 ]