Vaucanson 1.4
|
00001 // krat_exp_flatten.hxx: this file is part of the Vaucanson project. 00002 // 00003 // Vaucanson, a generic library for finite state machines. 00004 // 00005 // Copyright (C) 2004, 2005, 2011 The Vaucanson Group. 00006 // 00007 // This program is free software; you can redistribute it and/or 00008 // modify it under the terms of the GNU General Public License 00009 // as published by the Free Software Foundation; either version 2 00010 // of the License, or (at your option) any later version. 00011 // 00012 // The complete GNU General Public Licence Notice can be found as the 00013 // `COPYING' file in the root directory. 00014 // 00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file. 00016 // 00017 #ifndef VCSN_ALGORITHMS_KRAT_EXP_FLATTEN_HXX 00018 # define VCSN_ALGORITHMS_KRAT_EXP_FLATTEN_HXX 00019 00020 # include <vaucanson/algorithms/krat_exp_flatten.hh> 00021 # include <vaucanson/algebra/implementation/series/krat_exp_pattern.hh> 00022 00023 namespace vcsn 00024 { 00027 template <class Series, class T, class Dispatch> 00028 struct KRatExpFlatten : algebra::KRatExpMatcher< 00029 KRatExpFlatten<Series, T, Dispatch>, 00030 T, 00031 std::list<typename Series::monoid_t::alphabet_t::letter_t>, 00032 Dispatch 00033 > 00034 { 00035 typedef KRatExpFlatten<Series, T, Dispatch> self_t; 00036 typedef typename Element<Series, T>::semiring_elt_t semiring_elt_t; 00037 typedef typename semiring_elt_t::value_t semiring_elt_value_t; 00038 typedef typename Element<Series, T>::monoid_elt_t monoid_elt_t; 00039 typedef typename monoid_elt_t::value_t monoid_elt_value_t; 00040 typedef typename monoid_elt_t::set_t monoid_t; 00041 typedef typename monoid_t::alphabet_t alphabet_t; 00042 typedef typename alphabet_t::letter_t letter_t; 00043 typedef std::list<typename Series::monoid_t::alphabet_t::letter_t> 00044 return_type; 00045 INHERIT_CONSTRUCTORS(self_t, T, return_type, Dispatch); 00046 00047 KRatExpFlatten(const Element<Series, T>& exp) : exp_(exp), res_ () 00048 { 00049 } 00050 00051 return_type 00052 flatten() 00053 { 00054 return this->match(exp_.value()); 00055 } 00056 00057 MATCH__(Product, lhs, rhs) 00058 { 00059 this->match(lhs); 00060 this->match(rhs); 00061 return res_; 00062 } 00063 END 00064 00065 MATCH__(Sum, lhs, rhs) 00066 { 00067 this->match(lhs); 00068 this->match(rhs); 00069 return res_; 00070 } 00071 END 00072 00073 MATCH_(Star, e) 00074 { 00075 this->match(e); 00076 return res_; 00077 } 00078 END 00079 00080 MATCH__(LeftWeight, w, e) 00081 { 00082 (void)w; 00083 this->match(e); 00084 return res_; 00085 } 00086 END 00087 00088 MATCH__(RightWeight, e, w) 00089 { 00090 (void)w; 00091 this->match(e); 00092 return res_; 00093 } 00094 END 00095 00096 MATCH_(Constant, m) 00097 { 00098 for (size_t i = 0; i < m.length(); ++i) 00099 res_.push_back(m[i]); 00100 return res_; 00101 } 00102 END 00103 00104 MATCH(Zero) 00105 { 00106 return res_; 00107 } 00108 END 00109 00110 MATCH(One) 00111 { 00112 return res_; 00113 } 00114 END 00115 00116 private: 00117 Element<Series, T> exp_; 00118 return_type res_; 00119 }; 00120 00121 template <class Series, class T> 00122 std::list<typename Series::monoid_t::alphabet_t::letter_t> 00123 flatten(const Element<Series, T>& exp) 00124 { 00125 KRatExpFlatten< Series, T, algebra::DispatchFunction<T> > matcher(exp); 00126 return matcher.flatten(); 00127 } 00128 00131 } // end of namepsace vcsn 00132 00133 #endif // ! VCSN_ALGORITHMS_KRAT_EXP_FLATTEN_HXX