17 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_COEFFICIENT_HXX
18 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_COEFFICIENT_HXX
22 # include <vaucanson/algebra/implementation/series/krat_exp_pattern.hh>
28 template <
class Series,
class T,
class Dispatch>
29 class CoefficientEval :
public algebra::KRatExpMatcher<
30 CoefficientEval<Series, T, Dispatch>,
32 std::pair<typename Element<Series, T>::semiring_elt_t,
38 typedef ConstantTermEval<Series, T, Dispatch> self_t;
39 typedef typename Element<Series, T>::semiring_elt_t semiring_elt_t;
40 typedef std::pair<semiring_elt_t, Element<Series, T> > return_type;
41 typedef typename semiring_elt_t::value_t semiring_elt_value_t;
42 INHERIT_CONSTRUCTORS(self_t, T, semiring_elt_t, Dispatch);
44 CoefficientEval(
const Element<Series, T>& exp) :
51 exp_.structure().semiring().identity(
SELECT(semiring_elt_value_t));
57 exp_.structure().semiring().zero(
SELECT(semiring_elt_value_t));
60 MATCH__(Product, lhs, rhs)
62 return return_type(one(), lhs * rhs);
66 MATCH__(Sum, lhs, rhs)
68 return return_type(one(), lhs + rhs);
74 return return_type(one(), node.star());
78 MATCH__(LeftWeight, w, node)
80 return return_type(w, node);
84 MATCH__(RightWeight, node, w)
86 return return_type(w, node);
92 return return_type(one(), m);
98 return return_type(zero(), zero_as<T>::of(exp_.structure()));
104 return return_type(one(), identity_as<T>::of(exp_.structure()));
109 Element<Series, T> exp_;
112 template <
class Series,
class T>
113 std::pair<typename Element<Series, T>::semiring_elt_t, Element<Series, T> >
114 coefficient(
const Element<Series, T>& exp)
116 CoefficientEval<Series, T, algebra::DispatchFunction<T> > matcher(exp);
117 return matcher.match(exp.value());
124 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_COEFFICIENT_HXX