#ifndef __String_hh__
#define __String_hh__
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <iostream>
class String
{
public:
String ();
String (const String& that);
String (const char* fmt, ...);
~String ();
String& operator= (const String& that);
String& operator= (const char* s);
unsigned length () const { return _length; }
const char* text () const { return _text; }
const char& operator[] (unsigned i) const;
void clear ();
void append (char c);
void append (unsigned length, const char* s);
void append (const char* fmt, ...);
bool nextLine (FILE* fp);
operator const char* () const { return text(); }
private:
static const unsigned defaultMinSize = 16;
void _append (unsigned length, const char* s);
void _append (const char* fmt, va_list ap);
void _grow (unsigned minSize);
unsigned _length;
unsigned _size;
char* _text;
};
inline int operator== (const String& x, const String& y)
{ return strcmp (x, y) == 0; }
inline int operator== (const String& x, const char* y)
{ return strcmp (x, y) == 0; }
inline int operator== (const char* x, const String& y)
{ return strcmp (x, y) == 0; }
inline int operator!= (const String& x, const String& y)
{ return strcmp (x, y) != 0; }
inline int operator!= (const String& x, const char* y)
{ return strcmp (x, y) != 0; }
inline int operator!= (const char* x, const String& y)
{ return strcmp (x, y) != 0; }
inline int operator< (const String& x, const String& y)
{ return strcmp (x, y) < 0; }
inline int operator< (const String& x, const char* y)
{ return strcmp (x, y) < 0; }
inline int operator< (const char* x, const String& y)
{ return strcmp (x, y) < 0; }
inline int operator> (const String& x, const String& y)
{ return strcmp (x, y) > 0; }
inline int operator> (const String& x, const char* y)
{ return strcmp (x, y) > 0; }
inline int operator> (const char* x, const String& y)
{ return strcmp (x, y) > 0; }
inline int operator<= (const String& x, const String& y)
{ return strcmp (x, y) <= 0; }
inline int operator<= (const String& x, const char* y)
{ return strcmp (x, y) <= 0; }
inline int operator<= (const char* x, const String& y)
{ return strcmp (x, y) <= 0; }
inline int operator>= (const String& x, const String& y)
{ return strcmp (x, y) >= 0; }
inline int operator>= (const String& x, const char* y)
{ return strcmp (x, y) >= 0; }
inline int operator>= (const char* x, const String& y)
{ return strcmp (x, y) >= 0; }
inline std::ostream& operator<< (std::ostream& out, const String& s) {
out << (const char*)s;
return out;
}
#endif