diff options
Diffstat (limited to 'src/lib/netlist/plib/pdynlib.h')
-rw-r--r-- | src/lib/netlist/plib/pdynlib.h | 155 |
1 files changed, 107 insertions, 48 deletions
diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h index 1454c053298..8d8e3377e3a 100644 --- a/src/lib/netlist/plib/pdynlib.h +++ b/src/lib/netlist/plib/pdynlib.h @@ -1,72 +1,131 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud -/* - * pdynlib.h - */ #ifndef PDYNLIB_H_ #define PDYNLIB_H_ +/// +/// \file pdynlib.h +/// +/// Dynamic loading of libraries +/// + #include "pstring.h" #include "ptypes.h" namespace plib { -// ---------------------------------------------------------------------------------------- -// pdynlib: dynamic loading of libraries ... -// ---------------------------------------------------------------------------------------- -class dynlib : public nocopyassignmove -{ -public: - explicit dynlib(const pstring &libname); - dynlib(const pstring &path, const pstring &libname); + class dynamic_library_base + { + public: - ~dynlib(); - COPYASSIGNMOVE(dynlib, delete) + explicit dynamic_library_base() : m_is_loaded(false) { } - bool isLoaded() const; + virtual ~dynamic_library_base() = default; - template <typename T> - T getsym(const pstring &name) - { - return reinterpret_cast<T>(getsym_p(name)); - } -private: - void *getsym_p(const pstring &name); + dynamic_library_base(const dynamic_library_base &) = delete; + dynamic_library_base &operator=(const dynamic_library_base &) = delete; - bool m_isLoaded; - void *m_lib; -}; + dynamic_library_base(dynamic_library_base &&) noexcept = default; + dynamic_library_base &operator=(dynamic_library_base &&) noexcept = default; -template <typename R, typename... Args> -class dynproc -{ -public: - using calltype = R(*) (Args... args); + template <typename R, typename... Args> + class function + { + public: + using calltype = R(*) (Args... args); - dynproc() : m_sym(nullptr) { } + function() : m_sym(nullptr) { } - dynproc(dynlib &dl, const pstring &name) - { - m_sym = dl.getsym<calltype>(name); - } + function(dynamic_library_base &dl, const pstring &name) noexcept + : m_sym(dl.get_symbol<calltype>(name)) + { + } - void load(dynlib &dl, const pstring &name) - { - m_sym = dl.getsym<calltype>(name); - } + void load(dynamic_library_base &dl, const pstring &name) noexcept + { + m_sym = dl.get_symbol<calltype>(name); + } + + R operator ()(Args&&... args) const + { + return m_sym(std::forward<Args>(args)...); + //return m_sym(args...); + } + + bool resolved() const noexcept { return m_sym != nullptr; } + private: + calltype m_sym; + }; + + bool isLoaded() const { return m_is_loaded; } - R operator ()(Args&&... args) const + template <typename T> + T get_symbol(const pstring &name) const noexcept + { + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + return reinterpret_cast<T>(get_symbol_pointer(name)); + } + + protected: + void set_loaded(bool v) noexcept { m_is_loaded = v; } + virtual void *get_symbol_pointer(const pstring &name) const noexcept = 0; + private: + bool m_is_loaded; + }; + + class dynamic_library : public dynamic_library_base { - return m_sym(std::forward<Args>(args)...); - //return m_sym(args...); - } + public: + explicit dynamic_library(const pstring &libname); + dynamic_library(const pstring &path, const pstring &libname); + + ~dynamic_library() override; + + PCOPYASSIGN(dynamic_library, delete) + PMOVEASSIGN(dynamic_library, default) - bool resolved() { return m_sym != nullptr; } -private: - calltype m_sym; -}; + protected: + void *get_symbol_pointer(const pstring &name) const noexcept override; + + private: + void *m_lib; + }; + + class static_library : public dynamic_library_base + { + public: + struct symbol + { + const char *name; + void *addr; + }; + + + explicit static_library(const symbol *symbols) + : m_syms(symbols) + { + if (symbols != nullptr) + set_loaded(true); + } + + protected: + void *get_symbol_pointer(const pstring &name) const noexcept override + { + const symbol *p = m_syms; + while (p->name[0] != 0) + { + if (name == pstring(p->name)) + return p->addr; + p++; + } + return nullptr; + } + + private: + const symbol *m_syms; + }; } // namespace plib -#endif /* PSTRING_H_ */ +#endif // PDYNLIB_H_ |