00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_SERIES_REP_BASE_HXX
00019 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_SERIES_REP_BASE_HXX
00020
00021 # include <vaucanson/algebra/implementation/series/series_rep_base.hh>
00022
00023 namespace vcsn
00024 {
00025 namespace algebra
00026 {
00027 template <template <typename, typename> class B, typename S, typename M>
00028 SeriesRepBase<B, S, M>::SeriesRepBase()
00029 {
00030 self_t* self = static_cast<self_t*>(this);
00031
00032
00033 self->maybe_zero.push_back("0");
00034 self->maybe_zero.push_back("z");
00035
00036
00037 self->maybe_zero.push_back("_z");
00038 self->maybe_zero.push_back("zero");
00039
00040 self->zero = *(self->maybe_zero.begin());
00041 self->open_par = "(";
00042 self->close_par = ")";
00043 self->plus = "+";
00044 self->times = ".";
00045 self->star = "*";
00046 self->open_weight = "{";
00047 self->close_weight = "}";
00048 self->spaces.push_back(" ");
00049 }
00050
00051
00052
00053 template <template <typename, typename> class B, typename S, typename M>
00054 void
00055 SeriesRepBase<B, S, M>::disambiguate(const monoid_t& monoid,
00056 pointer_t& orig)
00057 {
00058
00059 typedef typename monoid_t::alphabet_t alphabet_t;
00060 typedef typename alphabet_t::letter_t letter_t;
00061
00062 self_t* self = static_cast<self_t*>(this);
00063
00064
00065 typedef std::vector<std::string>::const_iterator iterator_t;
00066
00067 self_t new_rep = *self;
00068
00069 for (iterator_t zero_it = new_rep.maybe_zero.begin();
00070 zero_it != new_rep.maybe_zero.end();
00071 ++zero_it)
00072 {
00073 bool found = true;
00074
00075 for_all_const_(alphabet_t, i, monoid.alphabet())
00076 {
00077 if (letter_traits<letter_t>::letter_to_literal(*i) == *zero_it)
00078 {
00079 found = false;
00080 break;
00081 }
00082 }
00083
00084
00085 if (found)
00086 {
00087
00088 if (new_rep.zero != *zero_it)
00089 {
00090 new_rep.zero = *zero_it;
00091 orig = pointer_t(new self_t(new_rep));
00092 }
00093 break;
00094 }
00095 }
00096 }
00097
00098 template <template <typename, typename> class B, typename S, typename M>
00099 bool
00100 operator==(boost::shared_ptr<SeriesRepBase<B, S, M> > lhs,
00101 boost::shared_ptr<SeriesRepBase<B, S, M> > rhs)
00102 {
00103 return (lhs->open_par == rhs->open_par &&
00104 lhs->close_par == rhs->close_par &&
00105 lhs->plus == rhs->plus &&
00106 lhs->times == rhs->times &&
00107 lhs->star == rhs->star &&
00108 lhs->zero == rhs->zero &&
00109 lhs->open_weight == rhs->open_weight &&
00110 lhs->close_weight == rhs->close_weight &&
00111 lhs->spaces == rhs->spaces &&
00112 lhs->maybe_zero == rhs->maybe_zero);
00113 }
00114
00115 }
00116
00117 }
00118
00119 #endif // !VCSN_ALGEBRA_IMPLEMENTATION_SERIES_SERIES_REP_BASE_HXX