/* Name.h presents mutator methods for class Name.
 * ...
 */

#include <iostream>    // ostream
#include <string>      // the string class
#include <cassert>     // assert()
using namespace std;

class Name
{
 public:
   Name();                                  // constructors
   Name(string first, string middle, string last);
   
   string getFirstName() const;             // accessors
   string getMiddleName() const;
   string getLastName() const;
   string getSignature() const;
   
   char   getFirstInitial() const;
   char   getMiddleInitial() const;
   char   getLastInitial() const;
   
   void setFirstName(const string& newFirstName);  // mutators
   void setMiddleName(const string& newMiddlename);
   void setLastName(const string& newLastName);
   
   void print(ostream& out) const;          // I/O methods
   void read(istream& in);
   
   // ... other Name-operation declarations go here
 private:
   string myFirstName, 
          myMiddleName, 
          myLastName;
};

inline Name::Name()
{
   myFirstName = myMiddleName = myLastName = "";
}

inline Name::Name(string first, string middle, string last)
{
   myFirstName = first;
   myMiddleName = middle;
   myLastName = last;
}

inline string Name::getFirstName() const
{
   return myFirstName;
}

inline string Name::getMiddleName() const
{
   return myMiddleName;
}

inline string Name::getLastName() const
{
   return myLastName;
}
   
inline char Name::getFirstInitial() const
{
   assert(myFirstName.size() > 0);
   return myFirstName[0];
}

inline char Name::getMiddleInitial() const
{
   assert(myMiddleName.size() > 0);
   return myMiddleName[0];
}

inline char Name::getLastInitial() const
{
   assert(myLastName.size() > 0);
   return myLastName[0];
}


inline string Name::getSignature() const
{
  return myFirstName + ' ' 
         + getMiddleInitial() + ". "
         + myLastName;
}

inline void Name::setFirstName(const string& newFirstName)
{ 
   myFirstName = newFirstName;
}

inline void Name::setMiddleName(const string& newMiddleName)
{ 
   myMiddleName = newMiddleName;
}

inline void Name::setLastName(const string& newLastName)
{
   myLastName = newLastName;
}

inline void Name::print(ostream& out) const
{
   out << myFirstName + ' '
          + myMiddleName + ' '
          + myLastName;
}

inline void Name::read(istream& in)
{
   in >> myFirstName >> myMiddleName >> myLastName;
}

