diff options
Diffstat (limited to 'src/lib/netlist/plib/pdynlib.h')
-rw-r--r-- | src/lib/netlist/plib/pdynlib.h | 124 |
1 files changed, 64 insertions, 60 deletions
diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h index 5548c56d64b..8d8e3377e3a 100644 --- a/src/lib/netlist/plib/pdynlib.h +++ b/src/lib/netlist/plib/pdynlib.h @@ -7,79 +7,112 @@ /// /// \file pdynlib.h /// +/// Dynamic loading of libraries +/// #include "pstring.h" #include "ptypes.h" namespace plib { - // ---------------------------------------------------------------------------------------- - // pdynlib: dynamic loading of libraries ... - // ---------------------------------------------------------------------------------------- - class dynlib_base + class dynamic_library_base { public: - explicit dynlib_base() : m_is_loaded(false) { } - virtual ~dynlib_base() = default; + explicit dynamic_library_base() : m_is_loaded(false) { } + + virtual ~dynamic_library_base() = default; + + dynamic_library_base(const dynamic_library_base &) = delete; + dynamic_library_base &operator=(const dynamic_library_base &) = delete; + + dynamic_library_base(dynamic_library_base &&) noexcept = default; + dynamic_library_base &operator=(dynamic_library_base &&) noexcept = default; + + template <typename R, typename... Args> + class function + { + public: + using calltype = R(*) (Args... args); - PCOPYASSIGN(dynlib_base, delete) - PMOVEASSIGN(dynlib_base, default) + function() : m_sym(nullptr) { } + + function(dynamic_library_base &dl, const pstring &name) noexcept + : m_sym(dl.get_symbol<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; } template <typename T> - T getsym(const pstring &name) const noexcept + T get_symbol(const pstring &name) const noexcept { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - return reinterpret_cast<T>(getsym_p(name)); + return reinterpret_cast<T>(get_symbol_pointer(name)); } protected: void set_loaded(bool v) noexcept { m_is_loaded = v; } - virtual void *getsym_p(const pstring &name) const noexcept = 0; + virtual void *get_symbol_pointer(const pstring &name) const noexcept = 0; private: bool m_is_loaded; }; - class dynlib : public dynlib_base + class dynamic_library : public dynamic_library_base { public: - explicit dynlib(const pstring &libname); - dynlib(const pstring &path, const pstring &libname); + explicit dynamic_library(const pstring &libname); + dynamic_library(const pstring &path, const pstring &libname); - ~dynlib() override; + ~dynamic_library() override; - PCOPYASSIGN(dynlib, delete) - PMOVEASSIGN(dynlib, default) + PCOPYASSIGN(dynamic_library, delete) + PMOVEASSIGN(dynamic_library, default) protected: - void *getsym_p(const pstring &name) const noexcept override; + void *get_symbol_pointer(const pstring &name) const noexcept override; private: void *m_lib; }; - struct dynlib_static_sym - { - const char *name; - void *addr; - }; - - class dynlib_static : public dynlib_base + class static_library : public dynamic_library_base { public: - explicit dynlib_static(const dynlib_static_sym *syms) - : m_syms(syms) + struct symbol { - if (syms != nullptr) + const char *name; + void *addr; + }; + + + explicit static_library(const symbol *symbols) + : m_syms(symbols) + { + if (symbols != nullptr) set_loaded(true); } protected: - void *getsym_p(const pstring &name) const noexcept override + void *get_symbol_pointer(const pstring &name) const noexcept override { - const dynlib_static_sym *p = m_syms; + const symbol *p = m_syms; while (p->name[0] != 0) { if (name == pstring(p->name)) @@ -90,36 +123,7 @@ namespace plib { } private: - const dynlib_static_sym *m_syms; - }; - - template <typename R, typename... Args> - class dynproc - { - public: - using calltype = R(*) (Args... args); - - dynproc() : m_sym(nullptr) { } - - dynproc(dynlib_base &dl, const pstring &name) noexcept - { - m_sym = dl.getsym<calltype>(name); - } - - void load(dynlib_base &dl, const pstring &name) noexcept - { - m_sym = dl.getsym<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; + const symbol *m_syms; }; } // namespace plib |