blob: 8d8e3377e3ae93e6c25e32cdf48120a9bd3f846a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
// license:BSD-3-Clause
// copyright-holders:Couriersud
#ifndef PDYNLIB_H_
#define PDYNLIB_H_
///
/// \file pdynlib.h
///
/// Dynamic loading of libraries
///
#include "pstring.h"
#include "ptypes.h"
namespace plib {
class dynamic_library_base
{
public:
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);
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 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
{
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)
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 // PDYNLIB_H_
|