**fig1_6.txt** /* 1*/ inline void String::Get_Buffer( const unsigned int Max_Length ) /* 2*/ { /* 3*/ Buffer_Len = Max_Length + 1; /* 4*/ Buffer = new char [ Buffer_Len ]; /* 5*/ if( !Buffer ) /* 6*/ Error( "Out of space" ); /* 7*/ } /* 8*/ String::String( const char * Value ) /* 9*/ { /*10*/ if( Value == NULL ) // Use "" if Value is NULL. /*11*/ { /*12*/ Get_Buffer( 0 ); /*13*/ Buffer[ 0 ] = '\0'; /*14*/ } /*15*/ else /*16*/ { /*17*/ Get_Buffer( strlen( Value ) ); /*18*/ for( int i = 0; i < Buffer_Len; i++ ) /*19*/ Buffer[ i ] = Value[ i ]; /*20*/ } /*21*/ } /*22*/ String::String( const String & Value ) /*23*/ { /*24*/ Get_Buffer( strlen( Value.Buffer ) ); /*25*/ for( int i = 0; i < Buffer_Len; i++ ) /*26*/ Buffer[ i ] = Value.Buffer[ i ]; /*27*/ } /*28*/ const String & String::operator = ( const String & Value ) /*29*/ { /*30*/ const int Len = strlen( Value.Buffer ); /*31*/ if( this != &Value ) // Don't copy to yourself. /*32*/ { /*33*/ if( Len >= Buffer_Len ) /*34*/ { /*35*/ delete [ ] Buffer; /*36*/ Get_Buffer( Len ); /*37*/ } /*38*/ /*39*/ for( int i = 0; i < Len; i++ ) /*40*/ Buffer[ i ] = Value.Buffer[ i ]; /*41*/ Buffer[ i ] = '\0'; /*42*/ } /*43*/ return *this; /*44*/ } /*45*/ inline int operator == ( const String & Lhs, const String & Rhs ) /*46*/ { /*47*/ return strcmp( Lhs.Buffer, Rhs.Buffer ) == 0; /*48*/ } /*49*/ inline int operator != ( const String & Lhs, const String & Rhs ) /*50*/ { /*51*/ return strcmp( Lhs.Buffer, Rhs.Buffer ) != 0; /*52*/ } /*53*/ inline int operator < ( const String & Lhs, const String & Rhs ) /*54*/ { /*55*/ return strcmp( Lhs.Buffer, Rhs.Buffer ) < 0; /*56*/ } /*57*/ inline int operator > ( const String & Lhs, const String & Rhs ) /*58*/ { /*59*/ return strcmp( Lhs.Buffer, Rhs.Buffer ) > 0; /*60*/ } /*61*/ char & String::operator [ ] ( unsigned int Index ) const /*62*/ { /*63*/ if( Index > strlen( Buffer ) ) /*64*/ cerr << "Warning: out of bounds string access" << endl; /*65*/ return Buffer[ Index ]; /*66*/ }