#include "Common/Base.hpp"
#include <iostream>
#include "Common/Profiler.hpp"

void FunkcjaNajlepsza(std::string *Out, const std::string &s1, const std::string &s2, const std::string &s3)
{
	*Out  = s1;
	*Out += s2;
	*Out += s3;
}

std::string FunkcjaGorsza1(const std::string &s1, const std::string &s2, const std::string &s3)
{
	return s1 + s2 + s3;
}

std::string FunkcjaGorsza2(const std::string &s1, const std::string &s2, const std::string &s3)
{
	std::string R;
	R  = s1;
	R += s2;
	R += s3;
	return R;
}

int main(int argc, char **argv)
{
	const uint C = 100;
	std::string S1[C], S2[C], S3[C], R1[C], R2[C], R3[C];

	for (uint i = 0; i < C; i++)
	{
		S1[i] = "A";
		S2[i] = "la ma ";
		S3[i] = "kota.";
	}

	for (uint j = 0; j < 100; j++)
	{
		{
			PROFILE_GUARD("FunkcjaNajlepsza");
			for (uint i = 0; i < C; i++)
				FunkcjaNajlepsza(&R1[i], S1[i], S2[i], S3[i]);
		}

		{
			PROFILE_GUARD("FunkcjaGorsza1");
			for (uint i = 0; i < C; i++)
				R2[i] = FunkcjaGorsza1(S1[i], S2[i], S3[i]);
		}

		{
			PROFILE_GUARD("FunkcjaGorsza2");
			for (uint i = 0; i < C; i++)
				R3[i] = FunkcjaGorsza2(S1[i], S2[i], S3[i]);
		}
	}

	std::string R;
	common::g_Profiler.FormatString(&R);
	std::cout << R << std::endl;
}

/*
Wyniki:

DEBUG:
- FunkcjaNajlepsza : 0.352798 ms
- FunkcjaGorsza1   : 1.29323 ms
- FunkcjaGorsza2   : 0.835834 ms

RELEASE:
- FunkcjaNajlepsza : 0.0252207 ms
- FunkcjaGorsza1   : 0.072499 ms
- FunkcjaGorsza2   : 0.0378688 ms
*/

