00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_MONOID_FREE_MONOID_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_MONOID_FREE_MONOID_HXX
00019
00020 # include <vaucanson/algebra/implementation/monoid/free_monoid.hh>
00021
00022 namespace vcsn
00023 {
00024 namespace algebra
00025 {
00026 inline
00027 monoid_rep<FreeMonoid<Element<AlphabetSet<int>, std::set<int> > > >::monoid_rep() :
00028 monoid_rep<FreeMonoid<Element<AlphabetSet<char>, std::set<char> > > >()
00029 {
00030 maybe_epsilon.clear();
00031
00032
00033 maybe_epsilon.push_back("e");
00034 maybe_epsilon.push_back("1");
00035
00036
00037 maybe_epsilon.push_back("_e");
00038 maybe_epsilon.push_back("eps");
00039
00040 empty = *(maybe_epsilon.begin());
00041 concat = "#";
00042 }
00043
00044
00045
00046
00047
00048 template <class A>
00049 FreeMonoid<A>::FreeMonoid(const A& a) :
00050 rep_(monoid_rep_default<FreeMonoid<A> >::get_instance()),
00051 alph_(a)
00052 {
00053
00054 typedef typename A::letter_t letter_t;
00055 typedef std::vector<std::string>::const_iterator iterator_t;
00056 typedef monoid_rep<FreeMonoid<A> > monoid_rep_t;
00057
00058 monoid_rep_t rep;
00059
00060 for (iterator_t empty_it = rep.maybe_epsilon.begin();
00061 empty_it != rep.maybe_epsilon.end();
00062 ++empty_it)
00063 {
00064 bool found = true;
00065
00066 for_all_const_(A, i, a)
00067 {
00068 if (letter_traits<letter_t>::letter_to_literal(*i) == *empty_it)
00069 {
00070 found = false;
00071 break;
00072 }
00073 }
00074
00075
00076 if (found)
00077 {
00078 rep.empty = *empty_it;
00079 break;
00080 }
00081 }
00082
00083 set_representation(rep);
00084 }
00085
00086 template <class A>
00087 FreeMonoid<A>::FreeMonoid(const A& a,
00088 monoid_rep<FreeMonoid<A> > mr) :
00089 rep_(boost::shared_ptr<monoid_rep<FreeMonoid<A> > >(
00090 new monoid_rep<FreeMonoid<A> > (mr))),
00091 alph_(a)
00092 {
00093 }
00094
00095 template <class A>
00096 FreeMonoid<A>::FreeMonoid(const FreeMonoid& w) :
00097 FreeMonoidBase<FreeMonoid<A> >(w),
00098 rep_(w.rep_),
00099 alph_(w.alph_)
00100 {
00101 }
00102
00103 template <class A>
00104 const boost::shared_ptr<monoid_rep<FreeMonoid<A> > >
00105 FreeMonoid<A>::representation() const
00106 {
00107 return rep_;
00108 }
00109
00110 template <class A>
00111 void
00112 FreeMonoid<A>::set_representation(monoid_rep<FreeMonoid<A> > mr)
00113 {
00114 rep_ = boost::shared_ptr<monoid_rep<FreeMonoid<A> > >(new monoid_rep<FreeMonoid<A> > (mr));
00115 }
00116
00117 template <class A>
00118 A& FreeMonoid<A>::alphabet()
00119 {
00120 return alph_;
00121 }
00122
00123 template <class A>
00124 const A& FreeMonoid<A>::alphabet() const
00125 {
00126 return alph_;
00127 }
00128
00129 template<typename A>
00130 bool operator==(const FreeMonoid<A>& a,
00131 const FreeMonoid<A>& b)
00132 {
00133 return (a.alphabet() == b.alphabet()) &&
00134 (a.representation() == b.representation());
00135 }
00136
00137 }
00138
00139 }
00140
00141 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_MONOID_FREE_MONOID_HXX