//Adrian Wiœniewski ISI sem 6
#include <sstream>
#include <iostream>
using namespace std;

/*
	Forward declarations
*/
// test funcionality
void TestFormatting();
void TestParsing();
void TestConversion();

int main()
{
	// Formatting test
	cout << "== Formatting" << endl;
	TestFormatting();

	// Parsing test
	cout << "== Parsing" << endl;
	TestParsing();

	// Conversion test
	cout << "== Conversion" << endl;
	TestConversion();

	return 0;
}

void TestParsing()
{
	string	some_string;
	int		some_number;
	float	some_float;

	// C style
	/* 
	char buffer[BUFFER_SIZE]; // contents: "some_text 9 5.56"
	sscanf(buffer, "%s %d %f", some_buffer, &some_nuber, &some_float);
	*/

	// parse text containing string, integer and float
	istringstream isstream("some_text 9 5.56");
	isstream >> some_string >> some_number >> some_float;

	if(isstream.fail())
	{
		// handle errors
		cout << "Error in parsing" << endl;
	}
	else
	{
		// print results
		cout	<< "Parsed items: " << endl 
				<< some_string		<< endl 
				<< some_number		<< endl 
				<< some_float		<< endl;
	}
}

void TestFormatting()
{
	string some_string = "some_string";

	// C style
	/* 
	char buffer[BUFFER_SIZE];
	sprintf(buffer, "this is some text with integers %d, floats %f, hexes %x and strings %s\n", 
					9, 
					5.34,
					0xF6,
					some_string.c_str());
	*/

	// create string containing some text with integers, floats and strings
	ostringstream osstream;
	osstream	<< "this is some text with integers " 
				<< 9 
				<< ", floats " 
				<< 5.34 
				<< ", hexes " << hex << 0xF6
				<< " and strings " 
				<< some_string << endl;

	// print results
	cout << osstream.str();
}

void TestConversion()
{
	int		some_number;

	// C style
	/*
	some_number = atoi(buffer); // no error handling
	some_string = itoa(9);		// itoa is not standard
	*/

	// convert string to int with error handling and print it
	istringstream isstream("123");
	isstream >> some_number;

	if(isstream.fail())
	{
		// handle errors
		cout << "Error while converting string to int" << endl;
	}
	else
	{
		// print results
		cout << "Converted string to integer: " << some_number << endl;
	}

	// convert int to string and print it
	ostringstream osstream;
	osstream << 9;
	cout << "Converted integer to string: "<< osstream.str() << endl;
}