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.h124
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