aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/misc/mptLibrary.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/misc/mptLibrary.h')
-rw-r--r--Src/external_dependencies/openmpt-trunk/misc/mptLibrary.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/misc/mptLibrary.h b/Src/external_dependencies/openmpt-trunk/misc/mptLibrary.h
new file mode 100644
index 00000000..e5cfce25
--- /dev/null
+++ b/Src/external_dependencies/openmpt-trunk/misc/mptLibrary.h
@@ -0,0 +1,108 @@
+/*
+ * mptLibrary.h
+ * ------------
+ * Purpose: Shared library handling.
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
+ */
+
+
+#pragma once
+
+#include "openmpt/all/BuildSettings.hpp"
+
+
+OPENMPT_NAMESPACE_BEGIN
+
+
+namespace mpt
+{
+
+
+typedef void* (*FuncPtr)(); // pointer to function returning void*
+
+class LibraryHandle;
+
+enum class LibrarySearchPath
+{
+ Invalid,
+ Default,
+ Application,
+ System,
+ FullPath,
+};
+
+class LibraryPath
+{
+
+private:
+
+ mpt::LibrarySearchPath searchPath;
+ mpt::PathString fileName;
+
+private:
+
+ LibraryPath(mpt::LibrarySearchPath searchPath, const mpt::PathString &fileName);
+
+public:
+
+ mpt::LibrarySearchPath GetSearchPath() const;
+
+ mpt::PathString GetFileName() const;
+
+public:
+
+ // "lib" on Unix-like systems, "" on Windows
+ static mpt::PathString GetDefaultPrefix();
+
+ // ".so" or ".dylib" or ".dll"
+ static mpt::PathString GetDefaultSuffix();
+
+ // Returns the library path in the application directory, with os-specific prefix and suffix added to basename.
+ // e.g.: basename = "unmo3" --> "libunmo3.so" / "apppath/unmo3.dll"
+ static LibraryPath App(const mpt::PathString &basename);
+
+ // Returns the library path in the application directory, with os-specific suffix added to fullname.
+ // e.g.: fullname = "libunmo3" --> "libunmo3.so" / "apppath/libunmo3.dll"
+ static LibraryPath AppFullName(const mpt::PathString &fullname);
+
+ // Returns a system library name with os-specific prefix and suffix added to basename, but without any full path in order to be searched in the default search path.
+ // e.g.: basename = "unmo3" --> "libunmo3.so" / "unmo3.dll"
+ static LibraryPath System(const mpt::PathString &basename);
+
+ // Returns a system library name with os-specific suffix added to path.
+ // e.g.: path = "somepath/foo" --> "somepath/foo.so" / "somepath/foo.dll"
+ static LibraryPath FullPath(const mpt::PathString &path);
+
+};
+
+class Library
+{
+protected:
+ std::shared_ptr<LibraryHandle> m_Handle;
+public:
+ Library();
+ Library(const mpt::LibraryPath &path);
+public:
+ void Unload();
+ bool IsValid() const;
+ FuncPtr GetProcAddress(const std::string &symbol) const;
+ template <typename Tfunc>
+ bool Bind(Tfunc * & f, const std::string &symbol) const
+ {
+ #if !(MPT_OS_WINDOWS && MPT_COMPILER_GCC)
+ // MinGW64 std::is_function is always false for non __cdecl functions.
+ // See https://connect.microsoft.com/VisualStudio/feedback/details/774720/stl-is-function-bug .
+ static_assert(std::is_function<Tfunc>::value);
+ #endif
+ const FuncPtr addr = GetProcAddress(symbol);
+ f = reinterpret_cast<Tfunc*>(addr);
+ return (addr != nullptr);
+ }
+};
+
+} // namespace mpt
+
+
+OPENMPT_NAMESPACE_END