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
00028
00029
00030 template<typename W, typename M, typename Tm, typename Tw>
00031 rat::exp<Tm, Tw> op_convert(const algebra::Series<W, M>& s1,
00032 SELECTOR2(rat::exp<Tm, Tw>),
00033 const algebra::Series<W, M>& s2,
00034 const algebra::polynom<Tm, Tw>& p_value)
00035 {
00036 precondition(& s1 == & s2);
00037
00038 typedef rat::exp<Tm, Tw> kexp_t;
00039 kexp_t exp;
00040
00041 if (p_value == identity_value(SELECT2(algebra::Series<W, M>),
00042 SELECT2(algebra::polynom<Tm, Tw>)))
00043 return kexp_t::one();
00044
00045 if (p_value == zero_value(SELECT2(algebra::Series<W, M>),
00046 SELECT2(algebra::polynom<Tm, Tw>)))
00047 return kexp_t::zero();
00048
00049 for (typename algebra::polynom<Tm, Tw>::const_iterator p = p_value.begin();
00050 p != p_value.end();
00051 ++p)
00052 if (exp == kexp_t::zero())
00053 exp = (*p).second * kexp_t::constant((*p).first);
00054 else
00055 exp += (*p).second * kexp_t::constant((*p).first);
00056 return exp;
00057 }
00058
00059 }
00060
00061 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_GENERALIZED_HXX