1 #ifndef PROTON_TUPLE_HEADER
2 #define PROTON_TUPLE_HEADER
13 #include <initializer_list>
25 template<
typename T, std::
size_t I>
27 static void output(std::ostream& s, T&& t)
29 output_tuple<T, I-1>::output(s,t);
30 s <<
", " << std::get<I-1>(t);
35 struct output_tuple<T, 1> {
36 static void output(std::ostream& s, T&& t)
43 struct output_tuple<T, 0> {
44 static void output(std::ostream& s, T&& t)
49 constexpr
long fix_index(
long i,
long size)
65 constexpr
long sub_index(
long i,
long size)
81 constexpr
long get_index(
long i,
long size)
97 template<
long i,
typename ...T>
99 static_assert(i>=0,
"out of range");
100 const std::tuple<T...>* p;
101 typedef decltype(std::get<i>(*p)) type;
104 constexpr
long fix_size(
long begin,
long end,
long size)
106 return fix_index(begin,size)>fix_index(end,size)?
109 fix_index(end,size)-fix_index(begin,size);
112 template<
typename T,
size_t begin,
size_t size>
115 static_assert(begin < std::tuple_size<T>::value,
"out of range");
117 std::tuple<typename std::tuple_element<begin, T>::type> *p;
118 typedef typename sub<T, begin+1,
119 (begin+size > std::tuple_size<T>::value ?
120 (std::tuple_size<T>::value-begin-1)
126 typedef decltype(std::tuple_cat(*p,*q)) type;
129 template<typename T,
size_t begin>
130 struct sub<T, begin, 0>{
131 typedef std::tuple<> type;
134 template<
typename T,
size_t begin>
135 struct sub<T,begin,1>{
136 static_assert(begin < std::tuple_size<T>::value,
"out of range");
138 typedef std::tuple<typename std::tuple_element<begin,T>::type > type;
142 template<
typename ...T>
143 struct len_t<std::tuple<T...> >{
144 static size_t result(
const std::tuple<T...>& x)
159 template<
long index,
typename ...T>
160 typename detail::at_index<detail::get_index(index,
sizeof...(T)),T...>::type
161 at(
const std::tuple<T...>& x)
163 return std::get<detail::get_index(index,
sizeof...(T))>(x);
169 typename detail::sub<std::tuple<T...>, detail::fix_index(begin,
sizeof...(T)),
170 detail::fix_size(begin,end,
sizeof...(T))>::type
171 sub(
const std::tuple<T...>& x)
173 typedef typename detail::sub<std::tuple<T...>, detail::fix_index(begin,
sizeof...(T)),
174 detail::fix_size(begin,end,
sizeof...(T))>::type ret_t;
175 return ret_t(*reinterpret_cast<const ret_t*>(&std::get<(detail::sub_index(end-1,
sizeof...(T)))>(x)));
183 template <
typename ...T>
184 std::ostream& operator<<(std::ostream& s,
const std::tuple<T...>& x)
187 detail::output_tuple<decltype(x),
sizeof...(T)>::output(s,x);
192 template <
typename ...T>
193 std::wostream& operator<<(std::wostream& s,
const std::tuple<T...>& x)
196 detail::output_tuple<decltype(x),
sizeof...(T)>::output(s,x);
203 template<
typename T2,
typename ...T1>
204 auto operator+(
const std::tuple<T1...>& x, T2&& y) -> decltype(std::tuple_cat(x,y))
206 return std::tuple_cat(x,y);
209 template<
typename T2,
typename ...T1>
210 auto operator+(std::tuple<T1...>&& x, T2&& y) -> decltype(std::tuple_cat(x,y))
212 return std::tuple_cat(x,y);
217 template<
typename ...T>
218 auto _t(T&& ...x) -> decltype(std::make_tuple(x...))
220 return std::make_tuple(x...);
225 template<
typename ...T>
226 auto _f(T&& ...x) -> decltype(std::forward_as_tuple(x...))
228 return std::forward_as_tuple(x...);
234 template<
typename T,
typename A>
235 vector_<T,A>
operator*(
const std::vector<T,A>& s,
size_t n)
238 r.reserve(s.size()*n);
239 for(
size_t i=0; i<n; i++)
246 template<
typename T,
typename A>
247 vector_<T,A>
operator*(
size_t n,
const std::vector<T,A>& s)
259 #endif // PROTON_TUPLE_HEADER