diff options
-rw-r--r-- | deimos/core/BUILD | 1 | ||||
-rw-r--r-- | deimos/core/base.h | 7 | ||||
-rw-r--r-- | deimos/core/io.h | 21 | ||||
-rw-r--r-- | deimos/core/os.h | 19 | ||||
-rw-r--r-- | deimos/core/os_win32.cpp | 2 | ||||
-rw-r--r-- | main/main.cpp | 4 |
6 files changed, 51 insertions, 3 deletions
diff --git a/deimos/core/BUILD b/deimos/core/BUILD index d004aae..fd20796 100644 --- a/deimos/core/BUILD +++ b/deimos/core/BUILD @@ -7,6 +7,7 @@ cc_library( "gsl.h",
"hash.h",
"id_name.h",
+ "io.h",
"os.h",
"std.h",
],
diff --git a/deimos/core/base.h b/deimos/core/base.h index c3b0d87..8295053 100644 --- a/deimos/core/base.h +++ b/deimos/core/base.h @@ -85,5 +85,12 @@ public: constexpr int64_t size() const { return m_size; }
};
+template<typename T>
+inline Span<const std::byte> AsBytes(Span<T> span)
+{
+ // NOLINTNEXTLINE
+ return { reinterpret_cast<const std::byte*>(span.data()), span.size() * (int64_t)sizeof(T) };
+}
+
} // namespace deimos
diff --git a/deimos/core/io.h b/deimos/core/io.h new file mode 100644 index 0000000..90caadc --- /dev/null +++ b/deimos/core/io.h @@ -0,0 +1,21 @@ +#pragma once
+
+#include "deimos/core/base.h"
+
+namespace deimos
+{
+
+class IWriter
+{
+public:
+ IWriter() = default;
+
+ deimos_NO_COPY_MOVE(IWriter);
+
+ virtual ~IWriter() = default;
+
+ virtual void Write(Span<const std::byte>) = 0;
+};
+
+} // namespace deimos
+
diff --git a/deimos/core/os.h b/deimos/core/os.h index 95b662b..88b1c55 100644 --- a/deimos/core/os.h +++ b/deimos/core/os.h @@ -2,6 +2,7 @@ #include "deimos/core/base.h"
#include "deimos/core/id_name.h"
+#include "deimos/core/io.h"
namespace deimos
{
@@ -21,7 +22,7 @@ public: virtual ~OsConsoleApi() = default;
- virtual void Write(OsConsoleType, Span<const char> data) = 0;
+ virtual void Write(OsConsoleType, Span<const std::byte> data) = 0;
};
class OsApi
@@ -32,5 +33,21 @@ public: OsConsoleApi* console{};
};
+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<const std::byte> data) override
+ {
+ m_api->Write(m_type, data);
+ }
+};
+
} // namespace deimos
diff --git a/deimos/core/os_win32.cpp b/deimos/core/os_win32.cpp index fbc75c4..ca608d8 100644 --- a/deimos/core/os_win32.cpp +++ b/deimos/core/os_win32.cpp @@ -29,7 +29,7 @@ public: m_stderr{::GetStdHandle(STD_ERROR_HANDLE)}
{}
- void Write(OsConsoleType type, Span<const char> data) override
+ void Write(OsConsoleType type, Span<const std::byte> data) override
{
::WriteConsoleA(Handle(type), data.data(), (DWORD)data.size(), nullptr, nullptr);
}
diff --git a/main/main.cpp b/main/main.cpp index cd64721..4d3e829 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -5,7 +5,9 @@ int main(int /* argc */, char* /* argv */[]) {
auto* api_registry = deimos::InitializeGlobalApiRegistry();
auto* os_api = api_registry->Get<deimos::OsApi>();
- os_api->console->Write(deimos::OsConsoleType::kStdOut, {"Hello, world!\n", 14});
+
+ deimos::OsConsoleWriter writer(os_api->console, deimos::OsConsoleType::kStdOut);
+ writer.Write(deimos::AsBytes(deimos::Span<const char>({"Hello, world!\n", 14})));
return 0;
}
|