#ifndef __LEGACY_H
#define __LEGACY_H

#ifdef __LEGACY_API

#include "vector4.h"
#include "matrix4.h"

typedef Char			CHAR;
typedef UChar			UCHAR;
typedef Int16			SWORD;
typedef UInt16		UWORD;

typedef Int32			LONG;
typedef UInt32		ULONG;

typedef Int64			LLONG;
typedef UInt64		LULONG;
typedef Int				VLONG;
typedef UInt			VULONG;

typedef Float			Real;
typedef Float32		SReal;
typedef Float64		LReal;

typedef Vector32	SVector;
typedef Vector64	LVector;

typedef Matrix32	SMatrix;
typedef Matrix64	LMatrix;

typedef Vector4d32	SVector4;
typedef Vector4d64	LVector4;
typedef Vector4d		Vector4;

typedef Matrix4d32	SMatrix4;
typedef Matrix4d64	LMatrix4;
typedef Matrix4d		Matrix4;

#if defined __MAC
	inline Float32 Ln10(Float32 val) { return log10f(val); }
	inline Float64 Ln10(Float64 val) { return log10(val); }

	inline Float32 Ld(Float32 val) { return log2f(val); }
	inline Float64 Ld(Float64 val) { return log2(val); }
#else
	inline Float32 Ln10(Float32 val) { return log10(val); }
	inline Float64 Ln10(Float64 val) { return log10(val); }

	inline Float32 Ld(Float32 val) { return log(val) * 1.4426950408889634073599246810019f; }
	inline Float64 Ld(Float64 val) { return log(val) * 1.4426950408889634073599246810019; }
#endif

#undef MAXLONG // windows header have MINLONG defines as 0x80000000
#undef MINLONG // windows header have MINLONG defines as 0x80000000

#define MAXLONGl					0x7fffffff
#define MAXLONGf					2147483520.0f		// 0x7FFFFF80 - rounding MAXLONG to Real results in 0x80000000
#define MAXLONGd					Float64(MAXLONGl)
#define MINLONGl					(-0x7fffffff)		// explicitly not 0x80000000
#define MINLONGf					-2147483520.0f	// -0x7FFFFF80 - rounding MINLONG to Real results in 0x80000000
#define MINLONGd					Float64(MINLONGl)

#ifndef MAXULONG
	#define MAXULONG				0xffffffff
#endif
#ifndef MAXSWORD
	#define MAXSWORD				32767L
#endif
#ifndef MAXUWORD
	#define MAXUWORD				65535L
#endif

#define MAXREALs					( 9.0e18f)
#define MINREALs					(-9.0e18f)

#define MAXREALr					( 1.0e308)
#define MINREALr					(-1.0e308)

#define MAXREALl					( 1.0e308)
#define MINREALl					(-1.0e308)

#define SCO	(Float32)
#define RCO	(Float)
#define LCO (Float64)

#define pi			PI
#define piinv		PI_INV
#define pi2			PI2
#define pi2inv	PI2_INV
#define pi05		PI05
#define pi05inv (PI_INV * 2.0)

#define FtoL(x)	Int32(x)

inline Int32 SAFELONG(Float32 x) { return SAFEINT32(x); }
inline Int32 SAFELONG(Float64 x) { return SAFEINT32(x); }

inline Int32 LFloor(Float32 r) { return Int32(Floor(r)); }
inline Int32 LCeil(Float32 r)  { return Int32(Ceil(r));  }
inline Int32 LFloor(Float64 r) { return Int32(Floor(r)); }
inline Int32 LCeil(Float64 r)  { return Int32(Ceil(r));  }

inline Float32 FCut01(Float32 a) { return Clamp01(a); }
inline Float64 FCut01(Float64 a) { return Clamp01(a); }

#define c4d_misc maxon

#define LMatrixToHPB Matrix64ToHPB

#define SetLong				SetInt32
#define SetULong			SetUInt32
#define SetLLong			SetInt64
#define SetUInt64			SetUInt64
#define SetReal				SetFloat

#define GetLong				GetInt32
#define GetULong			GetUInt32
#define GetLLong			GetInt64
#define GetUInt64			GetUInt64
#define GetReal				GetFloat

