// File: String.cc
// partial solution to various string class homeworks
#include "String.h"
#include <string.h>
#include <fstream.h>

void String :: MakeBuffer( int size ) {
   Buffer = new char[ size ];
}
String :: String( const char* str ) {
   if( str ) {
      BufferLen = strlen( str ) + 1;
      MakeBuffer( BufferLen );
      strcpy( Buffer, str );
   }
   else {
      BufferLen = 1;
      MakeBuffer( BufferLen );
      Buffer[0] = '\0';
   }
}

String :: String( const String& s ) {
   BufferLen = s.BufferLen;
   MakeBuffer( BufferLen );
   strcpy( Buffer, s.Buffer );
}

String :: String( int size ) {
   BufferLen = size + 1;
   MakeBuffer( BufferLen );
   Buffer[0] = '\0';
}

String :: ~String() {
   delete [] Buffer;
}

const String& String :: operator=( const String& str ) {
   if( this != &str ) {
      if( BufferLen < strlen( str.Buffer ) + 1 ){
         delete [] Buffer;
         BufferLen = str.BufferLen;
         MakeBuffer( BufferLen );
      }
      strcpy( Buffer, str.Buffer );
   }
   return *this;
}
const char String :: operator[]( int k )const {
   
   
       

   
        
}
ostream& operator<< ( ostream& out, const String& s ) {
   out << s.Buffer;
   return out;
}

istream& operator>> ( istream& in, String& s ) {
   in >> s.Buffer;
   return in;
}

bool operator< (const String& lhs, const String& rhs ) {
   return ( strcmp( lhs.Buffer, rhs.Buffer ) < 0 );
}
bool operator> (const String& lhs, const String& rhs ) {
   return ( strcmp( lhs.Buffer, rhs.Buffer ) > 0 );
}
bool operator== (const String& lhs, const String& rhs ) {
   return ( strcmp( lhs.Buffer, rhs.Buffer ) == 0 );
}
bool operator!= (const String& lhs, const String& rhs ) {
   return ( strcmp( lhs.Buffer, rhs.Buffer ) != 0 );
}

const String operator+( const String& lhs, const String& rhs ) {

   int size = strlen( lhs.Buffer ) + strlen( rhs.Buffer );
   String Ans( size );
   strcpy( Ans.Buffer, lhs.Buffer );
   strcat( Ans.Buffer, rhs.Buffer );

   return Ans;
}
