#include "serializertext.h"

SerializerText::SerializerText(FILE *fhFile, bool bLoading):
	Serializer(bLoading),
	fhFile(fhFile),
	bCloseFile(false)
{	
}

SerializerText::SerializerText(const char *sFileName, bool bLoading):
	Serializer(bLoading),
	bCloseFile(true)
{
	if (bLoading)
	{
		fhFile = fopen(sFileName, "rt");
	}
	else
	{
		fhFile = fopen(sFileName, "wt");
	}
}

SerializerText::~SerializerText()
{
	close();
}

void SerializerText::close()
{
	if (fhFile != NULL)
	{
		fclose(fhFile);
		fhFile = NULL;
	}
}

void SerializerText::write(const void * pData, int32_t nSize)
{
	fwrite(pData, nSize, 1, fhFile);
	fprintf(fhFile, "\n");
}

void SerializerText::read(void * pData, int32_t nSize)
{
	fread(pData, nSize, 1, fhFile);
	fgetc(fhFile);
}

Serializer &SerializerText::operator<<(bool p)
{
	fprintf(fhFile, "%hhd\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(int8_t p)
{
	fprintf(fhFile, "%hhd\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(int16_t p)
{
	fprintf(fhFile, "%hd\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(int32_t p)
{
	fprintf(fhFile, "%d\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(int64_t p)
{
	fprintf(fhFile, "%lld\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(uint8_t p)
{
	fprintf(fhFile, "%hhu\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(uint16_t p)
{
	fprintf(fhFile, "%hu\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(uint32_t p)
{
	fprintf(fhFile, "%u\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(uint64_t p)
{
	fprintf(fhFile, "%llu\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(float p)
{
	fprintf(fhFile, "%f\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(double p)
{
	fprintf(fhFile, "%f\n", p);
	return *this;
}
Serializer &SerializerText::operator<<(long double p)
{
	fprintf(fhFile, "%Lf\n", p);
	return *this;
}

Serializer &SerializerText::operator>>(bool &p)
{
	fscanf(fhFile, "%hhd\n", ((signed char *)&p));
	return *this;
}
Serializer &SerializerText::operator>>(int8_t &p)
{
	fscanf(fhFile, "%hhd\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(int16_t &p)
{
	fscanf(fhFile, "%hd\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(int32_t &p)
{
	fscanf(fhFile, "%d\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(int64_t &p)
{
	fscanf(fhFile, "%lld\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(uint8_t &p)
{
	fscanf(fhFile, "%hhu\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(uint16_t &p)
{
	fscanf(fhFile, "%hu\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(uint32_t &p)
{
	fscanf(fhFile, "%u\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(uint64_t &p)
{
	fscanf(fhFile, "%llu\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(float &p)
{
	fscanf(fhFile, "%f\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(double &p)
{
	fscanf(fhFile, "%lf\n", &p);
	return *this;
}
Serializer &SerializerText::operator>>(long double &p)
{
	fscanf(fhFile, "%Lf\n", &p);
	return *this;
}