summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pdynlib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/pdynlib.h')
-rw-r--r--src/lib/netlist/plib/pdynlib.h130
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_