diff options
Diffstat (limited to 'deimos')
-rw-r--r-- | deimos/core/os.h | 16 | ||||
-rw-r--r-- | deimos/core/os_win32.cpp | 16 | ||||
-rw-r--r-- | deimos/core/std.h | 8 |
3 files changed, 38 insertions, 2 deletions
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<const std::byte> 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<OsDll*>(::LoadLibraryA(name));
+ }
+
+ void* GetSymbol(OsDll* dll, gsl::czstring name) override
+ {
+ return std::bit_cast<void*>(::GetProcAddress(std::bit_cast<HMODULE>(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<typename T> concept signed_integral = integral<T> && __is_signed(T); template<typename T> concept unsigned_integral = integral<T> && __is_unsigned(T);
template<typename T> constexpr bool is_trivially_destructible_v = __is_trivially_destructible(T);
+template<typename T> constexpr bool is_trivially_copyable_v = __is_trivially_copyable(T);
template<typename U, typename V> constexpr bool _is_same_helper = false;
template<typename T> constexpr bool _is_same_helper<T, T> = 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<typename To, typename From>
+requires (sizeof(To) == sizeof(From)) && is_trivially_copyable_v<To> && is_trivially_copyable_v<From>
+constexpr To bit_cast(const From& from) noexcept
+{
+ return __builtin_bit_cast(To, from);
+}
+
template<typename T>
class initializer_list
{
|