annotate modules/dynlib/dynlib.hpp @ 566:72390061044d

Net: improve documentation a bit
author David Demelier <markand@malikania.fr>
date Fri, 24 Jun 2016 13:00:35 +0200
parents 5725e2d2ab4c
children 943d07fbe352
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * dynlib.hpp -- portable shared library loader
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef DYNLIB_HPP
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define DYNLIB_HPP
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 /**
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 * \file dynlib.hpp
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 * \brief Portable shared library loader.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 * \author David Demelier <markand@malikania.fr>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 /**
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 * \page Dynlib Dynlib
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 * \brief Portable shared library loader.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 * The dynlib module let you open shared libraries dynamically at runtime.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 * ## Operating system support
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 * | System | Support | Remarks |
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 * |---------|---------|--------------------|
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 * | Apple | Ok | |
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 * | FreeBSD | Ok | |
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 * | Linux | Ok | Needs -ldl library |
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * | Windows | Ok | |
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 * ## How to export symbols
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 * When you want to dynamically load symbols from your shared library, make sure they are in a `extern "C"` block, if
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 * not they will be [mangled][name-mangling].
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 * Note, this does not mean that you can't write C++ code, it just mean that you can't use namespaces and function
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 * overloading.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 * Example of **plugin.cpp**:
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 * ````cpp
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 * #include <iostream>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * #include "dynlib.hpp"
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 * extern "C" {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 * DYNLIB_EXPORT void plugin_load()
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 * {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 * std::cout << "Loading plugin" << std::endl;
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 * DYNLIB_EXPORT void plugin_unload()
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 * {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 * std::cout << "Unloading plugin" << std::endl;
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 * ````
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * The \ref DYNLIB_EXPORT macro is necessary on some platforms to be sure that symbol will be visible. Make sure you always
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * add it before any function.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 * To compile, see your compiler documentation or build system. For gcc you can use the following:
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 * ````
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 * gcc -std=c++14 -shared plugin.cpp -o plugin.so
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * ````
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 * ## How to load the library
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 * The dynlib module will search for the library in various places, thus you can use relative paths names but be sure
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * that the library can be found. Otherwise, just use an absolute path to the file.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * ````cpp
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 * #include <iostream>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 * #include "dynlib.hpp"
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 * int main()
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 * {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * try {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 * Dynlib dso("./plugin" DYNLIB_SUFFIX);
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 * } catch (const std::exception &ex) {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 * std::cerr << ex.what() << std::endl;
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 * return 0;
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 * ````
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 * ## How to load symbol
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 * The last part is symbol loading, you muse use raw C function pointer and the Dynlib::sym function.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 * ````cpp
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 * #include <iostream>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 * #include "dynlib.hpp"
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 * using PluginLoad = void (*)();
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 * using PluginUnload = void (*)();
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 * int main()
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 * {
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
118 * try {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
119 * Dynlib dso("./plugin" DYNLIB_SUFFIX);
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 *
558
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
121 * dso.require<PluginLoad>("plugin_load")();
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
122 * dso.require<PluginUnload>("plugin_unload")();
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
123 * } catch (const std::exception &ex) {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
124 * std::cerr << ex.what() << std::endl;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
125 * }
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 *
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
127 * return 0;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 * ````
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 * [name-mangling]: https://en.wikipedia.org/wiki/Name_mangling
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 #include <stdexcept>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 #include <string>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 #if defined(_WIN32)
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 # include <Windows.h>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 #else
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 # include <dlfcn.h>
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 #endif
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 /**
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 * \brief Export the symbol.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 * This is required on some platforms and you should put it before your function signature.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 * \code{.cpp}
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 * extern "C" {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 * DYNLIB_EXPORT void my_function()
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 * {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 * }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 * \endcode
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 #if defined(_WIN32)
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
159 # define DYNLIB_EXPORT __declspec(dllexport)
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 #else
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 # define DYNLIB_EXPORT
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 #endif
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 /**
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 * \brief Usual suffix for the library.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 * This macro expands to the suffix convention for this platform.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 * \code{.cpp}
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 * Dynlib library("./myplugin" DYNLIB_SUFFIX);
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 * \endcode
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 * \note Don't use the suffix expanded value shown in Doxygen as it may be wrong.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 #if defined(_WIN32)
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 # define DYNLIB_SUFFIX ".dll"
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 #elif defined(__APPLE__)
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 # define DYNLIB_SUFFIX ".dylib"
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 #else
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 # define DYNLIB_SUFFIX ".so"
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 #endif
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 /**
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 * \class Dynlib
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 * \brief Load a dynamic module.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 *
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 * This class is a portable wrapper to load shared libraries on supported systems.
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 class Dynlib {
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 private:
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 #if defined(_WIN32)
557
a8b5e0bb59f7 Dynlib: style
David Demelier <markand@malikania.fr>
parents: 548
diff changeset
192 using Handle = HMODULE;
a8b5e0bb59f7 Dynlib: style
David Demelier <markand@malikania.fr>
parents: 548
diff changeset
193 using Sym = FARPROC;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 #else
557
a8b5e0bb59f7 Dynlib: style
David Demelier <markand@malikania.fr>
parents: 548
diff changeset
195 using Handle = void *;
a8b5e0bb59f7 Dynlib: style
David Demelier <markand@malikania.fr>
parents: 548
diff changeset
196 using Sym = void *;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 #endif
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 public:
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
200 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
201 * \brief Policy for symbol resolution.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
202 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
203 enum Policy {
557
a8b5e0bb59f7 Dynlib: style
David Demelier <markand@malikania.fr>
parents: 548
diff changeset
204 Immediately, //!< load symbols immediately
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
205 Lazy //!< load symbols when needed
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
206 };
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 private:
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
209 Handle m_handle;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
211 Dynlib(const Dynlib &) = delete;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
212 Dynlib &operator=(const Dynlib &) = delete;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
214 Dynlib(Dynlib &&) = delete;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
215 Dynlib &operator=(Dynlib &&) = delete;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
216
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 #if defined(_WIN32)
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
218 std::string error()
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
219 {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
220 LPSTR error = nullptr;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
221 std::string errmsg;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
223 FormatMessageA(
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
224 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
225 NULL,
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
226 GetLastError(),
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
227 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
228 (LPSTR)&error, 0, NULL);
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
229
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
230 if (error) {
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
231 errmsg = std::string(error);
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
232 LocalFree(error);
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
233 }
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
235 return errmsg;
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
236 }
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 #endif
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
238
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 public:
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
240 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
241 * Constructor to load a shared module.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
242 *
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
243 * \param path the absolute path
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
244 * \param policy the policy to load
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
245 * \throw std::runtime_error on error
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
246 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
247 Dynlib(const std::string &path, Policy policy = Immediately);
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
249 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
250 * Close the library automatically.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
251 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
252 ~Dynlib();
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
253
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
254 /**
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
255 * Get a symbol from the library.
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
256 *
558
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
257 * \param name the symbol
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
258 * \return the symbol
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
259 * \throw std::out_of_range on error
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
260 * \see DYNLIB_EXPORT
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
261 */
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
262 template <typename T>
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
263 inline T require(const std::string &name)
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
264 {
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
265 auto sym = get<T>(name);
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
266
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
267 if (!sym)
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
268 throw std::out_of_range(name + ": symbol not found");
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
269
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
270 return sym;
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
271 }
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
272
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
273 /**
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
274 * Get a symbol from the library or return nullptr if not found.
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
275 *
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
276 * \param name the symbol
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
277 * \return the symbol
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
278 */
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
279 template <typename T>
558
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
280 T get(const std::string &name) noexcept;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 };
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 #if defined(_WIN32)
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
284
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 /*
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 * Windows implementation
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 * ------------------------------------------------------------------
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
289
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 inline Dynlib::Dynlib(const std::string &path, Policy)
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 {
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
292 m_handle = LoadLibraryA(path.c_str());
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
294 if (m_handle == nullptr)
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
295 throw std::runtime_error(error());
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 inline Dynlib::~Dynlib()
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 {
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
300 FreeLibrary(m_handle);
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
301 m_handle = nullptr;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
303
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 template <typename T>
558
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
305 inline T Dynlib::get(const std::string &name) noexcept
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 {
558
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
307 return reinterpret_cast<T>(GetProcAddress(m_handle, name.c_str()));
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
309
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 #else
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
311
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 /*
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 * Unix implementation
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 * ------------------------------------------------------------------
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 */
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
316
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 inline Dynlib::Dynlib(const std::string &path, Policy policy)
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 {
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
319 m_handle = dlopen(path.c_str(), policy == Immediately ? RTLD_NOW : RTLD_LAZY);
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
320
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
321 if (m_handle == nullptr)
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
322 throw std::runtime_error(dlerror());
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
324
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 inline Dynlib::~Dynlib()
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 {
548
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
327 dlclose(m_handle);
f48bb09bccc7 Misc: huge cleanup, switch to spaces
David Demelier <markand@malikania.fr>
parents: 518
diff changeset
328 m_handle = nullptr;
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
330
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 template <typename T>
558
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
332 inline T Dynlib::get(const std::string &name) noexcept
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 {
558
5725e2d2ab4c Dynlib: add overload that does not throw
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
334 return reinterpret_cast<T>(dlsym(m_handle, name.c_str()));
518
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 }
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
336
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 #endif
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
338
78f296a7b2e5 Dynlib: resurrection
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 #endif // !DYNLIB_HPP