Vcsn  2.0
Be Rational
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
tupleset.hh
Go to the documentation of this file.
1 #ifndef VCSN_LABELSET_TUPLESET_HH
2 # define VCSN_LABELSET_TUPLESET_HH
3 
4 # include <iosfwd>
5 # include <istream>
6 # include <set>
7 # include <tuple>
8 
9 # include <vcsn/config.hh> // VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER
10 # include <vcsn/labelset/fwd.hh>
11 # include <vcsn/labelset/labelset.hh>
12 # include <vcsn/misc/escape.hh>
13 # include <vcsn/misc/raise.hh>
14 # include <vcsn/misc/stream.hh>
15 # include <vcsn/misc/tuple.hh>
16 # include <vcsn/misc/cross.hh>
17 # include <vcsn/misc/raise.hh>
18 # include <vcsn/misc/zip.hh>
19 # include <vcsn/weightset/b.hh>
20 
21 namespace vcsn
22 {
23  namespace detail
24  {
29  template <typename Enable = void, typename... ValueSets>
31  {
32  using genset_t = void;
33  using letter_t = void;
34  using word_t = void;
35  };
36 
38  template <typename... ValueSets>
39  struct labelset_types<decltype(pass{typename ValueSets::word_t()...}, void()),
40  ValueSets...>
41  {
42  using genset_t
43  = cross_sequences<decltype(std::declval<ValueSets>().genset())...>;
44  using letter_t = std::tuple<typename ValueSets::letter_t...>;
45  using word_t = std::tuple<typename ValueSets::word_t...>;
46  };
47  }
48 
49  template <typename... ValueSets>
50  using labelset_types = detail::labelset_types<void, ValueSets...>;
51 
56  template <typename... ValueSets>
57  class tupleset
58  {
59  public:
60  using valuesets_t = std::tuple<ValueSets...>;
61  using indices_t = vcsn::detail::make_index_sequence<sizeof...(ValueSets)>;
62  static constexpr indices_t indices{};
63  template <std::size_t... I>
65 
67  template <std::size_t I>
68  using valueset_t = typename std::tuple_element<I, valuesets_t>::type;
69 
70  public:
72 
74  using value_t = std::tuple<typename ValueSets::value_t...>;
75 
77  using letter_t = typename labelset_types<ValueSets...>::letter_t;
79  using genset_t = typename labelset_types<ValueSets...>::genset_t;
81  using word_t = typename labelset_types<ValueSets...>::word_t;
82 
85 
87 
89  : sets_(vs)
90  {}
91 
92  tupleset(ValueSets... ls)
93  : sets_(ls...)
94  {}
95 
96  static std::string sname()
97  {
98  return sname_(indices);
99  }
100 
101  std::string vname(bool full = true) const
102  {
103  return vname_(full, indices);
104  }
105 
106  static constexpr std::size_t size()
107  {
108  return sizeof...(ValueSets);
109  }
110 
111  static constexpr bool
113  {
114  return is_commutative_(indices);
115  }
116 
117  static constexpr bool
119  {
120  return is_idempotent_(indices);
121  }
122 
124  static tupleset make(std::istream& is)
125  {
126  // name: lat<law_char(abc), law_char(xyz)>
127  kind_t::make(is);
128  auto res = make_(is, indices);
129  eat(is, '>');
130  return res;
131  }
132 
134  tupleset
135  join(const tupleset& rhs) const
136  {
137  return join_(rhs, indices);
138  }
139 
141  const valuesets_t& sets() const
142  {
143  return sets_;
144  }
145 
147  template <size_t I>
148  const valueset_t<I>& set() const
149  {
150  return std::get<I>(sets());
151  }
152 
156  bool open(bool o) const
157  {
158  return open_(o, indices);
159  }
160 
162  template <typename... Args>
163  value_t value(const std::tuple<Args...>& args) const
164  {
165  return value_(args, indices);
166  }
167 
169  genset_t
170  genset() const
171  {
172  return genset_(indices);
173  }
174 
175  static constexpr bool is_free()
176  {
177  return is_free_(indices);
178  }
179 
180  private:
182  template <typename Value, std::size_t... I>
183  static auto
184  letters_of_(const Value& v, seq<I...>)
185  -> decltype(zip(valueset_t<I>::letters_of(std::get<I>(v))...))
186  {
187  return zip(valueset_t<I>::letters_of(std::get<I>(v))...);
188  }
189 
190  public:
196  template <typename Value>
197  static auto
198  letters_of(const Value& v)
199  -> decltype(letters_of_(v, indices))
200  {
201  return letters_of_(v, indices);
202  }
203 
205  template <typename... Args>
206  auto
207  word(const std::tuple<Args...>& v) const
208  -> word_t
209  {
210  return word_(v, indices);
211  }
212 
213  static bool
214  equals(const value_t& l, const value_t& r)
215  {
216  return equals_(l, r, indices);
217  }
218 
220  static bool
221  less_than(const value_t& l, const value_t& r)
222  {
223  return less_than_(l, r, indices);
224  }
225 
226  static value_t
228  {
229  return special_(indices);
230  }
231 
232  static bool
233  is_special(const value_t& l)
234  {
235  return is_special_(l, indices);
236  }
237 
238  value_t
239  zero() const
240  {
241  return zero_(indices);
242  }
243 
244  bool
245  is_zero(const value_t& l) const
246  {
247  return is_zero_(l, indices);
248  }
249 
250  static constexpr bool
252  {
253  return has_one_(indices);
254  }
255 
256  static constexpr bool
258  {
259  return is_ratexpset_(indices);
260  }
261 
262  static constexpr bool
264  {
265  return is_letterized_(indices);
266  }
267 
268  static value_t
269  one()
270  {
271  return one_(indices);
272  }
273 
274  static bool
275  is_one(const value_t& l)
276  {
277  return is_one_(l, indices);
278  }
279 
280  static bool
282  {
283  return show_one_(indices);
284  }
285 
286  bool
287  is_letter(const value_t&) const
288  {
289  return false;
290  }
291 
292  value_t
293  add(const value_t& l, const value_t& r) const
294  {
295  return add_(l, r, indices);
296  }
297 
298  value_t
299  mul(const value_t& l, const value_t& r) const
300  {
301  return mul_(l, r, indices);
302  }
303 
304  value_t
305  rdiv(const value_t& l, const value_t& r) const
306  {
307  return rdiv_(l, r, indices);
308  }
309 
310  value_t
311  ldiv(const value_t& l, const value_t& r) const
312  {
313  return ldiv_(l, r, indices);
314  }
315 
317  typename valueset_t<0>::value_t
319  {
320  return lnormalize_here_(v, indices);
321  }
322 
323  value_t
324  star(const value_t& l) const
325  {
326  return star_(l, indices);
327  }
328 
334  template <typename Value>
335  Value
336  delimit(const Value& l) const
337  {
338  return delimit_(l, indices);
339  }
340 
342  template <typename Value>
343  Value
344  undelimit(const Value& l) const
345  {
346  return undelimit_(l, indices);
347  }
348 
349  // FIXME: this needs to be computed.
350  static constexpr star_status_t star_status()
351  {
353  }
354 
355  template <typename LhsValue, typename RhsValue>
356  word_t
357  concat(const LhsValue& l, const RhsValue& r) const
358  {
359  return concat_(l, r, indices);
360  }
361 
362  value_t
363  transpose(const value_t& l) const
364  {
365  return transpose_(l, indices);
366  }
367 
368  static size_t
369  hash(const value_t& v)
370  {
371  return hash_(v, indices);
372  }
373 
374  static value_t
376  {
377  return v;
378  }
379 
380  value_t
381  conv(b, b::value_t v) const
382  {
383  return v ? one() : zero();
384  }
385 
387  template <typename... VS>
388  value_t
390  const typename tupleset<VS...>::value_t& v) const
391  {
392  return conv_(vs, v, indices);
393  }
394 
396  template <typename... VS>
397  value_t
399  const typename nullableset<tupleset<VS...>>::value_t& v) const
400  {
401  return conv(*vs.labelset(), vs.get_value(v));
402  }
403 
405  value_t
406  conv(std::istream& i) const
407  {
408  value_t res = conv_(i, indices);
409  eat(i, ')');
410  return res;
411  }
412 
413  std::set<value_t> convs(std::istream&) const
414  {
415  raise("tupleset: ranges not implemented");
416  }
417 
418  std::ostream&
419  print_set(std::ostream& o, symbol format = symbol{"text"}) const
420  {
421  return print_set_(o, format, indices);
422  }
423 
424  std::ostream&
425  print(const value_t& l, std::ostream& o,
426  symbol format = symbol{"text"}) const
427  {
428  return print_(l, o, format, indices);
429  }
430 
431  private:
432  template <std::size_t... I>
433  static std::string sname_(seq<I...>)
434  {
435  std::string res = "lat<";
436  const char *sep = "";
437  for (auto n: {valueset_t<I>::sname()...})
438  {
439  res += sep;
440  res += n;
441  sep = ", ";
442  }
443  res.push_back('>');
444  return res;
445  }
446 
447  template <std::size_t... I>
448  std::string vname_(bool full, seq<I...>) const
449  {
450  std::string res = "lat<";
451  const char *sep = "";
452  for (auto n: {set<I>().vname(full)...})
453  {
454  res += sep;
455  res += n;
456  sep = ", ";
457  }
458  res.push_back('>');
459  return res;
460  }
461 
462  template <std::size_t... I>
463  static constexpr bool
465  {
466  return all_<valueset_t<I>::is_commutative()...>();
467  }
468 
469  template <std::size_t... I>
470  static constexpr bool
472  {
473  return all_<valueset_t<I>::is_idempotent()...>();
474  }
475 
476  template <std::size_t... I>
477  static tupleset make_(std::istream& i, seq<I...>)
478  {
479 # if VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER
480  return tupleset{(eat_separator_<I>(i, '<', ','),
481  valueset_t<I>::make(i))...};
482 # else
483  return make_gcc_tuple
484  ((eat_separator_<sizeof...(ValueSets)-1 -I>(i, '<', ','),
485  valueset_t<sizeof...(ValueSets)-1 -I>::make(i))...);
486 # endif
487  }
488 
489  template <std::size_t... I>
490  bool open_(bool o, seq<I...>) const
491  {
492  using swallow = int[];
493  (void) swallow { set<I>().open(o)... };
494  std::swap(o, open__);
495  return o;
496  }
497 
498  template <typename... Args, std::size_t... I>
499  value_t value_(const std::tuple<Args...>& args, seq<I...>) const
500  {
501  return value_t{set<I>().value(std::get<I>(args))...};
502  }
503 
504  template <std::size_t... I>
505  genset_t
507  {
508  return cross(set<I>().genset()...);
509  }
510 
511  template <std::size_t... I>
512  static constexpr bool
514  {
515  return all_<valueset_t<I>::is_free()...>();
516  }
517 
518  template <typename... Args, std::size_t... I>
519  word_t
520  word_(const std::tuple<Args...>& l, seq<I...>) const
521  {
522  return word_t{set<I>().word(std::get<I>(l))...};
523  }
524 
525  template <std::size_t... I>
526  static bool
527  equals_(const value_t& l, const value_t& r, seq<I...>)
528  {
529  for (auto n: {valueset_t<I>::equals(std::get<I>(l),
530  std::get<I>(r))...})
531  if (!n)
532  return false;
533  return true;
534  }
535 
536  template <std::size_t... I>
537  static bool
538  less_than_(const value_t& l, const value_t& r, seq<I...>)
539  {
540  for (auto n: {std::make_pair(valueset_t<I>::less_than(std::get<I>(l),
541  std::get<I>(r)),
542  valueset_t<I>::less_than(std::get<I>(r),
543  std::get<I>(l)))...})
544  if (n.first)
545  return true;
546  else if (n.second)
547  return false;
548  return false;
549  }
550 
551  template <std::size_t... I>
552  static std::size_t
554  {
555  std::size_t res = 0;
556  for (auto h: {valueset_t<I>::hash(std::get<I>(v))...})
557  std::hash_combine(res, h);
558  return res;
559  }
560 
561  template <std::size_t... I>
562  static value_t
564  {
565  return std::make_tuple(valueset_t<I>::special()...);
566  }
567 
568  template <std::size_t... I>
569  static bool
571  {
572  for (auto n: {valueset_t<I>::is_special(std::get<I>(l))...})
573  if (!n)
574  return false;
575  return true;
576  }
577 
578  template <std::size_t... I>
579  value_t
581  {
582  return value_t{set<I>().zero()...};
583  }
584 
585  template <std::size_t... I>
586  bool
587  is_zero_(const value_t& l, seq<I...>) const
588  {
589  for (auto n: {set<I>().is_zero(std::get<I>(l))...})
590  if (!n)
591  return false;
592  return true;
593  }
594 
595  template <std::size_t... I>
596  static constexpr bool
598  {
599  return all_<valueset_t<I>::has_one()...>();
600  }
601 
602  template <std::size_t... I>
603  static constexpr bool
605  {
606  return all_<valueset_t<I>::is_ratexpset()...>();
607  }
608 
609  template <std::size_t... I>
610  static constexpr bool
612  {
613  return all_<valueset_t<I>::is_letterized()...>();
614  }
615 
616  template <std::size_t... I>
617  static value_t
619  {
620  return value_t{valueset_t<I>::one()...};
621  }
622 
623  template <std::size_t... I>
624  static bool
626  {
627  for (auto n: {valueset_t<I>::is_one(std::get<I>(l))...})
628  if (!n)
629  return false;
630  return true;
631  }
632 
633  template <std::size_t... I>
634  static bool
636  {
637  for (auto n: {valueset_t<I>::show_one()...})
638  if (n)
639  return true;
640  return false;
641  }
642 
643  template <std::size_t... I>
644  value_t
645  add_(const value_t& l, const value_t& r, seq<I...>) const
646  {
647  return value_t{set<I>().add(std::get<I>(l), std::get<I>(r))...};
648  }
649 
650  template <std::size_t... I>
651  value_t
652  mul_(const value_t& l, const value_t& r, seq<I...>) const
653  {
654  return value_t{set<I>().mul(std::get<I>(l), std::get<I>(r))...};
655  }
656 
657  template <std::size_t... I>
658  value_t
659  rdiv_(const value_t& l, const value_t& r, seq<I...>) const
660  {
661  return value_t{set<I>().rdiv(std::get<I>(l), std::get<I>(r))...};
662  }
663 
664  template <std::size_t... I>
665  value_t
666  ldiv_(const value_t& l, const value_t& r, seq<I...>) const
667  {
668  return value_t{set<I>().ldiv(std::get<I>(l), std::get<I>(r))...};
669  }
670 
671  template <std::size_t... I>
672  typename valueset_t<0>::value_t
674  {
675  typename valueset_t<0>::value_t res = std::get<0>(vs);
676  for (auto v: {std::get<I>(vs)...})
677  res = set<0>().lgcd(res, v);
678  using swallow = int[];
679  (void) swallow { (set<0>().ldiv_here(res, std::get<I>(vs)), 0)... };
680  return res;
681  }
682 
683  template <std::size_t... I>
684  value_t
685  star_(value_t const& l, seq<I...>) const
686  {
687  return value_t{set<I>().star(std::get<I>(l))...};
688  }
689 
690  template <typename Value, std::size_t... I>
691  Value
692  delimit_(Value const& l, seq<I...>) const
693  {
694  return Value{set<I>().delimit(std::get<I>(l))...};
695  }
696 
697  template <typename Value, std::size_t... I>
698  Value
699  undelimit_(Value const& l, seq<I...>) const
700  {
701  return Value{set<I>().undelimit(std::get<I>(l))...};
702  }
703 
704  template <typename LhsValue, typename RhsValue, std::size_t... I>
705  word_t
706  concat_(const LhsValue& l, const RhsValue& r, seq<I...>) const
707  {
708  return word_t{set<I>().concat(std::get<I>(l), std::get<I>(r))...};
709  }
710 
711  template <typename... VS, std::size_t... I>
712  value_t
714  const typename tupleset<VS...>::value_t& v,
715  seq<I...>) const
716  {
717  return value_t{set<I>().conv(vs.template set<I>(), std::get<I>(v))...};
718  }
719 
720  template <std::size_t... I>
721  value_t
722  conv_(std::istream& i, seq<I...>) const
723  {
724 # if VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER
725  return value_t{(eat_separator_<I>(i, '(', ','),
726  set<I>().conv(i))...};
727 # else
728  constexpr auto S = sizeof...(ValueSets)-1;
729  return
730  detail::make_gcc_tuple((eat_separator_<S - I>(i, '(', ','),
731  std::get<S - I>(sets_).conv(i))...);
732 # endif
733  }
734 
738  template <std::size_t I>
739  static void
740  eat_separator_(std::istream& i, char first, char tail)
741  {
742  eat(i, I == 0 ? first : tail);
743  while (isspace(i.peek()))
744  i.ignore();
745  }
746 
747 
748  template <std::size_t... I>
749  std::ostream&
750  print_(value_t const& l, std::ostream& o,
751  symbol format, seq<I...>) const
752  {
753  if (!is_special(l))
754  {
755  using swallow = int[];
756  (void) swallow
757  {
758  (o << (I == 0 ? '(' : ','),
759  set<I>().print(std::get<I>(l), o, format),
760  0)...
761  };
762  o << ')';
763  }
764  return o;
765  }
766 
767  template <std::size_t... I>
768  std::ostream&
769  print_set_(std::ostream& o, symbol format,
770  seq<I...>) const
771  {
772  const char *sep = "";
773  if (format == "latex")
774  sep = " \\times ";
775  else if (format == "text")
776  {
777  o << "lat<";
778  sep = ", ";
779  }
780  else
781  raise("invalid format: ", format);
782  using swallow = int[];
783  (void) swallow
784  {
785  (o << (I == 0 ? "" : sep),
786  set<I>().print_set(o, format),
787  0)...
788  };
789  if (format == "text")
790  o << '>';
791  return o;
792  }
793 
794  template <std::size_t... I>
795  value_t
796  transpose_(value_t const& l, seq<I...>) const
797  {
798  return value_t{(set<I>().transpose(std::get<I>(l)))...};
799  }
800 
802  template <std::size_t... I>
803  tupleset
804  meet_(const tupleset& rhs, seq<I...>) const
805  {
806  return tupleset{meet(set<I>(), rhs.set<I>())...};
807  }
808 
810  template <std::size_t... I>
811  tupleset
812  join_(const tupleset& rhs, seq<I...>) const
813  {
814  return tupleset{vcsn::join(set<I>(), rhs.set<I>())...};
815  }
816 
818  friend
819  tupleset
820  meet(const tupleset& lhs, const tupleset& rhs)
821  {
822  return lhs.meet_(rhs, indices);
823  }
824 
826  friend
827  tupleset
828  meet(const tupleset& lhs, const b&)
829  {
830  return lhs;
831  }
832 
834  friend
835  tupleset
836  meet(const b&, const tupleset& rhs)
837  {
838  return rhs;
839  }
840 
841  valuesets_t sets_;
842  mutable bool open__ = false;
843  };
844 
845  namespace detail
846  {
847  template <typename T1, typename T2>
848  struct concat_tupleset;
849 
850  template <typename... T1, typename... T2>
851  struct concat_tupleset<tupleset<T1...>, tupleset<T2...>>
852  {
853  using type = tupleset<T1..., T2...>;
854  };
855 
857  template <typename... LabelSets>
858  struct nullableset_traits<tupleset<LabelSets...>,
859  enable_if_t<tupleset<LabelSets...>::has_one()>>
860  {
861  using labelset_t = tupleset<LabelSets...>;
862  using type = labelset_t;
863  static type value(const labelset_t& ls)
864  {
865  return ls;
866  }
867  };
868 
870  template <typename... LabelSets>
871  struct nullableset_traits<tupleset<LabelSets...>,
872  enable_if_t<!tupleset<LabelSets...>::has_one()>>
873  {
874  using labelset_t = tupleset<LabelSets...>;
875  using type = nullableset<labelset_t>;
876 
877  static type value(const labelset_t& ls)
878  {
879  return ls;
880  }
881  };
882 
884  template <typename... LabelSets>
885  struct law_traits<tupleset<LabelSets...>>
886  {
887  using labelset_t = tupleset<LabelSets...>;
888  using type = tupleset<law_t<LabelSets>...>;
889 
890  template <std::size_t... I>
891  static type value(const labelset_t& ls, detail::index_sequence<I...>)
892  {
893  return {make_wordset(ls.template set<I>())...};
894  }
895 
896  static type value(const labelset_t& ls)
897  {
898  return value(ls, detail::make_index_sequence<sizeof...(LabelSets)>{});
899  }
900  };
901 
902  template <typename... VS1, typename... VS2>
903  struct join_impl<tupleset<VS1...>, tupleset<VS2...>>
904  {
905  using type = tupleset<join_t<VS1, VS2>...>;
906  static type join(const tupleset<VS1...>& lhs, const tupleset<VS2...>& rhs)
907  {
908  return lhs.join(rhs);
909  }
910  };
911  }
912 
913 }
914 #endif // !VCSN_LABELSET_TUPLESET_HH
variadic< type_t::ldiv, Context > ldiv
Definition: fwd.hh:132
value_t star_(value_t const &l, seq< I...>) const
Definition: tupleset.hh:685
typename labelset_types< ValueSets...>::genset_t genset_t
A tuple of gensets if meaningful, void otherwise.
Definition: tupleset.hh:79
bool is_letter(const value_t &) const
Definition: tupleset.hh:287
static value_t conv(self_type, value_t v)
Definition: tupleset.hh:375
static bool less_than_(const value_t &l, const value_t &r, seq< I...>)
Definition: tupleset.hh:538
static constexpr bool has_one_(seq< I...>)
Definition: tupleset.hh:597
static size_t hash(const value_t &v)
Definition: tupleset.hh:369
genset_t genset_(seq< I...>) const
Definition: tupleset.hh:506
word_t word_(const std::tuple< Args...> &l, seq< I...>) const
Definition: tupleset.hh:520
value_t mul_(const value_t &l, const value_t &r, seq< I...>) const
Definition: tupleset.hh:652
static tupleset make_(std::istream &i, seq< I...>)
Definition: tupleset.hh:477
value_t value(const std::tuple< Args...> &args) const
Construct a value.
Definition: tupleset.hh:163
value_t add_(const value_t &l, const value_t &r, seq< I...>) const
Definition: tupleset.hh:645
tupleset(ValueSets...ls)
Definition: tupleset.hh:92
A ValueSet which is a Cartesian product of ValueSets.
Definition: fwd.hh:20
value_t conv(const tupleset< VS...> &vs, const typename tupleset< VS...>::value_t &v) const
Convert a value from tupleset<...> to value_t.
Definition: tupleset.hh:389
Value undelimit(const Value &l) const
Remove first and last characters, that must be "special".
Definition: tupleset.hh:344
typename labelset_types< ValueSets...>::word_t word_t
A tuple of words if meaningful, void otherwise.
Definition: tupleset.hh:81
static value_t one()
Definition: tupleset.hh:269
std::ostream & print(const value_t &l, std::ostream &o, symbol format=symbol{"text"}) const
Definition: tupleset.hh:425
static std::size_t hash_(const value_t &v, seq< I...>)
Definition: tupleset.hh:553
static constexpr bool is_commutative()
Definition: tupleset.hh:112
bool open_(bool o, seq< I...>) const
Definition: tupleset.hh:490
A traits so that tupleset may define types that may exist.
Definition: tupleset.hh:30
static constexpr bool is_idempotent()
Definition: tupleset.hh:118
auto word(const std::tuple< Args...> &v) const -> word_t
Convert to a word.
Definition: tupleset.hh:207
tupleset(valuesets_t vs)
Definition: tupleset.hh:88
static void eat_separator_(std::istream &i, char first, char tail)
Read the separator from the input stream i.
Definition: tupleset.hh:740
Implementation of labels are nullables (letter or empty).
Definition: fwd.hh:13
static bool show_one()
Definition: tupleset.hh:281
letter_t value_type
To be iterable.
Definition: tupleset.hh:84
boost::flyweight< std::string, boost::flyweights::no_tracking > symbol
An internalized string.
Definition: symbol.hh:24
bool is_zero_(const value_t &l, seq< I...>) const
Definition: tupleset.hh:587
std::string sname()
Definition: name.hh:31
std::ostream & print_(value_t const &l, std::ostream &o, symbol format, seq< I...>) const
Definition: tupleset.hh:750
std::tuple< typename ValueSets::value_t...> value_t
A tuple of values.
Definition: tupleset.hh:74
static constexpr bool is_letterized()
Definition: tupleset.hh:263
const valueset_t< I > & set() const
The Ith component valueset.
Definition: tupleset.hh:148
auto conv(const ValueSet &vs, const std::string &str, Args &&...args) -> decltype(vs.conv(std::declval< std::istream & >(), std::forward< Args >(args)...))
Parse str via vs.conv.
Definition: stream.hh:29
value_t ldiv(const value_t &l, const value_t &r) const
Definition: tupleset.hh:311
std::ostream & print_set(std::ostream &o, symbol format=symbol{"text"}) const
Definition: tupleset.hh:419
zip_sequences< Sequences...> zip(Sequences &&...seqs)
Definition: zip.hh:223
value_t rdiv(const value_t &l, const value_t &r) const
Definition: tupleset.hh:305
std::ostream & print_set_(std::ostream &o, symbol format, seq< I...>) const
Definition: tupleset.hh:769
value_t value_(const std::tuple< Args...> &args, seq< I...>) const
Definition: tupleset.hh:499
std::string vname_(bool full, seq< I...>) const
Definition: tupleset.hh:448
value_t add(const value_t &l, const value_t &r) const
Definition: tupleset.hh:293
typename labelset_types< ValueSets...>::letter_t letter_t
A tuple of letters if meaningful, void otherwise.
Definition: tupleset.hh:77
static value_t one_(seq< I...>)
Definition: tupleset.hh:618
value_t transpose(const value_t &l) const
Definition: tupleset.hh:363
static constexpr star_status_t star_status()
Definition: tupleset.hh:350
static constexpr bool is_letterized_(seq< I...>)
Definition: tupleset.hh:611
genset_t genset() const
The generators. Meaningful for labelsets only.
Definition: tupleset.hh:170
join_impl< V1, V2 >::type join_(V1 v1, V2 v2, int)
Dealing with commutativity: two implementations of join_: forward and reversed, ordered by preference...
Definition: join.hh:27
static std::string sname()
Definition: tupleset.hh:96
value_t star(const value_t &l) const
Definition: tupleset.hh:324
unary< type_t::star, Context > star
Definition: fwd.hh:113
value_t rdiv_(const value_t &l, const value_t &r, seq< I...>) const
Definition: tupleset.hh:659
static bool is_one(const value_t &l)
Definition: tupleset.hh:275
static value_t special_(seq< I...>)
Definition: tupleset.hh:563
std::tuple< ValueSets...> valuesets_t
Definition: tupleset.hh:60
const valuesets_t & sets() const
The componants valuesets, as a tuple.
Definition: tupleset.hh:141
static constexpr bool is_ratexpset()
Definition: tupleset.hh:257
static constexpr bool is_commutative_(seq< I...>)
Definition: tupleset.hh:464
Ignore its arguments.
Definition: raise.hh:17
bool is_zero(const value_t &l) const
Definition: tupleset.hh:245
static tupleset make(std::istream &is)
Build from the description in is.
Definition: tupleset.hh:124
Value delimit(const Value &l) const
Add the special character first and last.
Definition: tupleset.hh:336
static constexpr bool has_one()
Definition: tupleset.hh:251
word_t concat_(const LhsValue &l, const RhsValue &r, seq< I...>) const
Definition: tupleset.hh:706
static constexpr bool is_ratexpset_(seq< I...>)
Definition: tupleset.hh:604
std::istringstream is
The input stream: the specification to translate.
Definition: translate.cc:329
value_t conv(std::istream &i) const
Read one label from i, return the corresponding value.
Definition: tupleset.hh:406
Value delimit_(Value const &l, seq< I...>) const
Definition: tupleset.hh:692
static bool is_special(const value_t &l)
Definition: tupleset.hh:233
std::string vname(T &t)
Definition: name.hh:65
value_t conv(const nullableset< tupleset< VS...>> &vs, const typename nullableset< tupleset< VS...>>::value_t &v) const
Convert a value from nullableset> to value_t.
Definition: tupleset.hh:398
constant< type_t::one, Context > one
Definition: fwd.hh:100
star_status_t
Definition: star_status.hh:6
static constexpr bool is_idempotent_(seq< I...>)
Definition: tupleset.hh:471
static bool equals(const value_t &l, const value_t &r)
Definition: tupleset.hh:214
cross_sequences< Sequences...> cross(Sequences &&...seqs)
Definition: cross.hh:248
constant< type_t::zero, Context > zero
Definition: fwd.hh:97
std::string vname(bool full=true) const
Definition: tupleset.hh:101
Provide a variadic mul on top of a binary mul(), and one().
Definition: fwd.hh:36
static std::string sname_(seq< I...>)
Definition: tupleset.hh:433
static constexpr bool is_free_(seq< I...>)
Definition: tupleset.hh:513
valueset_t< 0 >::value_t lnormalize_here_(value_t &vs, seq< I...>) const
Definition: tupleset.hh:673
static bool is_special_(const value_t &l, seq< I...>)
Definition: tupleset.hh:570
static auto letters_of_(const Value &v, seq< I...>) -> decltype(zip(valueset_t< I >::letters_of(std::get< I >(v))...))
Must be declared before, as we use its result in decltype.
Definition: tupleset.hh:184
std::set< value_t > convs(std::istream &) const
Definition: tupleset.hh:413
value_t conv_(std::istream &i, seq< I...>) const
Definition: tupleset.hh:722
char eat(std::istream &is, char c)
Check lookahead character and advance.
Definition: stream.cc:37
static auto letters_of(const Value &v) -> decltype(letters_of_(v, indices))
Iterate over the letters of v.
Definition: tupleset.hh:198
value_t conv_(const tupleset< VS...> &vs, const typename tupleset< VS...>::value_t &v, seq< I...>) const
Definition: tupleset.hh:713
static constexpr bool is_free()
Definition: tupleset.hh:175
valueset_t< 0 >::value_t lnormalize_here(value_t &v) const
This tupleset must be homegeneous.
Definition: tupleset.hh:318
static value_t special()
Definition: tupleset.hh:227
static bool show_one_(seq< I...>)
Definition: tupleset.hh:635
value_t zero() const
Definition: tupleset.hh:239
value_t conv(b, b::value_t v) const
Definition: tupleset.hh:381
static constexpr std::size_t size()
Definition: tupleset.hh:106
typename std::tuple_element< I, valuesets_t >::type valueset_t
The Ith valueset type.
Definition: tupleset.hh:68
word_t concat(const LhsValue &l, const RhsValue &r) const
Definition: tupleset.hh:357
value_t zero_(seq< I...>) const
Definition: tupleset.hh:580
value_t mul(const value_t &l, const value_t &r) const
Definition: tupleset.hh:299
static bool equals_(const value_t &l, const value_t &r, seq< I...>)
Definition: tupleset.hh:527
Value undelimit_(Value const &l, seq< I...>) const
Definition: tupleset.hh:699
value_t ldiv_(const value_t &l, const value_t &r, seq< I...>) const
Definition: tupleset.hh:666
variadic_mul_mixin< detail::r_impl > r
Definition: fwd.hh:42
bool open(bool o) const
Whether unknown letters should be added, or rejected.
Definition: tupleset.hh:156
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...
Definition: tuple.hh:201
static bool less_than(const value_t &l, const value_t &r)
Whether l < r.
Definition: tupleset.hh:221
static bool is_one_(const value_t &l, seq< I...>)
Definition: tupleset.hh:625
tupleset join(const tupleset &rhs) const
The join with another tupleset.
Definition: tupleset.hh:135