diff options
Diffstat (limited to 'src/lib/netlist/plib/pdynlib.h')
-rw-r--r-- | src/lib/netlist/plib/pdynlib.h | 130 |
1 files changed, 88 insertions, 42 deletions
diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h index 9c44452d16f..7a6a4b6985c 100644 --- a/src/lib/netlist/plib/pdynlib.h +++ b/src/lib/netlist/plib/pdynlib.h @@ -12,62 +12,108 @@ #include "ptypes.h" namespace plib { -// ---------------------------------------------------------------------------------------- -// pdynlib: dynamic loading of libraries ... -// ---------------------------------------------------------------------------------------- + // ---------------------------------------------------------------------------------------- + // pdynlib: dynamic loading of libraries ... + // ---------------------------------------------------------------------------------------- -class dynlib : public nocopyassignmove -{ -public: - explicit dynlib(const pstring &libname); - dynlib(const pstring &path, const pstring &libname); + class dynlib_base : public nocopyassignmove + { + public: + explicit dynlib_base() : m_is_loaded(false) { } + + virtual ~dynlib_base() { } + COPYASSIGNMOVE(dynlib_base, delete) - ~dynlib(); - COPYASSIGNMOVE(dynlib, delete) + bool isLoaded() const { return m_is_loaded; } - bool isLoaded() const { return m_isLoaded; } + template <typename T> + T getsym(const pstring &name) const noexcept + { + return reinterpret_cast<T>(getsym_p(name)); + } - template <typename T> - T getsym(const pstring &name) const noexcept + protected: + bool m_is_loaded; + virtual void *getsym_p(const pstring &name) const noexcept = 0; + }; + + class dynlib : public dynlib_base { - return reinterpret_cast<T>(getsym_p(name)); - } -private: - void *getsym_p(const pstring &name) const noexcept; + public: + explicit dynlib(const pstring &libname); + dynlib(const pstring &path, const pstring &libname); - bool m_isLoaded; - void *m_lib; -}; + ~dynlib(); -template <typename R, typename... Args> -class dynproc -{ -public: - using calltype = R(*) (Args... args); + protected: + void *getsym_p(const pstring &name) const noexcept override; - dynproc() : m_sym(nullptr) { } + private: + void *m_lib; + }; - dynproc(dynlib &dl, const pstring &name) noexcept + struct dynlib_static_sym { - m_sym = dl.getsym<calltype>(name); - } + const char *name; + void *addr; + }; - void load(dynlib &dl, const pstring &name) noexcept + class dynlib_static : public dynlib_base { - m_sym = dl.getsym<calltype>(name); - } - - R operator ()(Args&&... args) const + public: + explicit dynlib_static(const dynlib_static_sym *syms) + : m_syms(syms) + { + if (syms != nullptr) + m_is_loaded = true; + } + + protected: + void *getsym_p(const pstring &name) const noexcept override + { + const dynlib_static_sym *p = m_syms; + while (p->name[0] != 0) + { + if (name == pstring(p->name)) + return p->addr; + p++; + } + return nullptr; + } + + private: + const dynlib_static_sym *m_syms; + }; + + template <typename R, typename... Args> + class dynproc { - return m_sym(std::forward<Args>(args)...); - //return m_sym(args...); - } + 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; -}; + bool resolved() const noexcept { return m_sym != nullptr; } + private: + calltype m_sym; + }; } // namespace plib -#endif // PSTRING_H_ +#endif // PDYNLIB_H_ |