00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_CONVERSION_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_CONVERSION_HXX
00019
00020 # include <vaucanson/algebra/implementation/series/krat_conversion.hh>
00021
00022 namespace vcsn {
00023
00024 namespace algebra {
00025
00026
00027
00028
00029
00030 template<typename Tm, typename Tw, typename oTm, typename oTw,
00031 typename Series_>
00032 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::ExpConvertVisitor(const Series_& s)
00033 : exp_(), series_(s)
00034 {}
00035
00036
00037 template<typename Tm, typename Tw, typename oTm, typename oTw,
00038 typename Series_>
00039 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::~ExpConvertVisitor()
00040 {}
00041
00042 template<typename Tm, typename Tw, typename oTm, typename oTw,
00043 typename Series_>
00044 void
00045 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::product(const node_t* left_,
00046 const node_t* right_)
00047 {
00048 right_->accept(*this);
00049 exp_t tmp = exp_;
00050 left_->accept(*this);
00051 op_in_mul(series_, exp_, tmp);
00052 }
00053
00054 template<typename Tm, typename Tw, typename oTm, typename oTw,
00055 typename Series_>
00056 void
00057 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::sum(const node_t* left_,
00058 const node_t* right_)
00059 {
00060 right_->accept(*this);
00061 exp_t tmp = exp_;
00062 left_->accept(*this);
00063 op_in_add(series_, exp_, tmp);
00064 }
00065
00066 template<typename Tm, typename Tw, typename oTm, typename oTw,
00067 typename Series_>
00068 void
00069 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::star(const node_t* node_)
00070 {
00071 node_->accept(*this);
00072 op_in_star(series_, exp_);
00073 }
00074
00075 template<typename Tm, typename Tw, typename oTm, typename oTw,
00076 typename Series_>
00077 void
00078 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::left_weight(const oTw& w,
00079 const node_t* node_)
00080 {
00081 node_->accept(*this);
00082 exp_ = op_mul(series_.semiring(), series_,
00083 op_convert(SELECT(typename Series_::semiring_t),
00084 SELECT(Tw),
00085 w),
00086 exp_);
00087 }
00088
00089 template<typename Tm, typename Tw, typename oTm, typename oTw,
00090 typename Series_>
00091 void
00092 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::right_weight(const oTw& w,
00093 const node_t*
00094 node_)
00095 {
00096 node_->accept(*this);
00097 op_in_mul(series_, series_.semiring(), exp_,
00098 op_convert(SELECT(typename Series_::semiring_t),
00099 SELECT(Tw),
00100 w));
00101 }
00102
00103 template<typename Tm, typename Tw, typename oTm, typename oTw,
00104 typename Series_>
00105 void
00106 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::constant(const oTm& m_)
00107 {
00108 Tm m = op_convert(SELECT(typename Series_::monoid_t),
00109 SELECT(Tm),
00110 m_);
00111 if (m == identity_value(SELECT(typename Series_::monoid_t),
00112 SELECT(Tm)))
00113 exp_ = exp_t::one();
00114 else
00115 exp_ = exp_t::constant(m);
00116 }
00117
00118 template<typename Tm, typename Tw, typename oTm, typename oTw,
00119 typename Series_>
00120 void
00121 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::one()
00122 {
00123 exp_ = exp_t::one();
00124 }
00125
00126 template<typename Tm, typename Tw, typename oTm, typename oTw,
00127 typename Series_>
00128 void
00129 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::zero()
00130 {
00131 exp_ = exp_t::zero();
00132 }
00133
00134 template<typename Tm, typename Tw, typename oTm, typename oTw,
00135 typename Series_>
00136 const typename ExpConvertVisitor<Tm,Tw,oTm,oTw,Series_>::exp_t&
00137 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series_>::get() const
00138 {
00139 return exp_;
00140 }
00141
00142 template<typename Tm, typename Tw, typename W, typename M,
00143 typename oTm, typename oTw>
00144 rat::exp<Tm, Tw>
00145 convert_exp(SELECTOR2(rat::exp<Tm, Tw>),
00146 const Series<W, M>& s,
00147 const rat::exp<oTm, oTw>& arg)
00148 {
00149 ExpConvertVisitor<Tm, Tw, oTm, oTw, Series<W, M> > v(s);
00150 arg.accept(v);
00151 return v.get();
00152 }
00153
00154 template<typename W, typename M, typename Tm, typename Tw,
00155 typename oTm, typename oTw>
00156 Element<Series<W, M>, rat::exp<Tm, Tw> >
00157 convert_exp(SELECTOR4(Element<Series<W, M>, rat::exp<Tm, Tw> >),
00158 const Element<Series<W, M>, rat::exp<oTm, oTw> >& arg)
00159 {
00160 return Element<Series<W, M>, rat::exp<Tm, Tw> >
00161 (arg.structure(),
00162 convert_exp(SELECT2(rat::exp<Tm, Tw>),
00163 arg.structure(),
00164 arg.value()));
00165 }
00166
00167 }
00168
00169 }
00170
00171 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_CONVERSION_HXX