// Paweł Milewski  G1ISI
// string_algo

#include <boost/algorithm/string.hpp>
#include <iostream>

using namespace std;
using namespace boost;

/*	Użycie biblioteki string_algo jest niezwykle proste.
*	Posiada ona m.in. takie algorytmy jak is_upper, is_lower, is_space, to_upper, to_lower, trim_left, trim.
*	Nazwy są sugestywne i dość precyzyjnie określają do czego dana funkcja służy,
*	dlatego w wielu przypadkach, aby wyjaśnić działanie danego algorytmu poprzestanę na przykładzie.
*	Algorytmy mają swoje wersje modyfikujące i tworzące kopię argumentu. Istnieją algorytmy do wszyszukiwania,
*	do kasowania i do zamiany.
*/

bool czy_wykonywalny(string& nazwa_pliku)
	{	
		return (iends_with(nazwa_pliku, ".exe") || iends_with(nazwa_pliku, ".com"));
	}

int main(int argc, char *argv[]) 
{
	string str1(" WiTaJ SwIeCiE! ");	cout<<str1<<endl;				// " WiTaJ SwIeCiE! "
	//zamieniamy litery na wielkie:
	to_upper(str1);						cout<<"to_upper: "<<str1<<endl;	// " WITAJ SWIECIE! "
	//zamieniamy litery na małe:
    to_lower(str1);						cout<<"to_lower: "<<str1<<endl;	// " witaj swiecie! "
	//są również te same algorytmy w wersji tworzącej kopię:
	//to_upper_copy i to_upper_copy

	//istnieją również algorytmy predykatowe i klasyfikacyjne
	//predykatowe to m.in.: starts_with, istarts_with, ends_with, iends_with, contains, equals, lexicographical_compare, all

//iends_with:
//bool czy_wykonywalny(string& nazwa_pliku)
//	{	
//		return (iends_with(nazwa_pliku, ".exe") || iends_with(nazwa_pliku, ".com"));
//	}
	string nazwa_pliku("string_algo.cpp");
	cout<<"Czy plik "<<nazwa_pliku<<" jest wykonywalny? ";
	if(czy_wykonywalny(nazwa_pliku))
		cout<<"TAK"<<endl;
	else
		cout<<"NIE"<<endl;

	//algorytmy klasyfikacyjne to m.in.: is_space, is_alnum, is_alpha, is_cntrl, is_digit, is_graph, is_lower, is_upper
	
	char text1[]="lubie sie uczyc";
	//algorytm predykatowy all i klasyfikacyjny is_lower:
	cout<<"Czy w tekscie 'lubie sie uczyc' wszystkie litery sa male? ";
	if(all(text1, is_lower()))
		cout<<"TAK"<<endl;
	else 
		cout<<"NIE"<<endl; 
	cout<<endl;
	//is_from_range
	cout<<"Czy w tekscie 'lubie sie uczyc' sa same litery od 'a' do 'z'? ";
	if(all(text1, is_from_range('a','z')))
		cout<<"TAK"<<endl;
	else
		cout<<"NIE"<<endl;
	
	//Algorytmy "przycinające" to m.in.: trim, trim_left, trim_left_copy, trim_left_if, trim_right
	string str3("    za duzo spacji    ");	cout<<str3<<endl;				// "    za duzo spacji    "
	string str4=trim_left_copy(str3);	cout<<str4<<endl;				// "za duzo spacji    "
	string str5=trim_right_copy(str3);	cout<<str5<<endl;				// "    za duzo spacji"
										cout<<str3<<endl;				// "    za duzo spacji    "
	trim(str3);							cout<<str3<<endl;				// "za duzo spacji"

	string tel_komorkowy("0555666777");
	//trim_left_if:
	trim_left_if(tel_komorkowy,is_any_of("0"));  cout<<tel_komorkowy<<endl;		//	"555666777"
	

	//Algorytmy do wyszukiwania to m.in.: find, find_first, ifind_first, find_last, find_nth, find_head, find_tail
	char text2[]="Ala ma kota";
	//find_last
    iterator_range<char*> rezultat=find_last(text2,"kot");
	to_upper(rezultat);					//rezultat = "Ala ma KOTa"

	//find_first:
	if(find_first(text2, "KOT"))
		cout<<"Tak, to prawda - Ala rzeczywiscie ma KOTa"<<endl;
	else 
		cout<<"Nie, Ala nie ma KOTa"<<endl;


	//Algorytmy zamieniające to m.in.: replace_range, replace_first, ireplace_first, replace_first_copy, replace_all, replace_tail
	string str6="Albert jest madry, Janek jest silny";
	//replace_first:
	replace_first(str6, "madry", "nieukiem");	cout<<str6<<endl;	// "Albert jest nieukiem, Janek jest silny"
	//replace_last:
    replace_last(str6, "jest", "nie jest");		cout<<str6<<endl;	// "Albert jest nieukiem, Janek nie jest silny"
	//erase_all:
    erase_all(str6, " ");						cout<<str6<<endl;	// "Albertjestnieukiem,Janekniejestsilny"

	return 0;
}
