00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_ALPHABETS_DECORATED_ALPHABET_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_ALPHABETS_DECORATED_ALPHABET_HXX
00019
00020 # include <vaucanson/algebra/concept/letter.hh>
00021 # include <vaucanson/algebra/implementation/alphabets/decorated_alphabet.hh>
00022
00023 namespace vcsn {
00024
00025 namespace algebra
00026 {
00027 template <typename L, typename T>
00028 AlphabetDecorator<L, T>::~AlphabetDecorator()
00029 {
00030 if (alphabet_owner_)
00031 delete alphabet_;
00032 }
00033
00034 template <typename L, typename T>
00035 AlphabetDecorator<L, T>::AlphabetDecorator()
00036 {
00037 alphabet_ = new T();
00038 joker_ = letter_traits<L>::default_joker;
00039 other_ = letter_traits<L>::default_other;
00040 alphabet_owner_ = true;
00041 }
00042
00043 template <typename L, typename T>
00044 AlphabetDecorator<L, T>::AlphabetDecorator(alphabet_impl_t& alphabet) :
00045 alphabet_(&alphabet)
00046 {
00047 alphabet_owner_ = false;
00048 if (std::find(alphabet.begin(), alphabet.end(),
00049 letter_traits<L>::default_joker())
00050 == alphabet.end())
00051 joker_ = letter_traits<L>::default_joker();
00052 else
00053 {
00054 joker_ = letter_traits<L>::default_joker();
00055 do {
00056 ++joker_;
00057 if (joker_ == letter_traits<L>::default_joker())
00058 {
00059 std::cerr << "Did not find a valid 'joker' ! Exiting !"
00060 << std::endl;
00061 exit(EXIT_FAILURE);
00062 }
00063 } while (std::find(alphabet.begin(), alphabet.end(),
00064 joker_) != alphabet.end());
00065 }
00066 if (std::find(alphabet.begin(), alphabet.end(),
00067 letter_traits<L>::default_other())
00068 == alphabet.end())
00069 other_ = letter_traits<L>::default_other();
00070 else
00071 {
00072 other_ = letter_traits<L>::default_other();
00073 do {
00074 ++other_;
00075 if (other_ == letter_traits<L>::default_other())
00076 {
00077 std::cerr << "Did not find a valid 'other' ! Exiting !"
00078 << std::endl;
00079 exit(EXIT_FAILURE);
00080 }
00081 } while (std::find(alphabet.begin(), alphabet.end(),
00082 other_) != alphabet.end());
00083 }
00084 }
00085
00086 template <typename L, typename T>
00087 void
00088 AlphabetDecorator<L, T>::insert(L l)
00089 {
00090 alphabet().insert(l);
00091 }
00092
00093
00094 template <typename L, typename T>
00095 unsigned
00096 AlphabetDecorator<L, T>::size() const
00097 {
00098 return alphabet().size();
00099 }
00100
00101 template <typename L, typename T>
00102 typename AlphabetDecorator<L, T>::iterator
00103 AlphabetDecorator<L, T>::begin()
00104 {
00105 return alphabet().begin();
00106 }
00107
00108 template <typename L, typename T>
00109 typename AlphabetDecorator<L, T>::iterator
00110 AlphabetDecorator<L, T>::end()
00111 {
00112 return alphabet().end();
00113 }
00114
00115 template <typename L, typename T>
00116 typename AlphabetDecorator<L, T>::const_iterator
00117 AlphabetDecorator<L, T>::begin() const
00118 {
00119 return alphabet().begin();
00120 }
00121
00122 template <typename L, typename T>
00123 typename AlphabetDecorator<L, T>::const_iterator
00124 AlphabetDecorator<L, T>::end() const
00125 {
00126 return alphabet().end();
00127 }
00128
00129 template <typename L, typename T>
00130 const T& AlphabetDecorator<L, T>::alphabet() const
00131 {
00132 return *alphabet_;
00133 }
00134
00135 template <typename L, typename T>
00136 T& AlphabetDecorator<L, T>::alphabet()
00137 {
00138 return *alphabet_;
00139 }
00140
00141 template <typename L, typename T>
00142 L AlphabetDecorator<L, T>::joker() const
00143 {
00144 return joker_;
00145 }
00146
00147 template <typename L, typename T>
00148 L AlphabetDecorator<L, T>::other() const
00149 {
00150 return other_;
00151 }
00152 }
00153
00154 template <typename L, typename T>
00155 L MetaElement<algebra::AlphabetSet<L>, algebra::AlphabetDecorator<L, T> >::
00156 joker() const
00157 {
00158 return this->value().joker();
00159 }
00160
00161 template <typename L, typename T>
00162 L MetaElement<algebra::AlphabetSet<L>, algebra::AlphabetDecorator<L, T> >::
00163 other() const
00164 {
00165 return this->value().other();
00166 }
00167
00168 namespace algebra {
00169
00170
00171
00172
00173
00174
00175 template <typename L, typename T>
00176 bool op_contains(const algebra::AlphabetSet<L>& s,
00177 const algebra::AlphabetDecorator<L, T>& a)
00178 {
00179 return true;
00180 }
00181
00182 template <typename L, typename T>
00183 bool op_is_finite(const algebra::AlphabetSet<L>& s,
00184 const algebra::AlphabetDecorator<L, T>& a)
00185 {
00186 return true;
00187 }
00188
00189 template <typename L, typename T>
00190 bool op_contains_e(const algebra::AlphabetSet<L>& s,
00191 const algebra::AlphabetDecorator<L, T>& a,
00192 const L& v)
00193 {
00194 if (v == a.joker())
00195 return true;
00196 if (v == a.other())
00197 return false;
00198 return Element<algebra::AlphabetSet<L>, T>(s, a.alphabet()).contains(v);
00199 }
00200
00201 template <typename T, typename L>
00202 bool op_letter_equality(const algebra::AlphabetSet<L>& s,
00203 const algebra::AlphabetDecorator<L, T>& a,
00204 L lhs,
00205 L rhs)
00206 {
00207 Element<algebra::AlphabetSet<L>,
00208 algebra::AlphabetDecorator<L, T> > e(s, a);
00209 if (lhs == a.joker())
00210 return e.contains(rhs);
00211 if (rhs == a.joker())
00212 return e.contains(lhs);
00213 if (lhs == a.other())
00214 return ! e.contains(rhs);
00215 if (rhs == a.other())
00216 return ! e.contains(lhs);
00217 return lhs == rhs;
00218 }
00219
00220 }
00221
00222 }
00223
00224 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_ALPHABETS_DECORATED_ALPHABET_HXX