/* String1.h */
#ifndef STRING1_H
#define STRING1_H

#include <iostream>

using namespace std;


class String {
  int length;                          // string length
  char *sPtr;                          // pointer to start of string

  void setString(const char *);        // utility function

public:
  String(const char * = "");           // conversion/default constructor
  String(const String&);               // copy constructor
  ~String();                           // destructor

  const String &operator=(const String&);   // assignment
  const String &operator+=(const String&);  // concatenation

  bool operator!() const;                   // is String empty?
  bool operator==(const String&) const;     // test s1 == s2
  bool operator<(const String&) const;      // test s1 < s2

  // test s1 != s2
  bool operator!=(const String& right) const {
    return !(*this == right);
  }

  // test s1 > s2
  bool operator>(const String& right) const {
    return right < *this;
  }

  // test s1 <= s2
  bool operator<=(const String& right) const {
    return !(right < *this);
  }

  // test s1 >= s2
  bool operator>=(const String& right) const {
    return !(*this < right);
  }

  char& operator[](int);               // subscript operator
  const char& operator[](int) const;   // subscript operator
  String operator()(int, int);         // return a substring
  int getLength() const;               // return string length

  friend ostream& operator<<(ostream&, const String&);
  friend istream& operator>>(istream&, String&);
};


#endif
