libmoost
|
00001 /* vim:set ts=3 sw=3 sts=3 et: */ 00028 #ifndef MOOST_PDL_DYNAMIC_LIBRARY_HPP__ 00029 #define MOOST_PDL_DYNAMIC_LIBRARY_HPP__ 00030 00031 #include <string> 00032 00033 #include <boost/shared_ptr.hpp> 00034 00035 #include "exception.h" 00036 #include "dynamic_class.h" 00037 00038 namespace moost { namespace pdl { 00039 00040 class dynamic_library_if; 00041 00072 class dynamic_library 00073 { 00074 public: 00078 dynamic_library(); 00079 00092 dynamic_library(const std::string& library_name, bool resolve_symbols = true); 00093 00112 void open(const std::string& library_name, bool resolve_symbols = true); 00113 00121 void close(); 00122 00131 bool is_open() const 00132 { 00133 return m_impl; 00134 } 00135 00147 template <typename T> 00148 boost::shared_ptr<T> create(const std::string& class_name) 00149 { 00150 dynamic_class *instance = create_instance(class_name); 00151 00152 T *dci = dynamic_cast<T *>(instance); 00153 00154 if (!dci) 00155 { 00156 delete instance; 00157 throw exception("invalid type for class " + class_name); 00158 } 00159 00160 return boost::shared_ptr<T>(dci, dynamic_class_deleter); 00161 } 00162 00172 template <typename T> 00173 boost::shared_ptr<T> associate(T *instance) 00174 { 00175 instance->m_library = m_impl; 00176 return boost::shared_ptr<T>(instance, dynamic_class_deleter); 00177 } 00178 00179 private: 00180 static void dynamic_class_deleter(dynamic_class *p); 00181 00182 dynamic_class *create_instance(const std::string& class_name); 00183 00184 boost::shared_ptr<dynamic_library_if> m_impl; 00185 }; 00186 00187 }} 00188 00189 #endif