library.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2008 Marc Boris Duerner
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 #ifndef CXXTOOLS_LIBRARY_H
29 #define CXXTOOLS_LIBRARY_H
30 
31 #include <string>
32 
33 namespace cxxtools {
34 
35 class Symbol;
36 
52 class Library
53 {
54  public:
57  Library();
58 
67  explicit Library(const std::string& path);
68 
69  Library(const Library& other);
70 
71  Library& operator=(const Library& other);
72 
75  ~Library();
76 
84  Library& open(const std::string& path);
85 
86  void close();
87 
91  void* operator[](const char* symbol) const
92  { return this->resolve(symbol); }
93 
97  void* resolve(const char* symbol) const;
98 
101  operator const void*() const;
102 
103  Symbol getSymbol(const char* symbol) const;
104 
107  bool operator!() const;
108 
111  const std::string& path() const;
112 
117  static std::string suffix();
118 
123  static std::string prefix();
124 
125  protected:
126  void detach();
127 
128  private:
130  class LibraryImpl* _impl;
131 
133  std::string _path;
134 };
135 
138 class Symbol
139 {
140  public:
142  : _sym(0)
143  { }
144 
145  Symbol(const Library& lib, void* sym)
146  : _lib(lib), _sym(sym)
147  { }
148 
149  void* sym() const
150  { return _sym; }
151 
152  const Library& library() const
153  { return _lib; }
154 
155  operator void*() const
156  { return _sym; }
157 
158  private:
159  Library _lib;
160  void* _sym;
161 };
162 
163 } // namespace cxxtools
164 
165 #endif