1717#define CORE_UTIL_V2_DETAIL_POLYFILL_HPP
1818
1919namespace polyfill {
20+ // From ARM Compiler armcc User Guide {
21+ // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472k/chr1407404265784.html
2022template < class T > struct remove_reference {typedef T type;};
2123template < class T > struct remove_reference <T&> {typedef T type;};
2224template < class T > struct remove_reference <T&&> {typedef T type;};
@@ -34,6 +36,9 @@ forward(typename remove_reference<T>::type& a) noexcept
3436{
3537 return static_cast <T&&>(a);
3638}
39+ // / } From ARM Compiler armcc User Guide
40+
41+
3742template <class T >
3843T&&
3944forward (typename remove_reference<T>::type&& a) noexcept
@@ -64,7 +69,6 @@ struct conditional<false, T0, T1> {
6469 using type = T1;
6570};
6671
67-
6872template <bool , typename T = void >
6973struct enable_if_impl {};
7074
@@ -76,9 +80,6 @@ struct enable_if_impl<true, T> {
7680template <bool B, typename T = void >
7781struct enable_if : public enable_if_impl <B, T> {};
7882
79- template <class Condition , typename T = void >
80- struct enable_if_c : public enable_if_impl <Condition::value, T> {};
81-
8283template <typename T0, typename T1>
8384struct align_gt {
8485 static constexpr bool value = __alignof__(T0) > __alignof__ (T1);
@@ -95,7 +96,7 @@ struct enable_if_align_le : enable_if<align_le<T0,T1>::value, T> {};
9596
9697
9798
98- template <size_t I, typename T0, typename ... T>
99+ template <unsigned I, typename T0, typename ... T>
99100struct tuple_element {
100101 using type = typename tuple_element<I-1 ,T...>::type;
101102};
@@ -105,62 +106,46 @@ struct tuple_element<0,T0,T...> {
105106 using type = T0;
106107};
107108
108- template <typename Enable, typename ... T>
109+ template <typename ... T>
109110struct tuple_impl ;
110111
111112template <typename T0>
112- struct tuple_impl <void , T0> {
113+ struct tuple_impl <T0> {
113114 T0 t0;
114115 tuple_impl (const T0 &t0) : t0(forward<const T0 &>(t0)) {}
115- template <size_t I>
116+ template <unsigned I>
116117 typename tuple_element<I,T0>::type & get () {
117118 static_assert (I == 0 , " tuple range exceeded" );
118119 return t0;
119120 }
120121};
121122
122- template <typename T0, typename T1, typename ... T>
123- struct tuple_impl <typename enable_if_align_gt<T0, T1>::type, T0, T1 , T...> {
123+ template <typename T0, typename ... T>
124+ struct tuple_impl <T0 , T...> {
124125 T0 t0;
125- tuple_impl<void , T1, T...> t;
126+ tuple_impl<T...> t;
126127
127- tuple_impl (const T0 &t0, const T1 &t1, const T&... t) :
128- t0 (forward<const T0 &>(t0)), t(forward<const T1 &>(t1), forward< const T &>(t)...) {}
129- template <size_t I>
130- typename enable_if<I != 0 , typename tuple_element<I,T0,T1, T...>::type>::type & get () {
128+ tuple_impl (const T0 &t0, const T&... t) :
129+ t0 (forward<const T0 &>(t0)), t(forward<const T &>(t)...) {}
130+ template <unsigned I>
131+ typename enable_if<I != 0 , typename tuple_element<I, T0, T...>::type>::type & get () {
131132 return t.get <I-1 >();
132133 }
133- template <size_t I>
134- typename enable_if<I == 0 , typename tuple_element<I,T0,T1, T...>::type>::type & get () {
134+ template <unsigned I>
135+ typename enable_if<I == 0 , typename tuple_element<I, T0, T...>::type>::type & get () {
135136 return t0;
136137 }
137138};
138139
139- template <typename T0, typename T1, typename ... T>
140- struct tuple_impl <typename enable_if_align_le<T0, T1>::type, T0, T1, T...> {
141- tuple_impl<void , T1, T...> t;
142- T0 t0;
143-
144- tuple_impl (const T0 &t0, const T1 &t1, const T&... t) :
145- t (forward<const T1 &>(t1), forward<const T &>(t)...), t0(forward<const T0 &>(t0)) {}
146- template <size_t I>
147- typename enable_if<I != 0 , typename tuple_element<I,T0,T1,T...>::type>::type & get () {
148- return t.get <I-1 >();
149- }
150- template <size_t I>
151- typename enable_if<I == 0 , typename tuple_element<I,T0,T1,T...>::type>::type & get () {
152- return t0;
153- }
154- };
155140
156141
157142template <typename ... T>
158- struct tuple : public tuple_impl <void , T...> {
159- tuple (const T&... t) : tuple_impl<void , T...>(forward<const T &>(t)...) {}
143+ struct tuple : public tuple_impl <T...> {
144+ tuple (const T&... t) : tuple_impl<T...>(forward<const T &>(t)...) {}
160145 tuple (){}
161146};
162147
163- template <size_t I, typename ... T>
148+ template <unsigned I, typename ... T>
164149constexpr typename tuple_element<I, T...>::type & get (tuple<T...> & t) {
165150 return t.get <I>();
166151}
0 commit comments