00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BOOSTER_SHARED_OBJECT_H
00009 #define BOOSTER_SHARED_OBJECT_H
00010
00011 #include <booster/config.h>
00012 #include <booster/noncopyable.h>
00013 #include <booster/hold_ptr.h>
00014 #include <booster/backtrace.h>
00015 #include <booster/cstdint.h>
00016 #include <string>
00017
00018 namespace booster {
00022 class BOOSTER_API shared_object : public booster::noncopyable {
00023 public:
00027 shared_object();
00032 ~shared_object();
00040 shared_object(std::string const &file_name);
00044 bool is_open() const;
00051 bool open(std::string const &file_name);
00059 bool open(std::string const &file_name,std::string &error_message);
00063 void close();
00064
00070 void *resolve_symbol(std::string const &name) const;
00071
00075 template<typename T>
00076 void symbol(T &s,std::string const &name) const
00077 {
00078 void *p = resolve_symbol(name);
00079 if(!p) {
00080 throw booster::runtime_error("booster::shared_object:failed to resolve symbol:" + name);
00081 }
00082 s = reinterpret_cast<T>(reinterpret_cast<size_t>(p));
00083 }
00084
00096 static std::string name(std::string const &module);
00109 static std::string name(std::string const &module,std::string const &soversion);
00110 private:
00111 struct data;
00112 hold_ptr<data> d;
00113 };
00114 }
00115
00116 #endif
00117