3 #include <boost/range/algorithm/find.hpp>
4 #include <boost/range/algorithm/find_if.hpp>
5 #include <boost/range/algorithm_ext/is_sorted.hpp>
17 template <
typename LabelSet>
18 using genset_t = decltype(std::declval<LabelSet>().genset());
20 template <
typename LabelSet>
28 template <
typename LabelSet>
29 using one_t = decltype(std::declval<LabelSet>().one());
31 template <
typename LabelSet>
40 template <
typename LabelSet>
43 typename LabelSet::value_t>
48 template <
typename LabelSet>
52 typename LabelSet::value_t>
57 #if defined __GNUC__ && !defined __clang__
60 # pragma GCC diagnostic push
61 # pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
65 template <
typename LabelSet>
67 ->
typename LabelSet::value_t
69 return label_one<LabelSet>();
72 #if defined __GNUC__ && !defined __clang__
73 # pragma GCC diagnostic pop
80 template <
typename LabelSet>
88 return std::make_shared<labelset_t>(
labelset_t{ls.genset()});
92 template <
typename LabelSet>
96 template <
typename LabelSet>
100 template <
typename LabelSet>
112 template <
typename Context>
118 template <
typename LabelSet,
typename WeightSet>
138 template <
typename LabelSet,
139 typename Enable =
void>
144 template <
typename LabelSet>
148 template <
typename LabelSet>
159 template <
typename Ctx>
164 template <
typename LabelSet,
typename WeightSet>
183 template <
typename LabelSet>
194 template <
typename LabelSet>
198 template <
typename LabelSet>
210 template <
typename Context>
216 template <
typename LabelSet,
typename WeightSet>
229 template <
typename Context>
235 template <
typename LabelSet,
typename WeightSet>
250 template <
typename ValueSet>
255 template <
typename LabelSet>
259 template <
typename LabelSet>
270 template <
typename Ctx>
275 template <
typename LabelSet,
typename WeightSet>
291 template <
typename LabelSet>
294 const std::vector<typename LabelSet::value_t>& letters,
295 const std::vector<typename LabelSet::value_t>& alphabet,
299 for (
auto it = std::begin(letters), letters_end = std::end(letters);
300 it != letters_end; ++it)
305 boost::range::find(alphabet, *it),
306 alphabet.end()).first;
307 ls.print(*it, out, fmt);
309 auto width = std::distance(it, end);
317 ls.print(*it, out, fmt);
327 template <
typename LabelSet>
330 const std::vector<typename LabelSet::value_t>& letters,
334 using letters_t = std::vector<typename LabelSet::value_t>;
336 auto alphabet = letters_t{};
337 for (
auto l : ls.genset())
338 alphabet.emplace_back(ls.value(l));
346 && 2 * boost::distance(alphabet) < 3 * boost::distance(letters))
350 auto negated = letters_t{};
351 for (
auto l: alphabet)
353 negated.emplace_back(l);
bool_constant< letterized_traits< LabelSet >::is_letterized > is_letterized_t
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.
typename proper_traits< LabelSet >::type proper_t
The type of the corresponding proper LabelSet.
nullableset_context_t< context< LabelSet, WeightSet > > make_nullableset_context(const context< LabelSet, WeightSet > &ctx)
The nullableset context of a context.
auto label_one() -> enable_if_t< LabelSet::has_one(), typename LabelSet::value_t >
This LabelSet's one(), if supported.
word_context_t< context< LabelSet, WeightSet > > make_word_context(const context< LabelSet, WeightSet > &ctx)
The wordset context of a context.
letterized_t< LabelSet > make_letterized(const LabelSet &ls)
static labelset_t labelset(const labelset_t &ls)
typename detail::weightset_t_of_impl< base_t< ValueSet >>::type weightset_t_of
typename std::enable_if< Cond, T >::type enable_if_t
std::pair< InputIt1, InputIt2 > mismatch(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Same as C++14's mismatch, which is not available in G++-4.8 with -std=c++1y.
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.
auto make_proper_context(const context< LabelSet, WeightSet > &ctx) -> proper_context< context< LabelSet, WeightSet >>
From a context, its non-nullable context.
decltype(std::declval< LabelSet >().one()) one_t
typename nullableset_traits< LabelSet >::type nullableset_t
The smallest nullableset that includes LabelSet.
static dyn::context ctx(const driver &d)
Get the context of the driver.
context< letterized_t< labelset_t_of< Context >>, weightset_t_of< Context >> letterized_context
const weightset_ptr & weightset() const
static constexpr bool is_letterized
bool none_of_equal(const Range &r, const Value &value)
From a labelset, its non-nullable labelset.
proper_t< LabelSet > make_proper(const LabelSet &ls)
The corresponding proper LabelSet.
law_t< LabelSet > make_wordset(const LabelSet &ls)
The wordset of a labelset.
free_context< context< LabelSet, WeightSet > > make_free_context(const context< LabelSet, WeightSet > &c)
The free context for c.
context< nullableset_t< labelset_t_of< Ctx >>, weightset_t_of< Ctx >> nullableset_context_t
decltype(std::declval< LabelSet >().genset()) genset_t
typename law_traits< LabelSet >::type law_t
The smallest wordset that includes LabelSet.
The smallest nullableset which includes LabelSet.
const labelset_ptr & labelset() const
Functor to compare Values of ValueSets.
context< proper_t< letterized_t< labelset_t_of< Context >>>, weightset_t_of< Context >> free_context
context< proper_t< labelset_t_of< Context >>, weightset_t_of< Context >> proper_context
nullableset_t< LabelSet > make_nullableset(const LabelSet &ls)
The nullableset of a labelset.
static type value(const LabelSet &ls)
letterized_context< context< LabelSet, WeightSet > > make_letterized_context(const context< LabelSet, WeightSet > &c)
The letterized context for c.
std::integral_constant< bool, B > bool_constant
constant< type_t::one, Context > one
typename letterized_traits< LabelSet >::labelset_t letterized_t
context< law_t< labelset_t_of< Ctx >>, weightset_t_of< Ctx >> word_context_t