#include #include #include "mystring.h" #include "Except.h" String::String( const char * cString ) { if( cString == NULL ) cString = ""; strLength = strlen( cString ); bufferLength = strLength + 1; buffer = new char[ bufferLength ]; strcpy( buffer, cString ); } String::String( const String & str ) { strLength = str.length( ); bufferLength = strLength + 1; buffer = new char[ bufferLength ]; strcpy( buffer,str.buffer ); } String::String( char ch ) { strLength = 1; bufferLength = strLength + 1; buffer = new char[ bufferLength ]; buffer[ 0 ] = ch; buffer[ 1 ] = '\0'; } const String & String::operator=( const String & rhs ) { if( this != &rhs ) { if( bufferLength < rhs.length( ) + 1 ) { delete [ ] buffer; bufferLength = rhs.length( ) + 1; buffer = new char[ bufferLength ]; } strLength = rhs.length( ); strcpy( buffer, rhs.buffer ); } return *this; } const String & String::operator+=( const String & rhs ) { if( this == &rhs ) { String copy( rhs ); return *this += copy; } int newLength = length( ) + rhs.length( ); if( newLength >= bufferLength ) { bufferLength = 2 * ( newLength + 1 ); char *oldBuffer = buffer; buffer = new char[ bufferLength ]; strcpy( buffer, oldBuffer ); delete [ ] oldBuffer; } strcpy( buffer + length( ), rhs.buffer ); strLength = newLength; return *this; } char & String::operator[ ]( int k ) { if( k < 0 || k >= strLength ) throw StringIndexOutOfBoundsException( k, length( ) ); return buffer[ k ]; } char String::operator[ ]( int k ) const { if( k < 0 || k >= strLength ) throw StringIndexOutOfBoundsException( k, length( ) ); return buffer[ k ]; } String operator+( const String & lhs, const String & rhs ) { String result = lhs; result += rhs; return result; } ostream & operator<<( ostream & out, const String & str ) { return out << str.c_str(); } istream & operator>>( istream & in, String & str ) { char ch; str = ""; in >> ch; if( !in.fail( ) ) { do { str += ch; in.get( ch ); } while( !in.fail( ) && !isspace( ch ) ); if( isspace( ch ) ) // put whitespace back on the stream in.putback( ch ); } return in; } istream & getline( istream & in, String & str, char delim ) { char ch; str = ""; // empty String, will build one char at-a-time while( in.get( ch ) && ch != delim ) str += ch; return in; } istream & getline( istream & in, String & str ) { return getline( in, str, '\n' ); } bool operator==( const String & lhs, const String & rhs ) { return strcmp( lhs.c_str( ), rhs.c_str( ) ) == 0; } bool operator!=( const String & lhs, const String & rhs ) { return strcmp( lhs.c_str( ), rhs.c_str( ) ) != 0; } bool operator<( const String & lhs, const String & rhs ) { return strcmp( lhs.c_str( ), rhs.c_str( ) ) < 0; } bool operator<=( const String & lhs, const String & rhs ) { return strcmp( lhs.c_str( ), rhs.c_str( ) ) <= 0; } bool operator>( const String & lhs, const String & rhs ) { return strcmp( lhs.c_str( ), rhs.c_str( ) ) > 0; } bool operator>=( const String & lhs, const String & rhs ) { return strcmp( lhs.c_str( ), rhs.c_str( ) ) >= 0; }