18 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_MONOID_MONOID_REP_BASE_HXX
19 # define VCSN_ALGEBRA_IMPLEMENTATION_MONOID_MONOID_REP_BASE_HXX
21 # include <vaucanson/algebra/implementation/monoid/monoid_rep_base.hh>
27 template <
template <
typename>
class S,
typename T>
28 MonoidRepBase<S, T>::MonoidRepBase()
30 self_t*
self =
static_cast<self_t*
>(
this);
33 self->maybe_epsilon.push_back(
"1");
34 self->maybe_epsilon.push_back(
"e");
37 self->maybe_epsilon.push_back(
"_e");
38 self->maybe_epsilon.push_back(
"eps");
40 self->empty = *(
self->maybe_epsilon.begin());
44 template <
template <
typename>
class S,
typename T>
46 MonoidRepBase<S, T>::disambiguate(
const monoid_t& monoid, pointer_t& orig)
49 typedef typename monoid_t::alphabet_t alphabet_t;
50 typedef typename alphabet_t::letter_t letter_t;
52 self_t*
self =
static_cast<self_t*
>(
this);
55 typedef std::vector<std::string>::const_iterator iterator_t;
57 self_t new_rep = *
self;
59 for (iterator_t empty_it = new_rep.maybe_epsilon.begin();
60 empty_it != new_rep.maybe_epsilon.end();
65 for_all_const_(alphabet_t, i, monoid.alphabet())
67 if (letter_traits<letter_t>::letter_to_literal(*i) == *empty_it)
78 if (new_rep.empty != *empty_it)
80 new_rep.empty = *empty_it;
81 orig = pointer_t(
new self_t(new_rep));
88 template <
template <
typename>
class S,
typename T>
90 operator==(boost::shared_ptr<MonoidRepBase<S, T> > lhs,
91 boost::shared_ptr<MonoidRepBase<S, T> > rhs)
93 return (lhs->empty == rhs->empty &&
94 lhs->concat == rhs->concat &&
95 lhs->maybe_epsilon == rhs->maybe_epsilon);
102 #endif // !VCSN_ALGEBRA_IMPLEMENTATION_MONOID_MONOID_REP_BASE_HXX