namespace EE::System

namespace System {

// typedefs

typedef tColor<Float> ColorAf;
typedef tColor<Float> Colorf;
typedef Color ColorA;
typedef std::map<std::string, FileInfo> FileInfoMap;
typedef std::vector<FileInfo> FileInfoList;
typedef TScopedBuffer<Uint8> ScopedBuffer;

// enums

enum LogLevel;

// classes

class AtomicBoolScopedOp;
class Base64;
class BitOp;
class BoolScopedOp;
class BoolScopedOpOptional;
class Clock;
class Color;
class Compression;
class Condition;
class ConditionalLock;

template <class T>
class Container;

class DirectoryPack;
class FileInfo;
class FileSystem;
class FunctionString;
class IOStream;
class IOStreamDeflate;
class IOStreamFile;
class IOStreamInflate;
class IOStreamMemory;
class IOStreamPak;
class IOStreamString;
class IOStreamZip;
class IniFile;
class Lock;
class Log;
class LogReaderInterface;
class LuaPattern;
class LuaPatternStorage;
class MD5;
class Mutex;
class Pack;
class PackManager;
class Pak;
class PatternMatcher;
class Process;
class RC4;
class RGB;
class RectColors;
class RegEx;
class RegExCache;
class ResourceLoader;

template <class T>
class ResourceManager;

template <class T>
class ResourceManagerMulti;

class ScopedOp;
class ScopedOpOptional;

template <typename T>
class Singleton;

class Sys;

template <typename T>
class TScopedBuffer;

class Thread;
class ThreadLocal;

template <typename T>
class ThreadLocalPtr;

class ThreadPool;
class Time;
class Translator;
class VFS;
class VirtualFileSystem;
class Zip;

template <typename T>
class tColor;

template <typename T>
class tRGB;

// global functions

constexpr Time Minutes(double amount);
constexpr Time Seconds(double amount);
constexpr Time Milliseconds(double amount);
constexpr Time Microseconds(Int64 amount);
constexpr bool operator==(Time left, Time right);
constexpr bool operator!=(Time left, Time right);
constexpr bool operator<(Time left, Time right);
constexpr bool operator>(Time left, Time right);
constexpr bool operator<=(Time left, Time right);
constexpr bool operator>=(Time left, Time right);
constexpr Time operator-(Time right);
constexpr Time operator+(Time left, Time right);
constexpr Time& operator+=(Time& left, Time right);
constexpr Time operator-(Time left, Time right);
constexpr Time& operator-=(Time& left, Time right);
constexpr Time operator*(Time left, Time right);
constexpr Time operator*(Time left, double right);
constexpr Time operator*(double left, Time right);
constexpr Time operator*(Time left, Int64 right);
constexpr Time operator*(Int64 left, Time right);
constexpr Time& operator*=(Time& left, Time right);
constexpr Time& operator*=(Time& left, double right);
constexpr Time& operator*=(Time& left, Int64 right);
constexpr Time operator/(Time left, Time right);
constexpr Time operator/(Time left, double right);
constexpr Time operator/(Time left, Int64 right);
constexpr Time& operator/=(Time& left, Time right);
constexpr Time& operator/=(Time& left, Int64 right);
constexpr Time operator%(Time left, Time right);
constexpr Time& operator%=(Time& left, Time right);

} // namespace System