glbinding  3.3.0.0
A C++ binding for the OpenGL API, generated using the gl.xml specification.
Loading...
Searching...
No Matches
SharedBitfield.h
Go to the documentation of this file.
1
2#pragma once
3
4
5#include <type_traits>
6
7#include <glbinding/glbinding_api.h>
8#include <glbinding/glbinding_features.h>
9
10
11namespace glbinding
12{
13
14
22template <typename... Types>
23class GLBINDING_TEMPLATE_API SharedBitfield;
24
25
26// intersection
27
28
41template<typename T, typename... Types>
42struct GLBINDING_TEMPLATE_API is_member_of_SharedBitfield
43{
44 static const bool value = false;
45};
46
47
59template<typename T, typename U, typename... Types>
60struct GLBINDING_TEMPLATE_API is_member_of_SharedBitfield<T, U, Types...>
61{
62 static const bool value = std::conditional<std::is_same<T, U>::value, std::true_type, is_member_of_SharedBitfield<T, Types...>>::type::value;
63};
64
65
70template<typename, typename>
71struct GLBINDING_TEMPLATE_API prepend_to_SharedBitfield
72{
73};
74
75
85template<typename T, typename... Types>
86struct GLBINDING_TEMPLATE_API prepend_to_SharedBitfield<T, SharedBitfield<Types...>>
87{
88 using type = SharedBitfield<T, Types...>;
89};
90
91
96template<typename, typename>
97struct GLBINDING_TEMPLATE_API intersect_SharedBitfield
98{
100};
101
102
114template<typename T, typename... Types, typename... OtherTypes>
115struct GLBINDING_TEMPLATE_API intersect_SharedBitfield<SharedBitfield<T, Types...>, SharedBitfield<OtherTypes...>>
116{
117 using type = typename std::conditional<!is_member_of_SharedBitfield<T, OtherTypes...>::value, typename intersect_SharedBitfield<SharedBitfield<Types...>, SharedBitfield<OtherTypes...>>::type, typename prepend_to_SharedBitfield<T, typename intersect_SharedBitfield<SharedBitfield<Types...>, SharedBitfield<OtherTypes...>>::type>::type>::type;
118};
119
120
121// implementation
122
123
131template <typename T>
132class GLBINDING_TEMPLATE_API SharedBitfieldBase
133{
134public:
135 using UnderlyingType = T;
136
144 GLBINDING_CONSTEXPR inline SharedBitfieldBase(T value);
145
153 GLBINDING_CONSTEXPR inline explicit operator T() const;
154
155
156protected:
158};
159
160
165template <>
166class GLBINDING_TEMPLATE_API SharedBitfield<>
167{
168};
169
170
179template <typename Type>
180class GLBINDING_TEMPLATE_API SharedBitfield<Type> : public SharedBitfieldBase<typename std::underlying_type<Type>::type>
181{
182public:
184
195 template <typename ConstructionType>
196 GLBINDING_CONSTEXPR inline SharedBitfield(ConstructionType value);
197
205 GLBINDING_CONSTEXPR inline SharedBitfield(typename std::underlying_type<Type>::type value);
206
214 GLBINDING_CONSTEXPR inline operator Type() const;
215
229 template <typename... T>
230 GLBINDING_CONSTEXPR inline auto operator|(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type>::type;
231
242 template <typename... T>
243 inline auto operator|=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
244
258 template <typename... T>
259 GLBINDING_CONSTEXPR inline auto operator&(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type>::type;
260
271 template <typename... T>
272 inline auto operator&=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
273
287 template <typename... T>
288 GLBINDING_CONSTEXPR inline auto operator^(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type>::type;
289
300 template <typename... T>
301 inline auto operator^=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
302
316 template <typename... T>
317 GLBINDING_CONSTEXPR inline auto operator==(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, bool>::type;
318
334 template <typename T>
335 GLBINDING_CONSTEXPR inline auto operator==(T other) const -> typename std::enable_if<is_member_of_SharedBitfield<T, Type>::value, bool>::type;
336};
337
338
348template <typename Type, typename... Types>
349class GLBINDING_TEMPLATE_API SharedBitfield<Type, Types...> : public SharedBitfield<Types...>
350{
351public:
352 using UnderlyingType = typename SharedBitfield<Types...>::UnderlyingType;
353
363 template <typename ConstructionType>
364 GLBINDING_CONSTEXPR inline SharedBitfield(ConstructionType value);
365
373 GLBINDING_CONSTEXPR inline SharedBitfield(typename std::underlying_type<Type>::type value);
374
382 GLBINDING_CONSTEXPR inline operator Type() const;
383
397 template <typename... T>
398 GLBINDING_CONSTEXPR inline auto operator|(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type>::type;
399
410 template <typename... T>
411 inline auto operator|=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
412
426 template <typename... T>
427 GLBINDING_CONSTEXPR inline auto operator&(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type>::type;
428
439 template <typename... T>
440 inline auto operator&=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
441
455 template <typename... T>
456 GLBINDING_CONSTEXPR inline auto operator^(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type>::type;
457
468 template <typename... T>
469 inline auto operator^=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
470
484 template <typename... T>
485 GLBINDING_CONSTEXPR inline auto operator==(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield<Type, Types...>, SharedBitfield<T...>>::type, SharedBitfield<>>::value, bool>::type;
486
502 template <typename T>
503 GLBINDING_CONSTEXPR inline auto operator==(T other) const -> typename std::enable_if<is_member_of_SharedBitfield<T, Type, Types...>::value, bool>::type;
504};
505
506
507// operators
508
509
529template <typename Enum, typename ConvertibleEnum>
530GLBINDING_CONSTEXPR inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
531operator|(Enum a, ConvertibleEnum b);
532
552template <typename ConvertibleEnum, typename Enum>
553GLBINDING_CONSTEXPR inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
554operator|(ConvertibleEnum a, Enum b);
555
575template <typename Enum, typename ConvertibleEnum>
576inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
577operator|=(Enum & a, ConvertibleEnum b);
578
598template <typename Enum, typename ConvertibleEnum>
599GLBINDING_CONSTEXPR inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
600operator&(Enum a, ConvertibleEnum b);
601
621template <typename ConvertibleEnum, typename Enum>
622GLBINDING_CONSTEXPR inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
623operator&(ConvertibleEnum a, Enum b);
624
644template <typename Enum, typename ConvertibleEnum>
645inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
646operator&=(Enum & a, ConvertibleEnum b);
647
667template <typename Enum, typename ConvertibleEnum>
668GLBINDING_CONSTEXPR inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
669operator^(Enum a, ConvertibleEnum b);
670
690template <typename ConvertibleEnum, typename Enum>
691GLBINDING_CONSTEXPR inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
692operator^(ConvertibleEnum a, Enum b);
693
713template <typename Enum, typename ConvertibleEnum>
714inline typename std::enable_if<std::is_base_of<SharedBitfieldBase<typename std::underlying_type<typename std::enable_if<std::is_enum<Enum>::value, Enum>::type>::type>, ConvertibleEnum>::value, Enum>::type
715operator^=(Enum & a, ConvertibleEnum b);
716
717
718} // namespace glbinding
719
720
typename SharedBitfield< Types... >::UnderlyingType UnderlyingType
inherit UnderlyingType declaration
Definition SharedBitfield.h:352
typename SharedBitfieldBase< typename std::underlying_type< Type >::type >::UnderlyingType UnderlyingType
inherit UnderlyingType declaration
Definition SharedBitfield.h:183
Invalid SharedBitfield class as it contains no valid bitfield types.
Definition SharedBitfield.h:167
The base class of a SharedBitfield, containing the actual (and convertible) bitfield value.
Definition SharedBitfield.h:133
T UnderlyingType
Propagate underlying type.
Definition SharedBitfield.h:135
T m_value
The value of the SharedBitfield.
Definition SharedBitfield.h:157
A representation of a bitfield value that could be member of multiple bitfield types as allowed in Op...
Definition SharedBitfield.h:23
Contains all the classes of glbinding.
GLBINDING_CONSTEXPR CallbackMask operator&(CallbackMask a, CallbackMask b)
External operator for bit-wise 'and' of CallbackMasks.
Definition CallbackMask.inl:26
GLBINDING_CONSTEXPR CallbackMask operator|(CallbackMask a, CallbackMask b)
External operator for bit-wise 'or' of CallbackMasks.
Definition CallbackMask.inl:19
CallbackMask & operator&=(CallbackMask &a, CallbackMask b)
External operator for bit-wise 'and' assignment of CallbackMasks.
Definition CallbackMask.inl:46
CallbackMask & operator^=(CallbackMask &a, CallbackMask b)
External operator for bit-wise 'xor' assignment of CallbackMasks.
Definition CallbackMask.inl:52
CallbackMask & operator|=(CallbackMask &a, CallbackMask b)
External operator for bit-wise 'or' assignment of CallbackMasks.
Definition CallbackMask.inl:40
GLBINDING_CONSTEXPR CallbackMask operator^(CallbackMask a, CallbackMask b)
External operator for bit-wise 'xor' of CallbackMasks.
Definition CallbackMask.inl:33
typename std::conditional<!is_member_of_SharedBitfield< T, OtherTypes... >::value, typename intersect_SharedBitfield< SharedBitfield< Types... >, SharedBitfield< OtherTypes... > >::type, typename prepend_to_SharedBitfield< T, typename intersect_SharedBitfield< SharedBitfield< Types... >, SharedBitfield< OtherTypes... > >::type >::type >::type type
Result of the intersection.
Definition SharedBitfield.h:117
Break condition for the SharedBitfield intersection.
Definition SharedBitfield.h:98
Break condition for the is_member_of_SharedBitfield metaprogramming.
Definition SharedBitfield.h:43
Break condition for the SharedBitfield type concatenation.
Definition SharedBitfield.h:72