13 template <
size_t I,
typename T>
31 template <std::size_t...>
43 template <
typename S1,
typename S2>
46 template <std::size_t... I1, std::size_t... I2>
51 template <
typename S1,
typename S2>
55 template <std::
size_t N>
57 template <std::
size_t N>
60 template <std::
size_t N>
62 :
concat_t<make_index_sequence_t<N/2>,
63 make_index_sequence_t<N - N/2>>
69 template <std::
size_t off,
typename S2>
72 template <std::size_t off, std::size_t... I>
87 template <std::
size_t S, std::
size_t L>
93 template <std::
size_t S>
95 template <std::
size_t S>
102 template <std::
size_t S, std::
size_t E>
107 template <std::
size_t S, std::
size_t E>
116 template <
typename S1,
typename S2>
119 template <std::size_t... I1, std::size_t... I2>
123 template <
typename S1,
typename S2>
141 template <
typename S1,
typename S2>
144 template <
typename S1,
typename S2>
149 template <std::size_t I1_1, std::size_t... I1, std::size_t... I2>
157 template <std::size_t I1_1, std::size_t I2_1,
158 std::size_t... I1, std::size_t... I2>
168 template <std::size_t I1_1, std::size_t... I1>
190 template <std::
size_t N, std::
size_t Gap>
202 template <
typename Fun,
typename... Ts>
204 for_(
const std::tuple<Ts...>& ts, Fun f)
209 template <
typename Fun,
typename... Ts,
size_t... I>
212 const std::tuple<Ts...>& ts,
215 using swallow =
int[];
216 (
void) swallow{ (f(std::get<I>(ts)), 0)... };
221 template <
typename Fun,
typename... Ts>
223 map(
const std::tuple<Ts...>& ts, Fun f)
229 template <
typename Fun,
typename... Ts,
size_t... I>
232 const std::tuple<Ts...>& ts,
235 return std::make_tuple(f(std::get<I>(ts))...);
240 template <
typename Fun,
typename... Args>
242 apply(Fun f,
const std::tuple<Args...>& args)
249 template <
typename Fun,
typename... Args,
size_t... I>
252 const std::tuple<Args...>& args,
255 -> decltype(f(std::get<I>(args)...))
257 return f(std::get<I>(args)...);
263 template <
typename... Funs,
typename... Args>
265 apply(
const std::tuple<Funs...>& funs,
const std::tuple<Args...>& args)
267 static_assert(
sizeof...(Funs) ==
sizeof...(Args),
268 "tuples of functions and arguments of different sizes");
274 template <
typename... Funs,
typename... Args,
size_t... I>
277 const std::tuple<Args...>& args,
280 return std::make_tuple(std::get<I>(funs)(std::get<I>(args))...);
286 template <
typename Fun,
typename... Objs,
typename... Args>
289 const std::tuple<Objs...>& objs,
const std::tuple<Args...>& args)
291 static_assert(
sizeof...(Objs) ==
sizeof...(Args),
292 "tuples of objects and arguments of different sizes");
297 template <
typename Fun,
typename... Objs,
typename... Args,
size_t... I>
300 const std::tuple<Objs...>& objs,
301 const std::tuple<Args...>& args,
304 return std::make_tuple(fun(std::get<I>(objs), std::get<I>(args))...);
317 template <
typename Fun>
324 template <
typename Fun,
325 typename Cont,
typename... Conts>
328 const Cont& head,
const Conts&... tails)
330 for (
const typename Cont::value_type& h: head)
331 cross([&](
const typename Conts::value_type&... tails)
336 template <
typename Fun,
typename... Ts,
size_t... I>
339 const std::tuple<Ts...>& ts,
342 cross(f, std::get<I>(ts)...);
345 template <
typename Fun,
typename... Ts>
348 const std::tuple<Ts...>& ts)
359 template <
typename... Ts>
367 template <
typename... Ts, std::size_t... I>
370 -> decltype(std::make_tuple(std::get<
sizeof...(Ts) - 1 - I>(t)...))
372 return std::make_tuple(std::get<
sizeof...(Ts) - 1 - I>(t)...);
377 #if VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER 378 template <
typename... Ts>
381 -> decltype(std::make_tuple(std::forward<Ts>(ts)...))
383 return std::make_tuple(std::forward<Ts>(ts)...);
386 template <
typename... Ts>
389 -> decltype(
reverse_tuple(std::make_tuple(std::forward<Ts>(ts)...)))
391 return reverse_tuple(std::make_tuple(std::forward<Ts>(ts)...));
400 template <
typename Tuple, std::
size_t N>
403 static void print(
const Tuple& t, std::ostream& o)
406 o <<
", " << std::get<N-1>(t);
410 template <
typename Tuple>
413 static void print(
const Tuple& t, std::ostream& o)
419 template <
typename... Args>
420 std::ostream&
print(
const std::tuple<Args...>& args, std::ostream& o)
433 template <
bool c,
typename T1,
typename T2>
436 template <
typename T1,
typename T2>
439 template <
typename C,
typename T1,
typename T2>
443 template <
bool c,
typename F1,
typename F2>
446 template <
typename C,
typename F1,
typename F2>
450 template <
typename... F>
453 template <
typename F1,
typename... F>
454 struct and_<F1, F...> :
eval_if<F1, and_<F...>, std::false_type>::type {};
456 template <
typename F1>
457 struct and_<F1> :
eval_if<F1, std::true_type, std::false_type>::type {};
463 template <
typename... F>
466 template <
typename F1,
typename... F>
467 struct or_<F1, F...> :
eval_if<F1, std::true_type, or_<F...>>::type { };
469 template <
typename F1>
470 struct or_<F1> :
eval_if<F1, std::true_type, std::false_type>::type { };
491 template <
typename... Bool>
492 bool all(Bool&&... values)
495 using swallow =
int[];
498 (res = res && values, 0)...
508 template <
typename... Bool>
512 using swallow =
int[];
515 (res = res || values, 0)...
529 template <
typename... Elements>
541 template <std::size_t... I>
546 using swallow =
int[];
constexpr bool any_()
Static evaluation of the 'or' of the template parameters.
concat_sequence< make_index_range_t< 0, Gap >, make_index_range_t< Gap+1, N > > punched_sequence
An index sequence with a gap.
auto map_impl_(Fun f, const std::tuple< Ts... > &ts, index_sequence< I... >)
void cross_tuple_(Fun f, const std::tuple< Ts... > &ts, index_sequence< I... >)
static std::size_t hash_(const value_t &v, vcsn::detail::index_sequence< I... >)
auto apply_impl_(Fun f, const std::tuple< Args... > &args, index_sequence< I... >) -> decltype(f(std::get< I >(args)...))
void cross_tuple(Fun f, const std::tuple< Ts... > &ts)
concat_sequence< index_sequence< I1_1 >, sequence_difference< index_sequence< I1... >, index_sequence< I2_1, I2... > >> type
concat_sequence< index_sequence< I1_1 >, sequence_difference< index_sequence< I1... >, index_sequence<> >> type
bool operator()(Bool &&... values)
typename index_sequence_difference< typename S1::type, typename S2::type >::type sequence_difference
auto tuple(const Auts &... as)
Build the (accessible part of the) tuple.
And condition on several typenames.
Concat two sequences of size_t, adding the size of the first.
typename std::tuple_element< I, T >::type tuple_element_t
C++14.
auto make_gcc_tuple(Ts &&... ts) -> decltype(reverse_tuple(std::make_tuple(std::forward< Ts >(ts)...)))
Same as make_tuple, unless the evaluation of arguments if right-to-left, in which case reverse the re...
Build the static sequence of size_t [0, N[.
Concatenate two static sequences of size_t.
Whether some of the values evaluate as true.
std::ostream & print(const std::tuple< Args... > &args, std::ostream &o)
typename make_index_sequence< N >::type make_index_sequence_t
std::string type(const automaton &a)
The implementation type of a.
auto reverse_tuple(const std::tuple< Ts... > &t) -> decltype(reverse_tuple(t, make_index_sequence< sizeof...(Ts)>()))
sequence_difference< index_sequence< I1... >, index_sequence< I2... > > type
std::tuple< Elements... > value_t
auto apply(Fun f, const std::tuple< Args... > &args) -> decltype(apply_impl_(f, args, make_index_sequence< sizeof...(Args)>()))
Unpack a tuple, and pass its content as argument to a funtion.
typename concat_index_sequence< S1, S2 >::type concat_sequence
The list containing all the elements of I1 (contiguous sequence from 0 to N) not present in I2 (arbit...
typename make_index_range< S, E >::type make_index_range_t
ValueSet::value_t tuple(const ValueSet &vs, const typename ValueSets::value_t &... v)
std::size_t operator()(const value_t &v) const
typename index_sequence<>::type type
static void print(const Tuple &t, std::ostream &o)
Or condition on several typenames.
static void print(const Tuple &t, std::ostream &o)
void hash_combine(std::size_t &seed, const T &v)
Test if (c) then F1 else F2 and get the value.
void for_(const std::tuple< Ts... > &ts, Fun f)
Run function f on each member of ts.
auto map(const std::tuple< Ts... > &ts, Fun f) -> decltype(map_tuple_(f, ts, make_index_sequence< sizeof...(Ts)>()))
Map a function on a tuple, return tuple of the results.
void cross(Fun f)
Variadic Cartesian product of containers.
bool all(Bool &&... values)
Whether all the values evaluate as true.