summaryrefslogtreecommitdiff
path: root/deimos/core/os_win32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deimos/core/os_win32.cpp')
-rw-r--r--deimos/core/os_win32.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/deimos/core/os_win32.cpp b/deimos/core/os_win32.cpp
new file mode 100644
index 0000000..07d3247
--- /dev/null
+++ b/deimos/core/os_win32.cpp
@@ -0,0 +1,57 @@
+#include "deimos/core/os.h"
+#include "deimos/core/api_registry.h"
+#include "deimos/core/allocator.h"
+
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+
+namespace deimos
+{
+
+class Win32OsConsoleApiImpl : public OsConsoleApi
+{
+ HANDLE m_stdout;
+ HANDLE m_stderr;
+
+ constexpr HANDLE Handle(OsConsoleType type) const
+ {
+ switch (type)
+ {
+ using enum OsConsoleType;
+ case kStdOut: return m_stdout;
+ case kStdErr: return m_stderr;
+ }
+ }
+
+public:
+ Win32OsConsoleApiImpl() :
+ m_stdout{::GetStdHandle(STD_OUTPUT_HANDLE)},
+ m_stderr{::GetStdHandle(STD_ERROR_HANDLE)}
+ {}
+
+ void Write(OsConsoleType type, const char* data, int64 length) override
+ {
+ ::WriteConsoleA(Handle(type), data, (DWORD)length, nullptr, nullptr);
+ }
+};
+
+class Win32OsApiImpl : public OsApi
+{
+ Win32OsConsoleApiImpl m_console_api;
+
+public:
+ Win32OsApiImpl()
+ {
+ console = &m_console_api;
+ }
+};
+
+void RegisterOsApi(ApiRegistry* api_registry)
+{
+ auto* allocator_api = api_registry->Get<AllocatorApi>();
+ auto* os_api = allocator_api->system->New<Win32OsApiImpl>();
+ api_registry->Set(os_api);
+}
+
+} // namespace deimos
+