2 * Copyright 2008-2012 NVIDIA Corporation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <thrust/detail/type_traits.h>
27 namespace minimum_type_detail
31 // Returns the minimum type or is empty
32 // if T1 and T2 are unrelated.
34 template <typename T1, typename T2, bool GreaterEqual, bool LessEqual> struct minimum_type_impl {};
36 template <typename T1, typename T2>
37 struct minimum_type_impl<T1,T2,true,false>
40 }; // end minimum_type_impl
42 template <typename T1, typename T2>
43 struct minimum_type_impl<T1,T2,false,true>
46 }; // end minimum_type_impl
48 template <typename T1, typename T2>
49 struct minimum_type_impl<T1,T2,true,true>
52 }; // end minimum_type_impl
54 template <typename T1, typename T2>
55 struct primitive_minimum_type
56 : minimum_type_detail::minimum_type_impl<
59 ::thrust::detail::is_convertible<T1,T2>::value,
60 ::thrust::detail::is_convertible<T2,T1>::value
63 }; // end primitive_minimum_type
65 // because some types are not convertible (even to themselves)
66 // specialize primitive_minimum_type for when both types are identical
68 struct primitive_minimum_type<T,T>
71 }; // end primitive_minimum_type
73 // XXX this belongs somewhere more general
76 template<typename T> operator T (void);
79 } // end minimum_type_detail
82 typename T2 = minimum_type_detail::any_conversion,
83 typename T3 = minimum_type_detail::any_conversion,
84 typename T4 = minimum_type_detail::any_conversion,
85 typename T5 = minimum_type_detail::any_conversion,
86 typename T6 = minimum_type_detail::any_conversion,
87 typename T7 = minimum_type_detail::any_conversion,
88 typename T8 = minimum_type_detail::any_conversion,
89 typename T9 = minimum_type_detail::any_conversion,
90 typename T10 = minimum_type_detail::any_conversion,
91 typename T11 = minimum_type_detail::any_conversion,
92 typename T12 = minimum_type_detail::any_conversion,
93 typename T13 = minimum_type_detail::any_conversion,
94 typename T14 = minimum_type_detail::any_conversion,
95 typename T15 = minimum_type_detail::any_conversion,
96 typename T16 = minimum_type_detail::any_conversion>
100 template<typename T1, typename T2>
101 struct minimum_type<T1,T2>
102 : minimum_type_detail::primitive_minimum_type<T1,T2>
105 template<typename T1, typename T2>
106 struct lazy_minimum_type
113 // carefully avoid referring to a nested ::type which may not exist
114 template<typename T1, typename T2, typename T3, typename T4,
115 typename T5, typename T6, typename T7, typename T8,
116 typename T9, typename T10, typename T11, typename T12,
117 typename T13, typename T14, typename T15, typename T16>