libmoost
/home/mhx/git/github/libmoost/include/moost/pdl/dynamic_library.h
Go to the documentation of this file.
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