OGLplus (0.52.0) a C++ wrapper for OpenGL

enumerations.hpp
Go to the documentation of this file.
1 
12 #pragma once
13 #ifndef OGLPLUS_ENUMERATIONS_1107121519_HPP
14 #define OGLPLUS_ENUMERATIONS_1107121519_HPP
15 
16 #include <oglplus/config/compiler.hpp>
17 #include <oglplus/config/enums.hpp>
18 #include <oglplus/string/def.hpp>
19 #include <oglplus/string/ref.hpp>
20 #include <oglplus/detail/enum_class.hpp>
21 #include <oglplus/detail/base_range.hpp>
22 #include <vector>
23 
24 namespace oglplus {
25 
26 #if OGLPLUS_DOCUMENTATION_ONLY
27 
29 
41 StrCRef EnumValueName(Enum enum_value);
42 
44 
55 template <typename Enumeration>
56 Range<Enum> EnumValueRange(void);
57 
58 #else
59 
60 namespace enums {
61 
62 template <typename Enum>
63 struct EnumBaseType
64 {
65  typedef GLenum Type;
66 };
67 
68 inline StrCRef ValueName_(GLenum*, GLenum)
69 {
70  return StrCRef();
71 }
72 
73 template <typename EnumType>
74 inline StrCRef EnumValueName(EnumType enum_value)
75 {
76 #if !OGLPLUS_NO_ENUM_VALUE_NAMES
77  typedef typename EnumBaseType<EnumType>::Type BaseType;
78  return ValueName_(
79  (EnumType*)nullptr,
80  BaseType(enum_value)
81  );
82 #else
83  OGLPLUS_FAKE_USE(enum_value);
84  return StrCRef();
85 #endif
86 }
87 
88 template <typename EnumType>
89 inline aux::CastIterRange<
90  const typename EnumBaseType<EnumType>::Type*,
91  EnumType
92 > EnumValueRange(void)
93 {
94 #if !OGLPLUS_NO_ENUM_VALUE_RANGES
95  return ValueRange_((EnumType*)nullptr);
96 #else
97  const typename EnumBaseType<EnumType>::Type *x = nullptr;
98  return aux::CastIterRange<
99  const typename EnumBaseType<EnumType>::Type*,
100  EnumType
101  >(x, x);
102 
103 #endif
104 }
105 
106 } // namespace enums
109 
110 namespace aux {
111 
112 template <typename Enum, bool Copy>
113 class EnumArray;
114 
115 
116 template <typename Enum>
117 class EnumArray<Enum, false>
118 {
119 private:
120  std::size_t _count;
121  const GLenum* _enums;
122 protected:
123  EnumArray(
124  std::size_t count,
125  const Enum* enums
126  ): _count(count)
127  , _enums(reinterpret_cast<const GLenum*>(enums))
128  { }
129 public:
130  std::size_t Count(void) const
131  {
132  return _count;
133  }
134 
135  const GLenum* Values(void) const
136  {
137  return _enums;
138  }
139 };
140 
141 template <typename Enum>
142 class EnumArray<Enum, true>
143 {
144 private:
145  std::vector<GLenum> _enums;
146 protected:
147  EnumArray(
148  std::size_t count,
149  const Enum* enums
150  ): _enums(count)
151  {
152  for(std::size_t i=0; i!=count; ++i)
153  {
154  _enums[i] = GLenum(enums[i]);
155  }
156  }
157 public:
158  std::size_t Count(void) const
159  {
160  return _enums.size();
161  }
162 
163  const GLenum* Values(void) const
164  {
165  return _enums.data();
166  }
167 };
168 
169 } // namespace aux
170 
172 
178 template <typename Enum>
179 class EnumArray
180  : public aux::EnumArray<Enum, sizeof(Enum) != sizeof(GLenum)>
181 {
182 private:
183  typedef aux::EnumArray<Enum, sizeof(Enum) != sizeof(GLenum)> Base_;
184 public:
185  template <std::size_t N>
186  EnumArray(const Enum (&enums)[N])
187  : Base_(N, enums)
188  { }
189 
190  EnumArray(const std::vector<Enum>& enums)
191  : Base_(enums.size(), enums.data())
192  { }
193 
194  EnumArray(std::size_t count, const Enum* enums)
195  : Base_(count, enums)
196  { }
197 };
198 
199 #endif // OGLPLUS_DOCUMENTATION_ONLY
200 
201 } // namespace oglplus
202 
203 #endif // include guard
StrCRef EnumValueName(Enum enum_value)
Returns the name of the GL enumerated value for an OGLplus enum value.
String type definition and related functions.
Range< Enum > EnumValueRange(void)
Returns a Range of values in an Enumeration.
String reference.
String const reference wrapper template.
Definition: ref_tpl.hpp:72
StrCRefTpl< GLchar > StrCRef
String const reference wrapper.
Definition: ref.hpp:21

Copyright © 2010-2014 Matúš Chochlík, University of Žilina, Žilina, Slovakia.
<matus.chochlik -at- fri.uniza.sk>
<chochlik -at -gmail.com>
Documentation generated on Mon Sep 22 2014 by Doxygen (version 1.8.6).