#pragma once #include "deimos/core/base.h" #include "deimos/core/id_name.h" #include "deimos/core/status.h" #include "deimos/core/io.h" namespace deimos { enum class OsConsoleType : uint8_t { kStdOut, kStdErr, }; class OsConsoleApi { public: OsConsoleApi() = default; deimos_NO_COPY_MOVE(OsConsoleApi); virtual ~OsConsoleApi() = default; virtual void Write(OsConsoleType, Span data) = 0; }; struct OsDll; class OsDllApi { public: OsDllApi() = default; deimos_NO_COPY_MOVE(OsDllApi); virtual ~OsDllApi() = default; virtual gsl::owner Open(gsl::czstring) = 0; virtual void* GetSymbol(OsDll*, gsl::czstring) = 0; }; class OsVirtualMemoryApi { public: OsVirtualMemoryApi() = default; deimos_NO_COPY_MOVE(OsVirtualMemoryApi); virtual ~OsVirtualMemoryApi() = default; virtual gsl::owner Map(int64_t size) = 0; virtual void Unmap(gsl::owner) = 0; virtual gsl::owner Reserve(int64_t size) = 0; virtual void Commit(void* ptr, int64_t size) = 0; }; struct OsWindow; class OsWindowApi { public: OsWindowApi() = default; deimos_NO_COPY_MOVE(OsWindowApi); virtual ~OsWindowApi() = default; virtual StatusOr> Create(gsl::czstring title, int32_t width, int32_t height) = 0; virtual void Update(OsWindow*) = 0; virtual bool QuitRequested(const OsWindow*) = 0; }; class OsApi { public: static constexpr IdName kApiName{"deimos::OsApi"}; OsConsoleApi* console{}; OsDllApi* dll{}; OsVirtualMemoryApi* virtual_memory{}; OsWindowApi* window{}; }; class OsConsoleWriter : public IWriter { OsConsoleApi* m_api; OsConsoleType m_type; public: constexpr OsConsoleWriter(OsConsoleApi* api, OsConsoleType type) : m_api{api}, m_type{type} {} constexpr void Write(Span data) override { m_api->Write(m_type, data); } }; } // namespace deimos