17 template <
typename ExpSet>
19 :
public ExpSet::const_visitor
29 using super_t =
typename expressionset_t::const_visitor;
30 using node_t =
typename super_t::node_t;
31 using inner_t =
typename super_t::inner_t;
32 template <rat::exp::type_t Type>
34 template <rat::exp::type_t Type>
36 template <rat::exp::type_t Type>
51 auto lhss = int(size<ExpSet>(lhs));
52 auto rhss = int(size<ExpSet>(rhs));
54 if (
auto res = lhss - rhss)
56 else if (
auto res =
int(lhs->type()) -
int(rhs->type()))
72 #define DEFINE(Type) \ 73 VCSN_RAT_VISIT(Type, lhs) \ 75 res_ = cmp_(lhs, *down_pointer_cast<const Type ## _t>(rhs_)); \ 96 using tuple_t =
typename super_t::tuple_t;
98 template <
typename =
void>
101 using tupleset_t =
typename expressionset_t::template as_tupleset_t<>;
106 *down_pointer_cast<const tuple_t>(
self_.
rhs_));
120 detail::static_if<context_t::is_lat>
132 int cmp_(
const zero_t&,
const zero_t&)
142 int cmp_(
const atom_t& lhs,
const atom_t& rhs)
147 int cmp_(
const name_t& lhs,
const name_t& rhs)
149 if (
auto res = (*
this)(lhs.sub(), rhs.sub()))
152 return lhs.name_get().get().compare(rhs.name_get());
155 template <rat::exp::type_t Type>
156 int cmp_(
const variadic_t<Type>& lhs,
const variadic_t<Type>& rhs)
158 if (
auto res =
int(lhs.size()) -
int(rhs.size()))
165 template <rat::exp::type_t Type>
166 int cmp_(
const unary_t<Type>& lhs,
const unary_t<Type>& rhs)
168 return (*
this)(lhs.sub(), rhs.sub());
171 template <rat::exp::type_t Type>
172 int cmp_(
const weight_node_t<Type>& lhs,
const weight_node_t<Type>& rhs)
175 if (
auto res = (*
this)(lhs.sub(), rhs.sub()))
typename detail::weightset_t_of_impl< base_t< ValueSet > >::type weightset_t_of
int lexicographical_cmp(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, Compare comp)
Lexicographical three-way comparison between two ranges.
weightset_t_of< context_t > weightset_t
int cmp_(const zero_t &, const zero_t &)
int operator()(expression_t lhs, expression_t rhs)
Whether lhs < rhs.
An inner node with multiple children.
void visit(const tuple_t &v, std::true_type) override
typename super_t::inner_t inner_t
typename super_t::template unary_t< Type > unary_t
An inner node to name the subexpression.
typename detail::context_t_of_impl< base_t< ValueSet > >::type context_t_of
int operator()(const tuple_t &lhs, const tuple_t &rhs)
Binary operator().
decltype(std::declval< LabelSet >().one()) one_t
int cmp_(const weight_node_t< Type > &lhs, const weight_node_t< Type > &rhs)
weight_t_of< context_t > weight_t
int cmp_(const name_t &lhs, const name_t &rhs)
A functor for three-way comparison between two expressions.
typename detail::labelset_t_of_impl< base_t< ValueSet > >::type labelset_t_of
typename expressionset_t::value_t expression_t
int operator()(const tuple_t &lhs)
Entry point: down_cast rhs_ and bounce to binary operator().
typename super_t::node_t node_t
context_t_of< expressionset_t > context_t
typename super_t::template weight_node_t< Type > weight_node_t
int cmp_(const one_t &, const one_t &)
int cmp_(const atom_t &lhs, const atom_t &rhs)
An inner node implementing a weight.
int cmp_(const variadic_t< Type > &lhs, const variadic_t< Type > &rhs)
typename expressionset_t::const_visitor super_t
labelset_t_of< context_t > labelset_t
expression_t rhs_
The right-hand side expression with which the current node is compared.
int res_
The current result.
Functor to three-way comparison Values of ValueSets.
typename super_t::template variadic_t< Type > variadic_t
int cmp_(const unary_t< Type > &lhs, const unary_t< Type > &rhs)
typename detail::weight_t_of_impl< base_t< ValueSet > >::type weight_t_of
int compare(const Lhs &lhs, const Rhs &rhs)
Comparison between lhs and rhs.
typename expressionset_t::template as_tupleset_t<> tupleset_t
typename super_t::tuple_t tuple_t