#pragma once

#include "ehs/system/OS.h"
#include "ehs/system/Architecture.h"

#define EHS_MAX_PATH 0x104
#define EHS_UINT_8_MAX 0xFF
#define EHS_SINT_8_MAX 0x7F
#define EHS_SINT_8_MIN 0x80
#define EHS_UINT_16_MAX 0xFFFF
#define EHS_SINT_16_MAX 0x7FFF
#define EHS_SINT_16_MIN 0x8000
#define EHS_UINT_24_MAX 0xFFFFFF
#define EHS_SINT_24_MAX 0x7FFFFF
#define EHS_SINT_24_MIN 0x800000
#define EHS_UINT_32_MAX 0xFFFFFFFF
#define EHS_SINT_32_MAX 0x7FFFFFFF
#define EHS_SINT_32_MIN 0x80000000
#define EHS_UINT_64_MAX 0xFFFFFFFFFFFFFFFF
#define EHS_SINT_64_MAX 0x7FFFFFFFFFFFFFFF
#define EHS_SINT_64_MIN 0x8000000000000000
#define EHS_FLOAT_MAX 3.40282e+038f
#define EHS_FLOAT_MIN 1.17549e-038f
#define EHS_DOUBLE_MAX 1.79769e+308
#define EHS_DOUBLE_MIN 2.22507e-308
#define EHS_LDOUBLE_MAX 1.79769e+308
#define EHS_LDOUBLE_MIN 2.22507e-308

#if defined(EHS_64_BIT)
	#define EHS_SIZE_MAX 0xFFFFFFFFFFFFFFFF
#elif defined(EHS_32_BIT)
	#define EHS_SIZE_MAX 0xFFFFFFFF
#endif

#define EHS_INFINITE EHS_UINT_32_MAX

namespace ehs
{
	typedef unsigned char Byte;
	typedef char Char_8;
	typedef wchar_t Char_16;
	typedef char32_t Char_32;
	typedef unsigned char UInt_8;
	typedef signed char SInt_8;
	typedef char Int_8;
	typedef unsigned short UInt_16;
	typedef signed short SInt_16;
	typedef short Int_16;
	typedef unsigned int UInt_32;
	typedef signed int SInt_32;
	typedef int Int_32;

	#if defined(EHS_OS_WINDOWS)
		typedef unsigned long long UInt_64;
		typedef signed long long SInt_64;
		typedef long long Int_64;
	#elif defined(EHS_OS_LINUX)
		typedef unsigned long UInt_64;
		typedef signed long SInt_64;
		typedef long Int_64;
	#endif

	#if defined(EHS_64_BIT)
		typedef UInt_64 Size;
		typedef SInt_64 SSize;
	#elif defined(EHS_32_BIT)
		typedef UInt_32 Size;
		typedef SInt_32 SSize;
	#endif
}