From 8970c40ce9a9a4e5f582b48f69b77bd90d8e678e Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 4 Apr 2024 23:29:08 +0200 Subject: Add DLL API --- deimos/core/os.h | 16 ++++++++++++++-- deimos/core/os_win32.cpp | 16 ++++++++++++++++ deimos/core/std.h | 8 ++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) (limited to 'deimos') diff --git a/deimos/core/os.h b/deimos/core/os.h index 88b1c55..3cff6ba 100644 --- a/deimos/core/os.h +++ b/deimos/core/os.h @@ -17,20 +17,32 @@ 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 OsDll* Open(gsl::czstring) = 0; + virtual void* GetSymbol(OsDll*, gsl::czstring) = 0; +}; + class OsApi { public: static constexpr IdName kApiName{"deimos::OsApi"}; OsConsoleApi* console{}; + OsDllApi* dll{}; }; class OsConsoleWriter : public IWriter diff --git a/deimos/core/os_win32.cpp b/deimos/core/os_win32.cpp index ca608d8..1c6b664 100644 --- a/deimos/core/os_win32.cpp +++ b/deimos/core/os_win32.cpp @@ -35,14 +35,30 @@ public: } }; +class Win32OsDllApiImpl : public OsDllApi +{ +public: + OsDll* Open(gsl::czstring name) override + { + return std::bit_cast(::LoadLibraryA(name)); + } + + void* GetSymbol(OsDll* dll, gsl::czstring name) override + { + return std::bit_cast(::GetProcAddress(std::bit_cast(dll), name)); + } +}; + class Win32OsApiImpl : public OsApi { Win32OsConsoleApiImpl m_console_api; + Win32OsDllApiImpl m_dll_api; public: Win32OsApiImpl() { console = &m_console_api; + dll = &m_dll_api; } }; diff --git a/deimos/core/std.h b/deimos/core/std.h index 89d7da5..42bedbe 100644 --- a/deimos/core/std.h +++ b/deimos/core/std.h @@ -22,6 +22,7 @@ template concept signed_integral = integral && __is_signed(T); template concept unsigned_integral = integral && __is_unsigned(T); template constexpr bool is_trivially_destructible_v = __is_trivially_destructible(T); +template constexpr bool is_trivially_copyable_v = __is_trivially_copyable(T); template constexpr bool _is_same_helper = false; template constexpr bool _is_same_helper = true; @@ -78,6 +79,13 @@ constexpr T exchange(T& obj, U&& new_value) enum __attribute__((__may_alias__)) byte : uint8_t {}; static_assert(sizeof(byte) == 1, ""); +template +requires (sizeof(To) == sizeof(From)) && is_trivially_copyable_v && is_trivially_copyable_v +constexpr To bit_cast(const From& from) noexcept +{ + return __builtin_bit_cast(To, from); +} + template class initializer_list { -- cgit