3 #include <boost/optional.hpp>
4 #include <boost/range/algorithm/find.hpp>
5 #include <boost/range/algorithm/find_if.hpp>
6 #include <boost/range/algorithm/for_each.hpp>
7 #include <boost/range/algorithm_ext/is_sorted.hpp>
20 template <
typename LabelSet>
21 using generators_t = decltype(std::declval<LabelSet>().generators());
24 template <
typename LabelSet>
32 template <
typename LabelSet>
33 using one_t = decltype(std::declval<LabelSet>().one());
35 template <
typename LabelSet>
44 template <
typename LabelSet>
46 -> std::enable_if_t<LabelSet::has_one(),
47 typename LabelSet::value_t>
52 template <
typename LabelSet>
55 -> std::enable_if_t<!LabelSet::has_one(),
56 typename LabelSet::value_t>
61 #if defined __GNUC__ && !defined __clang__
64 # pragma GCC diagnostic push
65 # pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
69 template <
typename LabelSet>
71 ->
typename LabelSet::value_t
73 return label_one<LabelSet>();
76 #if defined __GNUC__ && !defined __clang__
77 # pragma GCC diagnostic pop
88 template <
typename LabelSet>
96 return std::make_shared<labelset_t>(
labelset_t{ls.genset()});
100 template <
typename LabelSet>
104 template <
typename LabelSet>
108 template <
typename LabelSet>
120 template <
typename Context>
126 template <
typename LabelSet,
typename WeightSet>
146 template <
typename LabelSet,
147 typename Enable =
void>
152 template <
typename LabelSet>
156 template <
typename LabelSet>
167 template <
typename Ctx>
172 template <
typename LabelSet,
typename WeightSet>
191 template <
typename LabelSet>
202 template <
typename LabelSet>
206 template <
typename LabelSet>
218 template <
typename Context>
224 template <
typename LabelSet,
typename WeightSet>
237 template <
typename Context>
243 template <
typename LabelSet,
typename WeightSet>
258 template <
typename ValueSet>
263 template <
typename LabelSet>
267 template <
typename LabelSet>
278 template <
typename Ctx>
283 template <
typename LabelSet,
typename WeightSet>
299 template <
typename LabelSet>
302 const std::vector<typename LabelSet::value_t>& letters,
303 const std::vector<typename LabelSet::value_t>& alphabet,
307 for (
auto it = std::begin(letters), letters_end = std::end(letters);
308 it != letters_end; ++it)
310 auto end = std::mismatch(it, letters_end,
311 boost::range::find(alphabet, *it),
312 alphabet.end()).first;
313 ls.print(*it, out, fmt);
315 auto width = std::distance(it, end);
323 ls.print(*it, out, fmt);
333 template <
typename LabelSet>
336 const std::vector<typename LabelSet::value_t>& letters,
340 using letters_t = std::vector<typename LabelSet::value_t>;
342 auto alphabet = letters_t{};
343 for (
auto l : ls.generators())
344 alphabet.emplace_back(ls.value(l));
352 && 2 * boost::distance(alphabet) < 3 * boost::distance(letters))
356 auto negated = letters_t{};
357 for (
auto l: alphabet)
359 negated.emplace_back(l);
370 template <
typename LabelSet>
371 typename LabelSet::letters_t
389 template <
typename LabelSet,
typename Fun>
393 using letter_t =
typename LabelSet::letter_t;
394 using letters_t =
typename LabelSet::letters_t;
398 auto alphabet = letters_t{};
399 for (
auto l : ls.generators())
407 auto prev = boost::optional<letter_t>{};
408 while (i.peek() != EOF && i.peek() !=
']')
414 "letter classes cannot begin with '-'");
416 "letter classes cannot finish with '-'");
419 letter_t l2 = ls.get_letter(i);
421 auto gens = ls.generators();
422 auto i = boost::range::find(gens, *prev);
424 if (i != std::end(gens))
427 i != std::end(gens) && *i < l2;
440 letter_t l = ls.get_letter(i);
448 template <
typename LabelSet>
449 typename LabelSet::letters_t
452 using letter_t =
typename LabelSet::letter_t;
453 using letters_t =
typename LabelSet::letters_t;
context< letterized_t< labelset_t_of< Context >>, weightset_t_of< Context >> letterized_context
std::integral_constant< bool, B > bool_constant
typename letterized_traits< LabelSet >::labelset_t letterized_t
const weightset_ptr & weightset() const
auto make_proper_context(const context< LabelSet, WeightSet > &ctx) -> proper_context< context< LabelSet, WeightSet >>
From a context, its non-nullable context.
context< proper_t< letterized_t< labelset_t_of< Context >>>, weightset_t_of< Context >> free_context
typename detail::weightset_t_of_impl< base_t< ValueSet >>::type weightset_t_of
decltype(std::declval< LabelSet >().one()) one_t
void require(Bool b, Args &&...args)
If b is not verified, raise an error with args as message.
decltype(std::declval< LabelSet >().generators()) generators_t
A probe for the LabelSet::generators().
A traits to compute the letterized context.
bool_constant< letterized_traits< LabelSet >::is_letterized > is_letterized_t
context< law_t< labelset_t_of< Ctx >>, weightset_t_of< Ctx >> word_context_t
context< proper_t< labelset_t_of< Context >>, weightset_t_of< Context >> proper_context
static type value(const LabelSet &ls)
An input/output format for valuesets.
typename nullableset_traits< LabelSet >::type nullableset_t
The smallest nullableset that includes LabelSet.
context< nullableset_t< labelset_t_of< Ctx >>, weightset_t_of< Ctx >> nullableset_context_t
static constexpr bool is_letterized
constant< type_t::one, Context > one
auto out(const Aut &aut, state_t_of< Aut > s)
Indexes of visible transitions leaving state s.
word_context_t< context< LabelSet, WeightSet > > make_word_context(const context< LabelSet, WeightSet > &ctx)
The wordset context of a context.
std::ostream & print_label_ranges_(const LabelSet &ls, const std::vector< typename LabelSet::value_t > &letters, const std::vector< typename LabelSet::value_t > &alphabet, std::ostream &out, format fmt)
Print a set of labels with ranges.
const labelset_ptr & labelset() const
nullableset_context_t< context< LabelSet, WeightSet > > make_nullableset_context(const context< LabelSet, WeightSet > &ctx)
The nullableset context of a context.
typename law_traits< LabelSet >::type law_t
The smallest wordset that includes LabelSet.
auto label_one() -> std::enable_if_t< LabelSet::has_one(), typename LabelSet::value_t >
This LabelSet's one(), if supported.
Functor to compare Values of ValueSets.
From a labelset, its non-nullable labelset.
bool none_of_equal(const Range &r, const Value &value)
law_t< LabelSet > make_wordset(const LabelSet &ls)
The wordset of a labelset.
static dyn::context ctx(const driver &d)
Get the context of the driver.
typename proper_traits< LabelSet >::type proper_t
The type of the corresponding proper LabelSet.
Container set_difference(const Container &s1, const Container &s2)
The set of members of s1 that are not members of s2.
The smallest nullableset which includes LabelSet.
proper_t< LabelSet > make_proper(const LabelSet &ls)
The corresponding proper LabelSet.
letterized_t< LabelSet > make_letterized(const LabelSet &ls)
static labelset_t labelset(const labelset_t &ls)
std::ostream & print_label_class(const LabelSet &ls, const std::vector< typename LabelSet::value_t > &letters, std::ostream &out, format fmt)
Print a set of labels (letterized) with classes.
free_context< context< LabelSet, WeightSet > > make_free_context(const context< LabelSet, WeightSet > &c)
The free context for c.
nullableset_t< LabelSet > make_nullableset(const LabelSet &ls)
The nullableset of a labelset.
letterized_context< context< LabelSet, WeightSet > > make_letterized_context(const context< LabelSet, WeightSet > &c)
The letterized context for c.
LabelSet::letters_t conv_label_class_(const LabelSet &ls, std::istream &i)
Read a set of letters (hence, guaranteed in order, and unique).