diff --git a/LibConf b/LibConf new file mode 100644 index 0000000..7bea541 --- /dev/null +++ b/LibConf @@ -0,0 +1,29 @@ + +Import('env') + +mijin_sources = Split(""" + source/mijin/async/coroutine.cpp + source/mijin/debug/symbol_info.cpp + source/mijin/io/stream.cpp + source/mijin/memory/data_pool.cpp + source/mijin/util/os.cpp + source/mijin/types/name.cpp + source/mijin/virtual_filesystem/filesystem.cpp + source/mijin/virtual_filesystem/stacked.cpp +""") + +env.UnityStaticLibrary( + target = env['LIB_DIR'] + '/mijin_sekiei', + source = mijin_sources +) + +LIB_CONFIG = { + 'CPPPATH': [env.Dir('source')], + 'CPPDEFINES': [], + 'LIBS': ['mijin_sekiei'] +} + +if env['BUILD_TYPE'] == 'debug': + LIB_CONFIG['CPPDEFINES'].extend(['MIJIN_DEBUG=1', 'MIJIN_CHECKED_ITERATORS=1']) + +Return('LIB_CONFIG') diff --git a/source/mijin/SConscript b/source/mijin/SConscript deleted file mode 100644 index 2e28cdd..0000000 --- a/source/mijin/SConscript +++ /dev/null @@ -1,24 +0,0 @@ - -Import('env') - -mijin_sources = Split(""" - async/coroutine.cpp - debug/symbol_info.cpp - io/stream.cpp - memory/data_pool.cpp - util/os.cpp - types/name.cpp - virtual_filesystem/filesystem.cpp - virtual_filesystem/stacked.cpp -""") - -env.UnityStaticLibrary( - target = env['LIB_DIR'] + '/mijin_sekiei', - source = mijin_sources -) - -LIB_CONFIG = { - 'LIBS': ['mijin_sekiei'] -} - -Return('LIB_CONFIG') diff --git a/source/mijin/async/signal.hpp b/source/mijin/async/signal.hpp index 3602609..d5750c0 100644 --- a/source/mijin/async/signal.hpp +++ b/source/mijin/async/signal.hpp @@ -110,7 +110,7 @@ inline void Signal::emit(TArgs&&... args) noexcept // invoke all handlers for (RegisteredHandler& handler : handlers_) { - handler.callable(forward(args)...); + handler.callable(std::forward(args)...); } // remove any oneshot diff --git a/source/mijin/container/boxed_object.hpp b/source/mijin/container/boxed_object.hpp index a0a44b3..2adc357 100644 --- a/source/mijin/container/boxed_object.hpp +++ b/source/mijin/container/boxed_object.hpp @@ -52,7 +52,7 @@ public: #if MIJIN_BOXED_OBJECT_DEBUG ~BoxedObject() { - MIJIN_ASSERT(!constructed, "BoxedObject::~BoxedObject(): Object has not been destroy prior to destructor!") + MIJIN_ASSERT(!constructed, "BoxedObject::~BoxedObject(): Object has not been destroyed prior to destructor!") } #endif @@ -179,7 +179,7 @@ template T& BoxedObjectIterator::operator*() const { #if MIJIN_CHECKED_ITERATORS - MIJIN_ASSERT(box_ >= start_ && box < end_, "BoxedObjectIterator::operator->(): Attempt to dereference out-of-range iterator."); + MIJIN_ASSERT(box_ >= start_ && box_ < end_, "BoxedObjectIterator::operator->(): Attempt to dereference out-of-range iterator."); #endif return box_->get(); } diff --git a/source/mijin/debug/assert.hpp b/source/mijin/debug/assert.hpp index e5349d2..6dfcf56 100644 --- a/source/mijin/debug/assert.hpp +++ b/source/mijin/debug/assert.hpp @@ -6,13 +6,7 @@ #include #include - -namespace mijin -{ - -// -// public defines -// +#include #if MIJIN_DEBUG #ifdef _WIN32 @@ -25,23 +19,33 @@ extern "C" __declspec(dllimport) void __stdcall DebugBreak(); #define MIJIN_TRAP() raise(SIGTRAP) #define MIJIN_FUNC() "" // TODO: __PRETTY_FUNCTION__ is not working for some reason -.- #endif // !_WIN32 +#endif // MIJIN_DEBUG -#define MIJIN_DO_RAISE_ERROR(msg, func, file, line) \ -switch (mijin::handleError(msg, func, file, line)) \ -{ \ - case mijin::ErrorHandling::CONTINUE: \ - break; \ - case mijin::ErrorHandling::TRAP: \ - MIJIN_TRAP(); \ - [[fallthrough]]; \ - default: /* ABORT */ \ - std::abort(); \ +namespace mijin +{ + +// +// public defines +// + +#if MIJIN_DEBUG + +#define MIJIN_DO_RAISE_ERROR(msg, source_loc) \ +switch (mijin::handleError(msg, source_loc)) \ +{ \ + case mijin::ErrorHandling::CONTINUE: \ + break; \ + case mijin::ErrorHandling::TRAP: \ + MIJIN_TRAP(); \ + [[fallthrough]]; \ + default: /* ABORT */ \ + std::abort(); \ } #define MIJIN_RAISE_ERROR(msg, func, file, line) MIJIN_DO_RAISE_ERROR(msg, func, file, line) #define MIJIN_ERROR(msg) \ -MIJIN_RAISE_ERROR(msg, MIJIN_FUNC(), __FILE__, __LINE__) +MIJIN_DO_RAISE_ERROR(msg, std::source_location::current()) #define MIJIN_FATAL(msg) \ MIJIN_ERROR(msg) \ @@ -129,13 +133,11 @@ constexpr AssertionResult handleAssert(const char* /* condition */, ErrorHandling handleError(const char* message, const char* function, const char* file, int line) noexcept; #else -inline ErrorHandling handleError(const char* message, const char* function, - const char* file, int line) noexcept +inline ErrorHandling handleError(const char* message, const std::source_location& location) noexcept { std::puts(message); - std::printf("Function: %s\n", function); - std::printf("File: %s\n", file); - std::printf("Line: %d\n", line); + std::printf("Function: %s\n", location.function_name()); + std::printf("Location: %s:%d:%d\n", location.file_name(), location.line(), location.column()); (void) std::fflush(stdout); return ErrorHandling::TRAP; } diff --git a/source/mijin/util/os.cpp b/source/mijin/util/os.cpp index 2632324..e21cd5c 100644 --- a/source/mijin/util/os.cpp +++ b/source/mijin/util/os.cpp @@ -1,14 +1,18 @@ #include "os.hpp" +#include #include "../detect.hpp" #if MIJIN_TARGET_OS == MIJIN_OS_LINUX + #include #include #elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS // TODO #endif +namespace fs = std::filesystem; + namespace mijin { @@ -36,7 +40,24 @@ namespace mijin // public functions // -void setCurrentThreadName(const char* threadName) +LibraryHandle openSharedLibrary(std::string_view libraryFile) noexcept +{ +#if MIJIN_TARGET_OS == MIJIN_OS_LINUX + const fs::path libraryPath = fs::absolute(libraryFile); + return {.data = dlopen(libraryPath.c_str(), RTLD_NOW)}; +#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS +#endif +} + +void* loadSymbolFromLibrary(const LibraryHandle library, const char* symbolName) noexcept +{ +#if MIJIN_TARGET_OS == MIJIN_OS_LINUX + return dlsym(library.data, symbolName); +#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS +#endif +} + +void setCurrentThreadName(const char* threadName) noexcept { #if MIJIN_TARGET_OS == MIJIN_OS_LINUX pthread_setname_np(pthread_self(), threadName); @@ -44,4 +65,15 @@ void setCurrentThreadName(const char* threadName) #endif } +[[nodiscard]] std::string makeLibraryFilename(std::string_view libraryName) noexcept +{ +#if MIJIN_TARGET_OS == MIJIN_OS_LINUX + return "lib" + std::string(libraryName) + ".so"; +#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS + return std::string(libraryName) + ".dll"; +#else + +#endif +} + } // namespace mijin diff --git a/source/mijin/util/os.hpp b/source/mijin/util/os.hpp index 1cb2a9b..e99db35 100644 --- a/source/mijin/util/os.hpp +++ b/source/mijin/util/os.hpp @@ -4,6 +4,9 @@ #if !defined(MIJIN_UTIL_OS_HPP_INCLUDED) #define MIJIN_UTIL_OS_HPP_INCLUDED 1 +#include +#include + namespace mijin { @@ -19,11 +22,23 @@ namespace mijin // public types // +struct LibraryHandle +{ + void* data = nullptr; + + constexpr operator bool() const noexcept { return data != nullptr; } + constexpr bool operator!() const noexcept { return data == nullptr; } +}; + // // public functions // -void setCurrentThreadName(const char* threadName); +[[nodiscard]] LibraryHandle openSharedLibrary(std::string_view libraryFile) noexcept; +[[nodiscard]] void* loadSymbolFromLibrary(const LibraryHandle library, const char* symbolName) noexcept; +void setCurrentThreadName(const char* threadName) noexcept; + +[[nodiscard]] std::string makeLibraryFilename(std::string_view libraryName) noexcept; } // namespace mijin