3 #include <boost/optional.hpp> 4 #include <boost/range/algorithm/find.hpp> 5 #include <boost/range/algorithm/for_each.hpp> 6 #include <boost/range/algorithm_ext/is_sorted.hpp> 21 template <
typename LabelSet>
23 = decltype(std::declval<LabelSet>().generators());
26 template <
typename LabelSet>
34 template <
typename LabelSet>
35 using one_t = decltype(std::declval<LabelSet>().one());
37 template <
typename LabelSet>
45 #if defined __GNUC__ && !defined __clang__ 48 # pragma GCC diagnostic push 49 # pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn" 53 template <
typename LabelSet>
55 ->
typename LabelSet::value_t
57 return static_if<LabelSet::has_one()>
58 ([](
const auto& ls) {
return ls.one(); },
59 [](
const auto& ls) ->
typename LabelSet::value_t
61 raise(ls,
": does not feature a neutral");
66 #if defined __GNUC__ && !defined __clang__ 67 # pragma GCC diagnostic pop 78 template <
typename LabelSet>
86 return std::make_shared<labelset_t>(
labelset_t{ls.genset()});
90 template <
typename LabelSet>
94 template <
typename LabelSet>
98 template <
typename LabelSet>
110 template <
typename Context>
116 template <
typename LabelSet,
typename WeightSet>
136 template <
typename LabelSet,
137 typename Enable =
void>
142 template <
typename LabelSet>
146 template <
typename LabelSet>
157 template <
typename Ctx>
162 template <
typename LabelSet,
typename WeightSet>
181 template <
typename LabelSet>
192 template <
typename LabelSet>
196 template <
typename LabelSet>
208 template <
typename Context>
214 template <
typename LabelSet,
typename WeightSet>
227 template <
typename Context>
233 template <
typename LabelSet,
typename WeightSet>
248 template <
typename ValueSet>
253 template <
typename LabelSet>
257 template <
typename LabelSet>
268 template <
typename Ctx>
273 template <
typename LabelSet,
typename WeightSet>
289 template <
typename LabelSet>
292 const std::vector<typename LabelSet::value_t>& letters,
293 const std::vector<typename LabelSet::value_t>& alphabet,
297 for (
auto it = std::begin(letters), letters_end = std::end(letters);
298 it != letters_end; ++it)
300 auto end = std::mismatch(it, letters_end,
301 boost::find(alphabet, *it),
302 alphabet.end()).first;
303 ls.print(*it, out, fmt);
305 auto width = std::distance(it, end);
313 ls.print(*it, out, fmt);
323 template <
typename LabelSet>
326 const std::vector<typename LabelSet::value_t>& letters,
330 using letters_t = std::vector<typename LabelSet::value_t>;
332 auto alphabet = letters_t{};
333 for (
auto l : ls.generators())
334 alphabet.emplace_back(ls.value(l));
342 && 2 * boost::distance(alphabet) < 3 * boost::distance(letters))
346 auto negated = letters_t{};
347 for (
auto l: alphabet)
349 negated.emplace_back(l);
360 template <
typename LabelSet>
361 typename LabelSet::letters_t
379 template <
typename LabelSet,
typename Fun>
383 using letter_t =
typename LabelSet::letter_t;
384 using letters_t =
typename LabelSet::letters_t;
388 auto alphabet = letters_t{};
389 for (
auto l : ls.generators())
397 auto prev = boost::optional<letter_t>{};
398 while (i.peek() != EOF && i.peek() !=
']')
405 ls.sname(),
": letter classes cannot begin with '-'");
407 ls.sname(),
": letter classes cannot finish with '-'");
410 letter_t l2 = ls.get_letter(i);
412 auto gens = ls.generators();
415 auto i = boost::range::find(gens, *prev);
417 if (i != std::end(gens))
420 i != std::end(gens) && ls.less(*i, l2);
427 if (ls.less(*prev, l2))
434 letter_t l = ls.get_letter(i);
442 template <
typename LabelSet>
443 typename LabelSet::letters_t
446 using letter_t =
typename LabelSet::letter_t;
447 using letters_t =
typename LabelSet::letters_t;
449 auto res = letters_t{};
456 template <
typename LabelSet,
457 typename RandomGenerator = std::default_random_engine>
458 typename LabelSet::value_t
460 RandomGenerator& gen = RandomGenerator())
462 require(!ls.generators().empty(),
463 "random_label: the alphabet needs at least 1 letter");
466 return ls.value(pick(ls.generators()));
typename detail::weightset_t_of_impl< base_t< ValueSet > >::type weightset_t_of
bool_constant< letterized_traits< LabelSet >::is_letterized > is_letterized_t
auto label_one(const LabelSet &ls) -> typename LabelSet::value_t
Enjoy type inference.
nullableset_context_t< context< LabelSet, WeightSet > > make_nullableset_context(const context< LabelSet, WeightSet > &ctx)
The nullableset context of a context.
decltype(std::declval< LabelSet >().generators()) generators_mem_fn_t
The type of the LabelSet::generators() member function.
A traits to compute the letterized context.
letterized_t< LabelSet > make_letterized(const LabelSet &ls)
static constexpr bool is_letterized
static type value(const LabelSet &ls)
An input/output format for valuesets.
decltype(std::declval< LabelSet >().one()) one_t
word_context_t< context< LabelSet, WeightSet > > make_word_context(const context< LabelSet, WeightSet > &ctx)
The wordset context of a context.
LabelSet::letters_t conv_label_class_(const LabelSet &ls, std::istream &i)
Read a set of letters (hence, guaranteed in order, and unique).
free_context< context< LabelSet, WeightSet > > make_free_context(const context< LabelSet, WeightSet > &c)
The free context for c.
std::integral_constant< bool, B > bool_constant
From a labelset, its non-nullable labelset.
Functor to compare Values of ValueSets.
static labelset_t labelset(const labelset_t &ls)
proper_t< LabelSet > make_proper(const LabelSet &ls)
The corresponding proper LabelSet.
typename proper_traits< LabelSet >::type proper_t
The type of the corresponding proper LabelSet.
The smallest nullableset which includes LabelSet.
typename letterized_traits< LabelSet >::labelset_t letterized_t
bool none_of_equal(const Range &r, const Value &value)
typename law_traits< LabelSet >::type law_t
The smallest wordset that includes LabelSet.
random_selector< RandomGenerator > make_random_selector(RandomGenerator &g)
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.
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.
const labelset_ptr & labelset() const
law_t< LabelSet > make_wordset(const LabelSet &ls)
The wordset of a labelset.
nullableset_t< LabelSet > make_nullableset(const LabelSet &ls)
The nullableset of a labelset.
void require(Bool b, Args &&... args)
If b is not verified, raise an error with args as message.
letterized_context< context< LabelSet, WeightSet > > make_letterized_context(const context< LabelSet, WeightSet > &c)
The letterized context for c.
auto make_proper_context(const context< LabelSet, WeightSet > &ctx) -> proper_context< context< LabelSet, WeightSet >>
From a context, its non-nullable context.
typename nullableset_traits< LabelSet >::type nullableset_t
The smallest nullableset that includes LabelSet.
const weightset_ptr & weightset() const
expressionset< Context >::value_t random_label(const expressionset< Context > &rs, RandomGenerator &gen=RandomGenerator())
Random label from expressionset: limited to a single label.
Container set_difference(const Container &s1, const Container &s2)
The set of members of s1 that are not members of s2.
auto out(const Aut &aut, state_t_of< Aut > s)
Indexes of visible transitions leaving state s.