#define ReadWord			ReadInt16
#define ReadUWord			ReadUInt16
#define ReadLong			ReadInt32
#define ReadULong			ReadUInt32
#define ReadLLong			ReadInt64
#define ReadLULong		ReadUInt64
#define ReadReal			ReadFloat
#define ReadSReal			ReadFloat32
#define ReadLReal			ReadFloat64
#define ReadSVector		ReadVector32
#define ReadLVector		ReadVector64
#define ReadSMatrix		ReadMatrix32
#define ReadLMatrix		ReadMatrix64

#define WriteWord			WriteInt16
#define WriteUWord		WriteUInt16
#define WriteLong			WriteInt32
#define WriteULong		WriteUInt32
#define WriteLLong		WriteInt64
#define WriteLULong		WriteUInt64
#define WriteReal			WriteFloat
#define WriteSReal		WriteFloat32
#define WriteLReal		WriteFloat64
#define WriteSVector	WriteVector32
#define WriteLVector	WriteVector64
#define WriteSMatrix	WriteMatrix32
#define WriteLMatrix	WriteMatrix64

#define GetLengthSquared GetSquaredLength
#define GeBoom CriticalStop
#define GeAssert DebugAssert
#define GeBreak CriticalStop

#define MemoryPool DeprecatedMemoryPool
#define ToLong ParseToInt32
#define ToReal ParseToFloat
#define FORMAT_LONG FORMAT_INT
#define FORMAT_REAL FORMAT_FLOAT
#define HYPERFILEVALUE_WORD 	HYPERFILEVALUE_INT16
#define HYPERFILEVALUE_UWORD 	HYPERFILEVALUE_UINT16
#define HYPERFILEVALUE_LONG 	HYPERFILEVALUE_INT32
#define HYPERFILEVALUE_ULONG 	HYPERFILEVALUE_UINT32
#define HYPERFILEVALUE_LLONG 	HYPERFILEVALUE_INT64
#define HYPERFILEVALUE_LULONG 	HYPERFILEVALUE_UINT64
#define HYPERFILEVALUE_REAL 	HYPERFILEVALUE_FLOAT
#define HYPERFILEVALUE_LREAL 	HYPERFILEVALUE_FLOAT64
#define HYPERFILEVALUE_LVECTOR 	HYPERFILEVALUE_VECTOR64
#define HYPERFILEVALUE_LMATRIX 	HYPERFILEVALUE_MATRIX64
#define HYPERFILEVALUE_SVECTOR 	HYPERFILEVALUE_VECTOR32
#define HYPERFILEVALUE_SMATRIX 	HYPERFILEVALUE_MATRIX32
#define HYPERFILEVALUE_SREAL 	HYPERFILEVALUE_FLOAT32
#define LV_RES_LONG 	LV_RES_INT
#define DESC_UNIT_LONG 	DESC_UNIT_INT
#define DESC_UNIT_REAL 	DESC_UNIT_FLOAT
#define CGetLong 	CGetInt
#define CGetReal 	CGetFloat
#define SetOMLong 	SetOMInt
#define GetOMLong 	GetOMInt
#define SetOMReal 	SetOMFloat
#define GetOMReal 	GetOMFloat
#define VectorEqual(a,b) (a).IsEqual(b)
#define CutColor(a) (a).Clamp01()
#define VectorSum(a) (a).GetSum()
#define VectorGray(a) (a).GetAverage()
#define VectorAngle GetAngle
#define VectorMin(a) (a).GetMin()
#define VectorMax(a) (a).GetMax()
#define Mix Blend
#define Step StepEx
#define FCut ClampValue
#define Ln10 Log10
#define Ld Log2
#define FCut01 Clamp01

#define C4D_MISC_FORWARD_PARAMETER(T) T&&
#define C4D_MISC_MOVE_TYPE(T)					T&&
#define C4D_MISC_MOVE_BASE_CLASS(src, ...)	__VA_ARGS__(std::move(src))

#endif	// __LEGACY_API

#endif	// __LEGACY_H
