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.h155
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_