summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-04-04 16:08:55 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-04-04 16:08:55 +0200
commit24bb0db16d2fcd94a5919f616dd9a50b3a131752 (patch)
tree80850a5bb79d334cc66ab2427daea238d51df1ea
parentf878f9e4c42f02585e57bb35c3aabf9f69ee3834 (diff)
Add io Writer
-rw-r--r--deimos/core/BUILD1
-rw-r--r--deimos/core/base.h7
-rw-r--r--deimos/core/io.h21
-rw-r--r--deimos/core/os.h19
-rw-r--r--deimos/core/os_win32.cpp2
-rw-r--r--main/main.cpp4
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;
}