xref: /aosp_15_r20/external/swiftshader/src/Reactor/Traits.inl (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker// Copyright 2019 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker//
3*03ce13f7SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker//
7*03ce13f7SAndroid Build Coastguard Worker//    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker//
9*03ce13f7SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker// limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker#ifndef rr_Traits_inl
16*03ce13f7SAndroid Build Coastguard Worker#define rr_Traits_inl
17*03ce13f7SAndroid Build Coastguard Worker
18*03ce13f7SAndroid Build Coastguard Workernamespace rr {
19*03ce13f7SAndroid Build Coastguard Worker
20*03ce13f7SAndroid Build Coastguard Worker// Non-specialized implementation of CToReactorPtr::cast() defaults to
21*03ce13f7SAndroid Build Coastguard Worker// returning a ConstantPointer for v.
22*03ce13f7SAndroid Build Coastguard Workertemplate<typename T, typename ENABLE>
23*03ce13f7SAndroid Build Coastguard WorkerPointer<Byte> CToReactorPtr<T, ENABLE>::cast(const T *v)
24*03ce13f7SAndroid Build Coastguard Worker{
25*03ce13f7SAndroid Build Coastguard Worker	return ConstantPointer(v);
26*03ce13f7SAndroid Build Coastguard Worker}
27*03ce13f7SAndroid Build Coastguard Worker
28*03ce13f7SAndroid Build Coastguard Worker// CToReactorPtr specialization for T types that have a CToReactorT<>
29*03ce13f7SAndroid Build Coastguard Worker// specialization.
30*03ce13f7SAndroid Build Coastguard Workertemplate<typename T>
31*03ce13f7SAndroid Build Coastguard WorkerPointer<CToReactorT<T>>
32*03ce13f7SAndroid Build Coastguard WorkerCToReactorPtr<T, std::enable_if_t<HasReactorType<T>::value>>::cast(const T *v)
33*03ce13f7SAndroid Build Coastguard Worker{
34*03ce13f7SAndroid Build Coastguard Worker	return type(v);
35*03ce13f7SAndroid Build Coastguard Worker}
36*03ce13f7SAndroid Build Coastguard Worker
37*03ce13f7SAndroid Build Coastguard Worker// CToReactorPtr specialization for void*.
38*03ce13f7SAndroid Build Coastguard WorkerPointer<Byte> CToReactorPtr<void, void>::cast(const void *v)
39*03ce13f7SAndroid Build Coastguard Worker{
40*03ce13f7SAndroid Build Coastguard Worker	return ConstantPointer(v);
41*03ce13f7SAndroid Build Coastguard Worker}
42*03ce13f7SAndroid Build Coastguard Worker
43*03ce13f7SAndroid Build Coastguard Worker// CToReactorPtrT specialization for function pointer types.
44*03ce13f7SAndroid Build Coastguard Workertemplate<typename T>
45*03ce13f7SAndroid Build Coastguard WorkerPointer<Byte>
46*03ce13f7SAndroid Build Coastguard WorkerCToReactorPtr<T, std::enable_if_t<std::is_function<T>::value>>::cast(T *v)
47*03ce13f7SAndroid Build Coastguard Worker{
48*03ce13f7SAndroid Build Coastguard Worker	return ConstantPointer(v);
49*03ce13f7SAndroid Build Coastguard Worker}
50*03ce13f7SAndroid Build Coastguard Worker
51*03ce13f7SAndroid Build Coastguard Worker// CToReactor specialization for pointer types.
52*03ce13f7SAndroid Build Coastguard Workertemplate<typename T>
53*03ce13f7SAndroid Build Coastguard WorkerCToReactorPtrT<typename std::remove_pointer<T>::type>
54*03ce13f7SAndroid Build Coastguard WorkerCToReactor<T, std::enable_if_t<std::is_pointer<T>::value>>::cast(T v)
55*03ce13f7SAndroid Build Coastguard Worker{
56*03ce13f7SAndroid Build Coastguard Worker	return CToReactorPtr<elem>::cast(v);
57*03ce13f7SAndroid Build Coastguard Worker}
58*03ce13f7SAndroid Build Coastguard Worker
59*03ce13f7SAndroid Build Coastguard Worker// CToReactor specialization for enum types.
60*03ce13f7SAndroid Build Coastguard Workertemplate<typename T>
61*03ce13f7SAndroid Build Coastguard WorkerCToReactorT<typename std::underlying_type<T>::type>
62*03ce13f7SAndroid Build Coastguard WorkerCToReactor<T, std::enable_if_t<std::is_enum<T>::value>>::cast(T v)
63*03ce13f7SAndroid Build Coastguard Worker{
64*03ce13f7SAndroid Build Coastguard Worker	return CToReactor<underlying>::cast(v);
65*03ce13f7SAndroid Build Coastguard Worker}
66*03ce13f7SAndroid Build Coastguard Worker
67*03ce13f7SAndroid Build Coastguard Worker}  // namespace rr
68*03ce13f7SAndroid Build Coastguard Worker
69*03ce13f7SAndroid Build Coastguard Worker#endif  // rr_Traits_inl
70