xref: /aosp_15_r20/frameworks/native/services/sensorservice/traits.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #ifndef ANDROID_TRAITS_H
18*38e8c45fSAndroid Build Coastguard Worker #define ANDROID_TRAITS_H
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker // -----------------------------------------------------------------------
21*38e8c45fSAndroid Build Coastguard Worker // Typelists
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker namespace android {
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker // end-of-list marker
26*38e8c45fSAndroid Build Coastguard Worker class NullType {};
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker // type-list node
29*38e8c45fSAndroid Build Coastguard Worker template <typename T, typename U>
30*38e8c45fSAndroid Build Coastguard Worker struct TypeList {
31*38e8c45fSAndroid Build Coastguard Worker     typedef T Head;
32*38e8c45fSAndroid Build Coastguard Worker     typedef U Tail;
33*38e8c45fSAndroid Build Coastguard Worker };
34*38e8c45fSAndroid Build Coastguard Worker 
35*38e8c45fSAndroid Build Coastguard Worker // helpers to build typelists
36*38e8c45fSAndroid Build Coastguard Worker #define TYPELIST_1(T1) TypeList<T1, NullType>
37*38e8c45fSAndroid Build Coastguard Worker #define TYPELIST_2(T1, T2) TypeList<T1, TYPELIST_1(T2)>
38*38e8c45fSAndroid Build Coastguard Worker #define TYPELIST_3(T1, T2, T3) TypeList<T1, TYPELIST_2(T2, T3)>
39*38e8c45fSAndroid Build Coastguard Worker #define TYPELIST_4(T1, T2, T3, T4) TypeList<T1, TYPELIST_3(T2, T3, T4)>
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker // typelists algorithms
42*38e8c45fSAndroid Build Coastguard Worker namespace TL {
43*38e8c45fSAndroid Build Coastguard Worker template <typename TList, typename T> struct IndexOf;
44*38e8c45fSAndroid Build Coastguard Worker 
45*38e8c45fSAndroid Build Coastguard Worker template <typename T>
46*38e8c45fSAndroid Build Coastguard Worker struct IndexOf<NullType, T> {
47*38e8c45fSAndroid Build Coastguard Worker     enum { value = -1 };
48*38e8c45fSAndroid Build Coastguard Worker };
49*38e8c45fSAndroid Build Coastguard Worker 
50*38e8c45fSAndroid Build Coastguard Worker template <typename T, typename Tail>
51*38e8c45fSAndroid Build Coastguard Worker struct IndexOf<TypeList<T, Tail>, T> {
52*38e8c45fSAndroid Build Coastguard Worker     enum { value = 0 };
53*38e8c45fSAndroid Build Coastguard Worker };
54*38e8c45fSAndroid Build Coastguard Worker 
55*38e8c45fSAndroid Build Coastguard Worker template <typename Head, typename Tail, typename T>
56*38e8c45fSAndroid Build Coastguard Worker struct IndexOf<TypeList<Head, Tail>, T> {
57*38e8c45fSAndroid Build Coastguard Worker private:
58*38e8c45fSAndroid Build Coastguard Worker     enum { temp = IndexOf<Tail, T>::value };
59*38e8c45fSAndroid Build Coastguard Worker public:
60*38e8c45fSAndroid Build Coastguard Worker     enum { value = temp == -1 ? -1 : 1 + temp };
61*38e8c45fSAndroid Build Coastguard Worker };
62*38e8c45fSAndroid Build Coastguard Worker 
63*38e8c45fSAndroid Build Coastguard Worker }; // namespace TL
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker // type selection based on a boolean
66*38e8c45fSAndroid Build Coastguard Worker template <bool flag, typename T, typename U>
67*38e8c45fSAndroid Build Coastguard Worker struct Select {
68*38e8c45fSAndroid Build Coastguard Worker     typedef T Result;
69*38e8c45fSAndroid Build Coastguard Worker };
70*38e8c45fSAndroid Build Coastguard Worker template <typename T, typename U>
71*38e8c45fSAndroid Build Coastguard Worker struct Select<false, T, U> {
72*38e8c45fSAndroid Build Coastguard Worker     typedef U Result;
73*38e8c45fSAndroid Build Coastguard Worker };
74*38e8c45fSAndroid Build Coastguard Worker 
75*38e8c45fSAndroid Build Coastguard Worker // -----------------------------------------------------------------------
76*38e8c45fSAndroid Build Coastguard Worker // Type traits
77*38e8c45fSAndroid Build Coastguard Worker 
78*38e8c45fSAndroid Build Coastguard Worker template <typename T>
79*38e8c45fSAndroid Build Coastguard Worker class TypeTraits {
80*38e8c45fSAndroid Build Coastguard Worker     typedef TYPELIST_4(
81*38e8c45fSAndroid Build Coastguard Worker             unsigned char, unsigned short,
82*38e8c45fSAndroid Build Coastguard Worker             unsigned int, unsigned long int) UnsignedInts;
83*38e8c45fSAndroid Build Coastguard Worker 
84*38e8c45fSAndroid Build Coastguard Worker     typedef TYPELIST_4(
85*38e8c45fSAndroid Build Coastguard Worker             signed char, signed short,
86*38e8c45fSAndroid Build Coastguard Worker             signed int, signed long int) SignedInts;
87*38e8c45fSAndroid Build Coastguard Worker 
88*38e8c45fSAndroid Build Coastguard Worker     typedef TYPELIST_1(
89*38e8c45fSAndroid Build Coastguard Worker             bool) OtherInts;
90*38e8c45fSAndroid Build Coastguard Worker 
91*38e8c45fSAndroid Build Coastguard Worker     typedef TYPELIST_3(
92*38e8c45fSAndroid Build Coastguard Worker             float, double, long double) Floats;
93*38e8c45fSAndroid Build Coastguard Worker 
94*38e8c45fSAndroid Build Coastguard Worker     template<typename U> struct PointerTraits {
95*38e8c45fSAndroid Build Coastguard Worker         enum { result = false };
96*38e8c45fSAndroid Build Coastguard Worker         typedef NullType PointeeType;
97*38e8c45fSAndroid Build Coastguard Worker     };
98*38e8c45fSAndroid Build Coastguard Worker     template<typename U> struct PointerTraits<U*> {
99*38e8c45fSAndroid Build Coastguard Worker         enum { result = true };
100*38e8c45fSAndroid Build Coastguard Worker         typedef U PointeeType;
101*38e8c45fSAndroid Build Coastguard Worker     };
102*38e8c45fSAndroid Build Coastguard Worker 
103*38e8c45fSAndroid Build Coastguard Worker public:
104*38e8c45fSAndroid Build Coastguard Worker     enum { isStdUnsignedInt = TL::IndexOf<UnsignedInts, T>::value >= 0 };
105*38e8c45fSAndroid Build Coastguard Worker     enum { isStdSignedInt   = TL::IndexOf<SignedInts,   T>::value >= 0 };
106*38e8c45fSAndroid Build Coastguard Worker     enum { isStdIntegral    = TL::IndexOf<OtherInts,    T>::value >= 0 || isStdUnsignedInt || isStdSignedInt };
107*38e8c45fSAndroid Build Coastguard Worker     enum { isStdFloat       = TL::IndexOf<Floats,       T>::value >= 0 };
108*38e8c45fSAndroid Build Coastguard Worker     enum { isPointer        = PointerTraits<T>::result };
109*38e8c45fSAndroid Build Coastguard Worker     enum { isStdArith       = isStdIntegral || isStdFloat };
110*38e8c45fSAndroid Build Coastguard Worker 
111*38e8c45fSAndroid Build Coastguard Worker     // best parameter type for given type
112*38e8c45fSAndroid Build Coastguard Worker     typedef typename Select<isStdArith || isPointer, T, const T&>::Result ParameterType;
113*38e8c45fSAndroid Build Coastguard Worker };
114*38e8c45fSAndroid Build Coastguard Worker 
115*38e8c45fSAndroid Build Coastguard Worker // -----------------------------------------------------------------------
116*38e8c45fSAndroid Build Coastguard Worker }; // namespace android
117*38e8c45fSAndroid Build Coastguard Worker 
118*38e8c45fSAndroid Build Coastguard Worker #endif /* ANDROID_TRAITS_H */
119