#include "lib_datetimeparser.h"

DateTimeParserLibrary* datetimeparser_lib_cache = nullptr;

static DateTimeParserLibrary* CheckDateTimeParserLib(Int32 offset)
{
	return (DateTimeParserLibrary*)CheckLib(C4D_DATETIMEPARSER_LIBRARY_ID, offset, (C4DLibrary**)&datetimeparser_lib_cache);
}

DateTimeParser *DateTimeParser::Alloc(void)
{
	DateTimeParserLibrary *lib = CheckDateTimeParserLib(LIBOFFSET(DateTimeParserLibrary,Alloc));
	if (!lib || !lib->Alloc) return nullptr;
	return (DateTimeParser*)lib->Alloc();
}

void DateTimeParser::Free(DateTimeParser *&data)
{
	DateTimeParserLibrary *lib = CheckDateTimeParserLib(LIBOFFSET(DateTimeParserLibrary,Free));
	if (!lib || !lib->Free) return;
	iDateTimeParser *tmp = (iDateTimeParser*)data;
	lib->Free(tmp);
}

Bool DateTimeParser::ParseString(const String &str, DateTime &result, DATETIMEPARSERMODE mode)
{
	DateTimeParserLibrary *lib = CheckDateTimeParserLib(LIBOFFSET(DateTimeParserLibrary, ParseString));
	if (!lib || !lib->ParseString) return false;
	return (((iDateTimeParser*)this)->*(lib->ParseString))(str, result, mode);
}

String DateTimeParser::MakeString(const DateTime &dt, DATETIMEPARSERMODE mode)
{
	DateTimeParserLibrary *lib = CheckDateTimeParserLib(LIBOFFSET(DateTimeParserLibrary, MakeString));
	if (!lib || !lib->MakeString) return String();
	return (((iDateTimeParser*)this)->*(lib->MakeString))(dt, mode);
}

void DateTimeParser::SetFormatString(const String &sFormat, DATETIMEPARSERMODE mode)
{
	DateTimeParserLibrary *lib = CheckDateTimeParserLib(LIBOFFSET(DateTimeParserLibrary, SetFormatString));
	if (!lib || !lib->SetFormatString) return;
	return (((iDateTimeParser*)this)->*(lib->SetFormatString))(sFormat, mode);
}

String DateTimeParser::GetFormatString(DATETIMEPARSERMODE mode)
{
	DateTimeParserLibrary *lib = CheckDateTimeParserLib(LIBOFFSET(DateTimeParserLibrary, GetFormatString));
	if (!lib || !lib->GetFormatString) return String();
	return (((iDateTimeParser*)this)->*(lib->GetFormatString))(mode);
}
