libvisual  0.5.0
lv_module.hpp
1 #ifndef _LV_MODULE_HPP
2 #define _LV_MODULE_HPP
3 
4 #include <libvisual/lvconfig.h>
5 #include <libvisual/lv_defines.h>
6 #include <libvisual/lv_intrusive_ptr.hpp>
7 #include <memory>
8 #include <string>
9 
10 namespace LV {
11 
12  class Module;
13 
14  typedef IntrusivePtr<Module> ModulePtr;
15 
16  class LV_API Module
17  {
18  public:
19 
20  static ModulePtr load (std::string const& path);
21 
22  Module (Module const&) = delete;
23 
24  Module& operator= (Module const&) = delete;
25 
26  ~Module ();
27 
28  void* get_symbol (std::string const& name);
29 
30  static std::string const& path_suffix ();
31 
32  private:
33 
34  class Impl;
35  const std::unique_ptr<Impl> m_impl;
36 
37  unsigned int m_ref_count;
38 
39  explicit Module (std::string const& path);
40 
41  friend void intrusive_ptr_add_ref (Module* module);
42  friend void intrusive_ptr_release (Module* module);
43  };
44 
45  inline void intrusive_ptr_add_ref (Module* module)
46  {
47  module->m_ref_count++;
48  }
49 
50  inline void intrusive_ptr_release (Module* module)
51  {
52  module->m_ref_count--;
53  if (module->m_ref_count == 0) {
54  delete module;
55  }
56  }
57 
58 } // LV namespace
59 
60 #endif // _LV_MODULE_HPP