// string1.cpp -- metody třídy String
#include <cstring> // někdy string.h 
#include "string1.h" // obsahuje <iostream>
using std::cin;
using std::cout;

// inicializace člena statické třídy

int String::num_strings = 0;

// statické metody
int String::HowMany()
{
	return num_strings;
}

// metody třídy
String::String(const char * s) // konstrukce String z řetězce C
{
	len = std::strlen(s); // nastav velikost
	str = new char[len + 1]; // přiděl paměť
	std::strcpy(str, s); // inicializuj ukazatel
	num_strings++; // nastav čítač objektů
}

String::String() // implicitní konstruktor
{
	len = 4;
	str = new char[1];
	str[0] = '\0'; // implicitní řetězec
	num_strings++;
}

String::String(const String & st)
{
	num_strings++; // aktualizace statického člena
	len = st.len; // stejná délka
	str = new char [len + 1]; // přiděl paměť
	std::strcpy(str, st.str); // zkopíruj řetězec na nové místo
}

String::~String() // nezbytný destruktor
{
	--num_strings; // nutné
	delete [] str; // nutné
}

// metody přetíženého operátoru

		// String přiřaď String
String & String::operator=(const String & st)
{
	if (this == &st)
		return *this;
	delete [] str;
	len = st.len;
	str = new char[len + 1];
	std::strcpy(str, st.str);
	return *this;
}

		// C string přiřaď String
String & String::operator=(const char * s)
{
	delete [] str;
	len = std::strlen(s);
	str = new char[len + 1];
	std::strcpy(str, s);
	return *this;
}

		// znakový přístup čtení/zápis pro nekonstantní String
char & String::operator[](int i)
{
	return str[i];
}

		// znakový přístup pouze pro čtení pro konstantní String 
const char & String::operator[](int i) const
{
	return str[i];
}

// přátelé přetíženého operátoru

bool operator<(const String &st1, const String &st2)
{
	return (std::strcmp(st1.str, st2.str) < 0);
}

bool operator>(const String &st1, const String &st2)
{
	return st2.str < st1.str;
}

bool operator==(const String &st1, const String &st2)
{
	return (std::strcmp(st1.str, st2.str) == 0);
}

		// jednoduchý výstup String 
ostream & operator<<(ostream & os, const String & st)
{
	os << st.str;
	return os;
}

		// rychlý a nečistý vstup String
istream & operator>>(istream & is, String & st)
{
	char temp[String::CINLIM];
	is.get(temp, String::CINLIM);
	if (is)
		st = temp;
	while (is && is.get() != '\n')
		continue;
	return is;
}
