Project
Loading...
Searching...
No Matches
GPUCommonTypeTraits.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#ifndef GPUCOMMONTYPETRAITS_H
16#define GPUCOMMONTYPETRAITS_H
17
18#include "GPUCommonDef.h"
19
20#if !defined(GPUCA_GPUCODE_DEVICE) || defined(__CUDACC__) || defined(__HIPCC__) // TODO: Get rid of GPUCommonTypeTraits once OpenCL supports <type_traits>
21#ifndef GPUCA_GPUCODE_COMPILEKERNELS
22#include <type_traits>
23#endif
24#else // OpenCL C++ and Metal, neither of which provides <type_traits>
25// Spelled for MSL, which OpenCL C++ also accepts, so both backends share one implementation:
26// enum values because program scope variables must be constant (MSL 4.1 spec, sec. 4.2), and
27// is_pointer / is_member_pointer forward rather than inherit because MSL has no derived classes
28// (sec. 1.5.4). Bare T* / T& need no address space: a partial specialization matches them all.
29#ifdef __METAL__
30#define GPUCA_TT_PROGRAMSCOPE constant
31#else
32#define GPUCA_TT_PROGRAMSCOPE // not empty-by-default: in OpenCL 'constant' would mean __constant
33#endif
34namespace std
35{
36template <bool B, class T, class F>
37struct conditional {
38 typedef T type;
39};
40template <class T, class F>
41struct conditional<false, T, F> {
42 typedef F type;
43};
44template <bool B, class T, class F>
45using conditional_t = typename conditional<B, T, F>::type;
46
47template <class T, class U>
48struct is_same {
49 enum { value = false };
50};
51template <class T>
52struct is_same<T, T> {
53 enum { value = true };
54};
55template <class T, class U>
56GPUCA_TT_PROGRAMSCOPE static constexpr bool is_same_v = is_same<T, U>::value;
57
58template <bool B, class T = void>
59struct enable_if {
60};
61template <class T>
62struct enable_if<true, T> {
63 typedef T type;
64};
65
66template <class T>
67struct remove_cv {
68 typedef T type;
69};
70template <class T>
71struct remove_cv<const T> {
72 typedef T type;
73};
74template <class T>
75struct remove_cv<volatile T> {
76 typedef T type;
77};
78template <class T>
79struct remove_cv<const volatile T> {
80 typedef T type;
81};
82template <class T>
83using remove_cv_t = typename remove_cv<T>::type;
84
85template <class T>
86struct remove_const {
87 typedef T type;
88};
89template <class T>
90struct remove_const<const T> {
91 typedef T type;
92};
93template <class T>
94using remove_const_t = typename remove_const<T>::type;
95
96template <class T>
97struct remove_volatile {
98 typedef T type;
99};
100template <class T>
101struct remove_volatile<volatile T> {
102 typedef T type;
103};
104template <class T>
105using remove_volatile_t = typename remove_volatile<T>::type;
106
107template <class T>
108struct is_pointer_t {
109 enum { value = false };
110};
111template <class T>
112struct is_pointer_t<T*> {
113 enum { value = true };
114};
115template <class T>
116struct is_pointer {
117#ifdef __METAL__
118 // A bare T* partial specialization does not match a pointer type deduced from
119 // an argument, which carries its address space; metal::is_pointer does.
120 enum { value = metal::is_pointer<T>::value };
121#else
122 enum { value = is_pointer_t<typename std::remove_cv<T>::type>::value };
123#endif
124};
125
126template <class T>
127struct remove_reference {
128 typedef T type;
129};
130template <class T>
131struct remove_reference<T&> {
132 typedef T type;
133};
134template <class T>
135struct remove_reference<T&&> {
136 typedef T type;
137};
138template <class T>
139using remove_reference_t = typename remove_reference<T>::type;
140
141template <class T>
142struct is_member_pointer_helper {
143 enum { value = false };
144};
145template <class T, class U>
146struct is_member_pointer_helper<T U::*> {
147 enum { value = true };
148};
149template <class T>
150struct is_member_pointer {
151 enum { value = is_member_pointer_helper<typename std::remove_cv<T>::type>::value };
152};
153template <class T>
154GPUCA_TT_PROGRAMSCOPE static constexpr bool is_member_pointer_v = is_member_pointer<T>::value;
155
156} // namespace std
157#undef GPUCA_TT_PROGRAMSCOPE
158#endif
159
160#endif
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
return true