00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_REVERSE_VISITOR_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_REVERSE_VISITOR_HXX
00019
00020 # include <vaucanson/algebra/implementation/series/rat/reverse_visitor.hh>
00021
00022 namespace vcsn
00023 {
00024
00025 namespace rat
00026 {
00027
00028 template <class Semiring, class Word, class Weight>
00029 ReverseVisitor<Semiring, Word, Weight>::
00030 ReverseVisitor(const algebra::SemiringBase<Semiring>& s) : s_ (s)
00031 {}
00032
00033 template <class Semiring, class Word, class Weight>
00034 void
00035 ReverseVisitor<Semiring, Word, Weight>::
00036 product(rat::Node<Word, Weight>* lhs, rat::Node<Word, Weight>* rhs)
00037 {
00038 lhs->accept(*this);
00039 rhs->accept(*this);
00040 swap(lhs, rhs);
00041 }
00042
00043 template <class Semiring, class Word, class Weight>
00044 void
00045 ReverseVisitor<Semiring, Word, Weight>::left_weight(Weight& w)
00046 {
00047 w = transpose(w);
00048 }
00049
00050 template <class Semiring, class Word, class Weight>
00051 void
00052 ReverseVisitor<Semiring, Word, Weight>::right_weight(Weight& w)
00053 {
00054 w = transpose(s_, w);
00055 }
00056
00057 template <class Semiring, class Word, class Weight>
00058 void
00059 ReverseVisitor<Semiring, Word, Weight>::constant(Word& w)
00060 {
00061 w = mirror(w);
00062 }
00063
00064 template <class Semiring, class Word, class Weight>
00065 template <class S>
00066 Weight
00067 ReverseVisitor<Semiring, Word, Weight>::
00068 transpose(const algebra::SeriesBase<S>& s, const Weight& w)
00069 {
00070 Element<S, Weight> e (s, w);
00071 e.transpose();
00072 return e.value();
00073 }
00074
00075 template <class Semiring, class Word, class Weight>
00076 template <class S>
00077 Weight
00078 ReverseVisitor<Semiring, Word, Weight>::
00079 transpose(const algebra::SemiringBase<S>&, const Weight& w)
00080 {
00081 return w;
00082 }
00083
00084 }
00085
00086 namespace algebra
00087 {
00088
00089 template <typename S, typename Word, typename Weight>
00090 rat::exp<Word, Weight>&
00091 DefaultTransposeFun< S, rat::exp<Word, Weight> >::
00092 operator () (const S& s, const rat::exp<Word, Weight>& exp)
00093 {
00094 rat::exp<Word, Weight>* rexp = new rat::exp<Word, Weight> (exp);
00095 rat::ReverseVisitor<typename S::semiring_t, Word, Weight>
00096 rv (s.semiring());
00097
00098 rexp.accept(rv);
00099 return *rexp;
00100 }
00101
00102 }
00103
00104 }
00105
00106 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_REVERSE_VISITOR_HXX