/* RockKind.cpp defines the nontrivial members of class RockKind.
 ***************************************************************/

#include <string>
#include <cctype>
using namespace std;

#include "RockKind.h"

// -------- Read a value into me from in ---------------------------
void RockKind::read(istream& in)
{
   string rockKindString;
   in >> rockKindString;

   for (int i = 0; i < rockKindString.size(); i++)
      if (islower(rockKindString[i]))
         rockKindString[i] = toupper(rockKindString[i]);

   if (rockKindString== "IGNEOUS")
      myRockKindName = IGNEOUS;
   else if (rockKindString== "METAMORPHIC")
      myRockKindName = METAMORPHIC;
   else if (rockKindString== "SEDIMENTARY")
      myRockKindName = SEDIMENTARY;
   else
   {
      cerr << "\n*** Read: Rock kind is unknown\n" 
           << endl;
      in.setstate(ios::failbit);
   }
}

// -------- Display me via out --------------------------
void RockKind::print(ostream& out) const
{
   switch(myRockKindName)
   {
      case IGNEOUS:     
                        out << "IGNEOUS";     
                        break;
      case METAMORPHIC: 
                        out << "METAMORPHIC"; 
                        break;
      case SEDIMENTARY: 
                        out << "SEDIMENTARY"; 
                        break;
   }
}

// -------- Increment me (prefix) --------------------------
RockKind RockKind::operator++()
{
   switch(myRockKindName)
   {
      case IGNEOUS:     
                        myRockKindName = METAMORPHIC;  
                        break;
      case METAMORPHIC: 
                        myRockKindName = SEDIMENTARY;
                        break;
      case SEDIMENTARY: 
                        myRockKindName = KIND_OVERFLOW;
                        break;
   }
   return RockKind(myRockKindName);
}

// -------- Increment me (postfix) --------------------------
RockKind RockKind::operator++(int)
{
   RockKindName savedRockKindName = myRockKindName;
   switch(myRockKindName)
   {
      case IGNEOUS:     
                        myRockKindName = METAMORPHIC;  
                        break;
      case METAMORPHIC: 
                        myRockKindName = SEDIMENTARY;
                        break;
      case SEDIMENTARY: 
                        myRockKindName = KIND_OVERFLOW;
                        break;
    }
   return RockKind(savedRockKindName);
}

// -------- Decrement me (prefix) ---------------------------------
// -------- Decrement me (postfix) --------------------------------

// Definitions of operator--() and operator--(int) are similar to those
// of operator++() and operator++(int) and are omitted to save space.

