VolViz
A volume visualization tool
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
Binding.h
Go to the documentation of this file.
1 #ifndef VolViz_Binding_h
2 #define VolViz_Binding_h
3 
4 #include "GLdefs.h"
5 
6 #include <tuple>
7 #include <utility>
8 
9 namespace VolViz {
10 namespace Private_ {
11 namespace GL {
12 
17 template <class T> class Binding {
18 public:
19  explicit Binding(T &&obj) noexcept : obj_(std::forward<T>(obj)) {
20  obj_.bind();
21  }
22 
23  Binding(Binding &&) = default;
24 
25  Binding &operator=(Binding &&) = default;
26 
27  ~Binding() { obj_.unbind(); }
28 
29 private:
30  T &&obj_;
31 };
32 
33 template <class T, class Arg> class Binding2 {
34 public:
35  explicit Binding2(T &&obj, Arg arg) noexcept
36  : obj_(std::forward<T>(obj)), arg_(arg) {
37  obj_.bind(arg_);
38  }
39 
40  Binding2(Binding2 &&) = default;
41 
42  Binding2 &operator=(Binding2 &&) = default;
43 
44  ~Binding2() { obj_.unbind(arg_); }
45 
46 private:
47  T &&obj_;
48  Arg arg_;
49 };
50 
52 template <class T> inline decltype(auto) binding(T &&obj) noexcept {
53  return Binding<T>(std::forward<T>(obj));
54 }
55 
56 template <class T, class A>
57 inline decltype(auto) binding(T &&obj, A &&arg) noexcept {
58  return Binding2<T, std::remove_reference_t<A>>(std::forward<T>(obj),
59  std::forward<A>(arg));
60 }
61 
62 } // namespace GL
63 } // namespace Private_
64 } // namespace VolViz
65 
66 #endif // VolViz_Binding_h
Definition: Binding.h:33
~Binding2()
Definition: Binding.h:44
Binding2 & operator=(Binding2 &&)=default
~Binding()
Definition: Binding.h:27
Binding & operator=(Binding &&)=default
Definition: Binding.h:17
GLhandleARB obj
Definition: glad.h:8790
T && obj_
Definition: Binding.h:47
T && obj_
Definition: Binding.h:30
Binding(T &&obj) noexcept
Definition: Binding.h:19
decltype(auto) binding(T &&obj) noexcept
Convenience function to create Binding objects.
Definition: Binding.h:52
Binding2(T &&obj, Arg arg) noexcept
Definition: Binding.h:35
Arg arg_
Definition: Binding.h:48