Vcsn  2.1
Be Rational
tuple.hh
Go to the documentation of this file.
1 #pragma once
2 
3 namespace vcsn
4 {
5  /*-----------------------------.
6  | tuple_context(context...). |
7  `-----------------------------*/
8 
9  template <typename... Ctx>
10  auto
11  tuple_context(Ctx&&... ctx)
14  {
15  auto ls = make_tupleset(*ctx.labelset()...);
16  auto ws = join(*ctx.weightset()...);
17  return {ls, ws};
18  }
19 
20 
21  /*------------------------.
22  | tuple(expression...). |
23  `------------------------*/
24 
25  template <typename ValueSet, typename... ValueSets>
26  inline
27  typename ValueSet::value_t
28  tuple(const ValueSet& vs,
29  const typename ValueSets::value_t&... v)
30  {
31  return vs.tuple(v...);
32  }
33 
34  /*-----------------------------------------.
35  | tuple_expressionset(expressionset...). |
36  `-----------------------------------------*/
37 
38  template <typename... ExpSets>
39  auto
40  tuple_expressionset(const ExpSets&... rss)
41  -> expressionset<decltype(tuple_context(rss.context()...))>
42  {
43  auto ctx = tuple_context(rss.context()...);
44  auto ids = join(rss.identities()...);
45  return {ctx, ids};
46  }
47 
48  /*------------------------.
49  | tuple(expression...). |
50  `------------------------*/
51 
52  namespace dyn
53  {
54  namespace detail
55  {
57  template <typename ExpSets, size_t... I>
59  tuple_(const std::vector<expression>& es,
61  {
62  auto rs
64  (es[I]
65  ->template as<tuple_element_t<I, ExpSets>>()
66  .expressionset()...);
67  return
69  (rs,
71  (rs,
72  es[I]
73  ->template as<tuple_element_t<I, ExpSets>>()
74  .expression()...));
75  }
76 
78  template <typename ExpSets>
80  tuple_expression(const std::vector<expression>& es)
81  {
82  auto indices
84  return tuple_<ExpSets>(es, indices);
85  }
86  }
87  }
88 }
expression tuple_(const std::vector< expression > &es, vcsn::detail::index_sequence< I...>)
Bridge helper.
Definition: tuple.hh:59
auto join(const ValueSet &vs) -> ValueSet
The join of a single valueset.
Definition: join.hh:44
auto tuple_expressionset(const ExpSets &...rss) -> expressionset< decltype(tuple_context(rss.context()...))>
Definition: tuple.hh:40
expression tuple_expression(const std::vector< expression > &es)
Bridge (tuple).
Definition: tuple.hh:80
ValueSet::value_t tuple(const ValueSet &vs, const typename ValueSets::value_t &...v)
Definition: tuple.hh:28
static dyn::context ctx(const driver &d)
Get the context of the driver.
Definition: parse.cc:80
Provide a variadic mul on top of a binary mul(), and one().
Definition: fwd.hh:46
static identities ids(const driver &d)
Get the identities of the driver.
Definition: parse.cc:87
auto tuple_context(Ctx &&...ctx) -> context< tupleset< labelset_t_of< Ctx >...>, join_t< weightset_t_of< Ctx >...>>
Definition: tuple.hh:11
decltype(join(std::declval< ValueSets >()...)) join_t
The type of the join of the ValueSets.
Definition: join.hh:79
typename std::tuple_element< I, T >::type tuple_element_t
C++14.
Definition: tuple.hh:14
weightset_mixin< rat::expressionset_impl< Context >> expressionset
Definition: fwd.hh:200
tupleset< ValueSets...> make_tupleset(const ValueSets &...vss)
Definition: tupleset.hh:982
auto rs
Definition: lift.hh:151
expression make_expression(const ExpSet &rs, const typename ExpSet::value_t &r)
Definition: expression.hh:83
std::shared_ptr< detail::expression_base > expression
Definition: expression.hh:78