namespace EE

namespace EE {

// namespaces

namespace EE::Audio;
namespace EE::Graphics;
namespace EE::Math;
    namespace EE::Math::easing;
namespace EE::Network;
    namespace EE::Network::SSL;
namespace EE::Scene;
    namespace EE::Scene::Actions;
namespace EE::System;
namespace EE::UI;
    namespace EE::UI::Abstract;
    namespace EE::UI::CSS;
    namespace EE::UI::Doc;
    namespace EE::UI::Models;
    namespace EE::UI::Tools;
namespace EE::Window;

// typedefs

typedef float Float;
typedef signed char Int8;
typedef unsigned char Uint8;
typedef signed short Int16;
typedef unsigned short Uint16;
typedef signed int Int32;
typedef unsigned int Uint32;
typedef signed long long Int64;
typedef unsigned long long Uint64;
typedef Int32 IntPtr;
typedef Uint32 UintPtr;
typedef robin_hood::unordered_flat_map<Key, Value> UnorderedMap;
typedef robin_hood::unordered_flat_set<Key> UnorderedSet;
typedef std::unordered_map<void*, AllocatedPointer> AllocatedPointerMap;
typedef AllocatedPointerMap::iterator AllocatedPointerMapIt;
typedef Utf<8> Utf8;
typedef Utf<16> Utf16;
typedef Utf<32> Utf32;
typedef long ios_size;

// structs

template <typename T>
struct FormatArg;

template <>
struct FormatArg<std::string>;

template <>
struct FormatArg<std::string_view>;

// classes

class AllocatedPointer;
class MemoryManager;
class NonCopyable;
class String;

template <>
class Utf<32>;

template <>
class Utf<16>;

template <unsigned int N>
class Utf;

template <>
class Utf<8>;

class Version;

// global variables

EE_API bool PrintDebugInLog;

// global functions

template <typename T>
T eemax(T a, T b);

template <typename T>
T eemin(T a, T b);

template <typename T>
T eeabs(T n);

template <typename T>
T eeclamp(T val, T min, T max);

template <typename T>
void eeclamp(T* val, T min, T max);

void EE_API eePRINT(const char* format, ...);
void EE_API eePRINTL(const char* format, ...);
void EE_API eePRINTC(unsigned int cond, const char* format, ...);

} // namespace EE