glbinding  2.1.1.000000000000
A C++ binding for the OpenGL API, generated using the gl.xml specification.
SharedBitfield.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include <type_traits>
5 
6 
7 namespace glbinding
8 {
9 
17 template <typename... Types>
19 
20 // intersection
21 
33 template<typename T, typename... Types>
35 {
36  static const bool value = false;
37 };
38 
50 template<typename T, typename U, typename... Types>
51 struct is_member_of_SharedBitfield<T, U, Types...>
52 {
53  static const bool value = std::conditional<std::is_same<T, U>::value, std::true_type, is_member_of_SharedBitfield<T, Types...>>::type::value;
54 };
55 
62 template<typename, typename>
64 {
65 };
66 
76 template<typename T, typename... Types>
78 {
79  using type = SharedBitfield<T, Types...>;
80 };
81 
86 template<typename, typename>
88 {
90 };
91 
103 template<typename T, typename... Types, typename... OtherTypes>
104 struct intersect_SharedBitfield<SharedBitfield<T, Types...>, SharedBitfield<OtherTypes...>>
105 {
106  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;
107 };
108 
109 
110 // implementation
111 
112 
120 template <typename T>
122 {
123 public:
124  using UnderlyingType = T;
125 
134 
142  explicit operator T() const;
143 protected:
145 };
146 
151 template <>
153 {};
154 
163 template <typename Type>
164 class SharedBitfield<Type> : public SharedBitfieldBase<typename std::underlying_type<Type>::type>
165 {
166 public:
168 
178  template <typename ConstructionType>
179  SharedBitfield(ConstructionType value);
180 
188  SharedBitfield(typename std::underlying_type<Type>::type value);
189 
197  operator Type() const;
198 
211  template <typename... T>
212  auto operator|(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type>::type;
213 
223  template <typename... T>
224  auto operator|=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
225 
238  template <typename... T>
239  auto operator&(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type>::type;
240 
250  template <typename... T>
251  auto operator&=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
252 
265  template <typename... T>
266  auto operator^(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type>::type;
267 
277  template <typename... T>
278  auto operator^=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
279 
292  template <typename... T>
293  auto operator==(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, bool>::type;
294 
309  template <typename T>
310  auto operator==(T other) const -> typename std::enable_if<is_member_of_SharedBitfield<T, Type>::value, bool>::type;
311 };
312 
322 template <typename Type, typename... Types>
323 class SharedBitfield<Type, Types...> : public SharedBitfield<Types...>
324 {
325 public:
326  using UnderlyingType = typename SharedBitfield<Types...>::UnderlyingType;
327 
337  template <typename ConstructionType>
338  SharedBitfield(ConstructionType value);
339 
347  SharedBitfield(typename std::underlying_type<Type>::type value);
348 
356  operator Type() const;
357 
370  template <typename... T>
371  auto operator|(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type>::type;
372 
382  template <typename... T>
383  auto operator|=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
384 
397  template <typename... T>
398  auto operator&(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type>::type;
399 
409  template <typename... T>
410  auto operator&=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
411 
424  template <typename... T>
425  auto operator^(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type>::type;
426 
436  template <typename... T>
437  auto operator^=(SharedBitfield<T...> other) -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, SharedBitfield &>::type;
438 
451  template <typename... T>
452  auto operator==(SharedBitfield<T...> other) const -> typename std::enable_if<!std::is_same<typename intersect_SharedBitfield<SharedBitfield, SharedBitfield<T...>>::type, SharedBitfield<>>::value, bool>::type;
453 
468  template <typename T>
469  auto operator==(T other) const -> typename std::enable_if<is_member_of_SharedBitfield<T, Type, Types...>::value, bool>::type;
470 };
471 
472 
473 // operators
474 
475 
494 template <typename Enum, typename ConvertibleEnum>
495 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
496 operator|(Enum a, ConvertibleEnum b);
497 
516 template <typename ConvertibleEnum, typename Enum>
517 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
518 operator|(ConvertibleEnum a, Enum b);
519 
538 template <typename Enum, typename ConvertibleEnum>
539 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
540 operator|=(Enum & a, ConvertibleEnum b);
541 
560 template <typename Enum, typename ConvertibleEnum>
561 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
562 operator&(Enum a, ConvertibleEnum b);
563 
582 template <typename ConvertibleEnum, typename Enum>
583 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
584 operator&(ConvertibleEnum a, Enum b);
585 
604 template <typename Enum, typename ConvertibleEnum>
605 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
606 operator&=(Enum & a, ConvertibleEnum b);
607 
626 template <typename Enum, typename ConvertibleEnum>
627 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
628 operator^(Enum a, ConvertibleEnum b);
629 
648 template <typename ConvertibleEnum, typename Enum>
649 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
650 operator^(ConvertibleEnum a, Enum b);
651 
670 template <typename Enum, typename ConvertibleEnum>
671 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
672 operator^=(Enum & a, ConvertibleEnum b);
673 
674 
675 } // namespace glbinding
676 
677 
Contains all the classes of glbinding.
Break condition for the is_member_of_SharedBitfield metaprogramming.
Definition: SharedBitfield.h:34
A representation of a bitfield value that could be member of multiple bitfield types as allowed in Op...
Definition: SharedBitfield.h:18
typename SharedBitfield< Types... >::UnderlyingType UnderlyingType
inherit UnderlyingType declaration
Definition: SharedBitfield.h:326
Invalid SharedBitfield class as it contains no valid bitfield types.
Definition: SharedBitfield.h:152
GLBINDING_API CallbackMask & operator^=(CallbackMask &a, CallbackMask b)
External operator for bit-wise &#39;xor&#39; assignment of CallbackMasks.
T UnderlyingType
Propagate underlying type.
Definition: SharedBitfield.h:124
GLBINDING_API CallbackMask operator^(CallbackMask a, CallbackMask b)
External operator for bit-wise &#39;xor&#39; of CallbackMasks.
GLBINDING_API CallbackMask operator &(CallbackMask a, CallbackMask b)
External operator for bit-wise &#39;and&#39; of CallbackMasks.
The base class of a SharedBitfield, containing the actual (and convertible) bitfield value...
Definition: SharedBitfield.h:121
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:106
static const bool value
result of the inclusion test; always false since the list of types to test against is empty ...
Definition: SharedBitfield.h:36
GLBINDING_API CallbackMask & operator|=(CallbackMask &a, CallbackMask b)
External operator for bit-wise &#39;or&#39; assignment of CallbackMasks.
GLBINDING_API CallbackMask operator|(CallbackMask a, CallbackMask b)
External operator for bit-wise &#39;or&#39; of CallbackMasks.
Break condition for the SharedBitfield type concatenation.
Definition: SharedBitfield.h:63
T m_value
The value of the SharedBitfield.
Definition: SharedBitfield.h:144
Break condition for the SharedBitfield intersection.
Definition: SharedBitfield.h:87
GLBINDING_API CallbackMask & operator &=(CallbackMask &a, CallbackMask b)
External operator for bit-wise &#39;and&#39; assignment of CallbackMasks.
typename SharedBitfieldBase< typename std::underlying_type< Type >::type >::UnderlyingType UnderlyingType
inherit UnderlyingType declaration
Definition: SharedBitfield.h:167