17 #ifndef VCSN_ALGORITHMS_KRAT_EXP_LINEARIZE_HXX
18 # define VCSN_ALGORITHMS_KRAT_EXP_LINEARIZE_HXX
21 # define LINEAR_INDEX_START 1
24 # include <vaucanson/algebra/implementation/series/krat_exp_pattern.hh>
29 template <
class Series,
class T,
class Dispatch>
30 struct KRatExpLinearize : algebra::KRatExpMatcher<
31 KRatExpLinearize<Series, T, Dispatch>,
33 typename linearize_element<Series, T>::element_t,
38 typedef typename linearize_element<Series, T>::index_t index_t;
39 typedef typename linearize_element<Series, T>::element_t return_type;
40 typedef typename return_type::value_t exp_impl_t;
41 typedef typename return_type::monoid_elt_value_t l_monoid_elt_value_t;
42 typedef typename return_type::set_t l_series_set_elt_t;
43 typedef typename l_series_set_elt_t::monoid_t l_monoid_t;
44 typedef typename l_series_set_elt_t::semiring_t l_semiring_t;
45 typedef typename l_monoid_t::alphabet_t l_alphabet_t;
46 typedef typename l_monoid_t::letter_t l_letter_t;
47 typedef typename return_type::monoid_elt_t l_monoid_elt_t;
48 typedef typename return_type::semiring_elt_t l_semiring_elt_t;
50 typedef KRatExpLinearize<Series, T, Dispatch> self_t;
51 typedef typename Element<Series, T>::semiring_elt_t semiring_elt_t;
52 typedef typename Element<Series, T>::monoid_elt_t monoid_elt_t;
53 typedef typename monoid_elt_t::value_t monoid_elt_value_t;
54 INHERIT_CONSTRUCTORS(self_t, T, semiring_elt_t, Dispatch);
56 KRatExpLinearize(
const Element<Series, T>& exp) :
57 index_(LINEAR_INDEX_START),
60 l_series_(l_semiring_t (), l_monoid_t (l_alpha_))
67 return_type result = this->
match(exp_.value());
68 l_monoid_t l_monoid(l_alpha_);
69 l_semiring_t l_semiring;
70 return return_type (l_series_set_elt_t (l_semiring, l_monoid),
74 MATCH__(Product, lhs, rhs)
80 MATCH__(Sum, lhs, rhs)
88 return this->
match(e).star();
92 MATCH__(LeftWeight, w, e)
94 return l_semiring_elt_t(w) * this->
match(e);
98 MATCH__(RightWeight, e, w)
100 return this->
match(e) * l_semiring_elt_t(w);
107 l_monoid_elt_value_t res;
108 typedef typename monoid_elt_value_t::const_iterator const_iterator;
109 for (const_iterator i = m.begin(); i != m.end(); ++i)
111 l_alpha_.insert(l_letter_t(*i, index_));
112 res.push_back(l_letter_t(*i, index_));
116 return return_type(l_series_, res);
122 return l_series_.zero(
SELECT(exp_impl_t));
128 return l_series_.identity(
SELECT(exp_impl_t));
134 Element<Series, T> exp_;
135 l_alphabet_t l_alpha_;
136 l_series_set_elt_t l_series_;
139 template <
class Series,
class T>
140 typename linearize_element<Series, T>::element_t
143 KRatExpLinearize<Series, T, algebra::DispatchFunction<T> >
145 return matcher.linearize();
150 #endif // ! VCSN_ALGORITHMS_KRAT_EXP_LINEARIZE_HXX