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