00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_GENERALIZED_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_GENERALIZED_HXX
00019
00020 # include <vaucanson/misc/selectors.hh>
00021 # include <vaucanson/algebra/concept/series_base.hh>
00022 # include <vaucanson/algebra/implementation/series/polynoms.hh>
00023 # include <vaucanson/algebra/implementation/series/krat.hh>
00024
00025 namespace vcsn {
00026
00027 namespace algebra {
00028
00029
00030
00031
00032 template<typename W, typename M, typename Tm, typename Tw>
00033 rat::exp<Tm, Tw> op_convert(const algebra::Series<W, M>& s1,
00034 SELECTOR2(rat::exp<Tm, Tw>),
00035 const algebra::Series<W, M>& s2,
00036 const algebra::polynom<Tm, Tw>& p_value)
00037 {
00038 precondition(& s1 == & s2);
00039
00040 typedef rat::exp<Tm, Tw> kexp_t;
00041 kexp_t exp;
00042
00043 if (p_value == identity_value(SELECT2(algebra::Series<W, M>),
00044 SELECT2(algebra::polynom<Tm, Tw>)))
00045 return kexp_t::one();
00046
00047 if (p_value == zero_value(SELECT2(algebra::Series<W, M>),
00048 SELECT2(algebra::polynom<Tm, Tw>)))
00049 return kexp_t::zero();
00050
00051 for (typename algebra::polynom<Tm, Tw>::const_iterator p = p_value.begin();
00052 p != p_value.end();
00053 ++p)
00054 if (exp == kexp_t::zero())
00055 exp = (*p).second * kexp_t::constant((*p).first);
00056 else
00057 exp += (*p).second * kexp_t::constant((*p).first);
00058 return exp;
00059 }
00060
00061 }
00062
00063 }
00064
00065 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_GENERALIZED_HXX