Vaucanson 1.4
automata_base.hxx
00001 // automata_base.hxx: this file is part of the Vaucanson project.
00002 //
00003 // Vaucanson, a generic library for finite state machines.
00004 //
00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 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_AUTOMATA_CONCEPT_AUTOMATA_BASE_HXX
00018 # define VCSN_AUTOMATA_CONCEPT_AUTOMATA_BASE_HXX
00019 
00020 # include <vaucanson/automata/concept/copy.hh>
00021 # include <vaucanson/automata/concept/automata_base.hh>
00022 # include <vaucanson/automata/concept/automata_ops.hh>
00023 
00024 namespace vcsn {
00025 
00026   template <typename Self>
00027   AutomataBase<Self>::AutomataBase()
00028   {}
00029 
00030   template <typename Self>
00031   AutomataBase<Self>::AutomataBase(const AutomataBase& other) :
00032     Structure<Self>(other)
00033   {}
00034 
00035   template <typename Self>
00036   const typename AutomataBase<Self>::series_set_t&
00037   AutomataBase<Self>::series() const
00038   {
00039     return this->self().series();
00040   }
00041 
00042 
00044   template <typename Self, typename T>
00045   MetaElement<AutomataBase<Self>, T>::MetaElement()
00046   {}
00047 
00049   template <typename Self, typename T>
00050   MetaElement<AutomataBase<Self>, T>::MetaElement(const MetaElement& a):
00051     MetaElement<Structure<Self>, T>::MetaElement(a)
00052   {}
00053 
00055   template <typename Self, typename T>
00056   typename MetaElement<AutomataBase<Self>, T>::tag_t&
00057   MetaElement<AutomataBase<Self>, T>::tag()
00058   {
00059     return op_tag(this->structure(), this->value());
00060   }
00061 
00063   template <typename Self, typename T>
00064   const typename MetaElement<AutomataBase<Self>, T>::tag_t&
00065   MetaElement<AutomataBase<Self>, T>:: tag() const
00066   {
00067     return op_tag(this->structure(), this->value());
00068   }
00069 
00071   template <typename Self, typename T>
00072   typename MetaElement<AutomataBase<Self>, T>::geometry_t&
00073   MetaElement<AutomataBase<Self>, T>::geometry()
00074   {
00075     return op_geometry(this->structure(), this->value());
00076   }
00077 
00079   template <typename Self, typename T>
00080   const typename MetaElement<AutomataBase<Self>, T>::geometry_t&
00081   MetaElement<AutomataBase<Self>, T>::geometry() const
00082   {
00083     return op_geometry(this->structure(), this->value());
00084   }
00085 
00087   template <typename Self, typename T>
00088   bool
00089   MetaElement<AutomataBase<Self>, T>::exists() const
00090   {
00091     return op_exists(this->structure(), this->value());
00092   }
00093 
00095   template <typename Self, typename T>
00096   typename automaton_traits<T>::states_t
00097   MetaElement<AutomataBase<Self>, T>::states() const
00098   {
00099     return op_states(this->structure(), this->value());
00100   }
00101 
00103   template <typename Self, typename T>
00104   typename automaton_traits<T>::transitions_t
00105   MetaElement<AutomataBase<Self>, T>::transitions() const
00106   {
00107     return op_transitions(this->structure(), this->value());
00108   }
00109 
00111   template <typename Self, typename T>
00112   const typename MetaElement<AutomataBase<Self>, T>::series_set_t&
00113   MetaElement<AutomataBase<Self>, T>::series() const
00114   {
00115     return this->structure().series();
00116   }
00117 
00119   template <typename Self, typename T>
00120   typename automaton_traits<T>::initial_support_t
00121   MetaElement<AutomataBase<Self>, T>::initial() const
00122   {
00123     return op_initial(this->structure(), this->value());
00124   }
00125 
00127   template <typename Self, typename T>
00128   typename automaton_traits<T>::final_support_t
00129 
00130   MetaElement<AutomataBase<Self>, T>::final() const
00131   {
00132     return op_final(this->structure(), this->value());
00133   }
00134 
00137   template <typename Self, typename T>
00138   bool
00139   MetaElement<AutomataBase<Self>, T>::is_initial(const typename automaton_traits<T>::hstate_t& state) const
00140   {
00141     return op_is_initial(this->structure(), this->value(), state);
00142   }
00143 
00144   template <typename Self, typename T>
00145   bool
00146   MetaElement<AutomataBase<Self>, T>::is_initial(unsigned state) const
00147   {
00148     return op_is_initial(this->structure(), this->value(), state);
00149   }
00150 
00152   template <typename Self, typename T>
00153   bool
00154   MetaElement<AutomataBase<Self>, T>::is_final(const typename automaton_traits<T>::hstate_t& state) const
00155   {
00156     return op_is_final(this->structure(), this->value(), state);
00157   }
00158 
00159   template <typename Self, typename T>
00160   bool
00161   MetaElement<AutomataBase<Self>, T>::is_final(unsigned state) const
00162   {
00163     return op_is_final(this->structure(), this->value(), state);
00164   }
00165 
00167   template <typename Self, typename T>
00168   void
00169   MetaElement<AutomataBase<Self>, T>::set_initial(const typename automaton_traits<T>::hstate_t& state)
00170   {
00171     op_set_initial(this->structure(),
00172                    this->value(),
00173                    state,
00174                    this->structure().series().
00175                    identity(SELECT(series_set_elt_value_t)));
00176   }
00177 
00178   template <typename Self, typename T>
00179   void
00180   MetaElement<AutomataBase<Self>, T>::set_initial(unsigned state)
00181   {
00182     op_set_initial(this->structure(),
00183                    this->value(),
00184                    state,
00185                    this->structure().series().
00186                    identity(SELECT(series_set_elt_value_t)));
00187   }
00188 
00190   template <typename Self, typename T>
00191   void
00192   MetaElement<AutomataBase<Self>, T>::
00193   set_initial(const typename automaton_traits<T>::hstate_t& state, const series_set_elt_t& s)
00194   {
00195     op_set_initial(this->structure(), this->value(), state, s);
00196   }
00197 
00198   template <typename Self, typename T>
00199   void
00200   MetaElement<AutomataBase<Self>, T>::
00201   set_initial(unsigned state, const series_set_elt_t& s)
00202   {
00203     op_set_initial(this->structure(), this->value(), state, s);
00204   }
00205 
00207   template <typename Self, typename T>
00208   void
00209   MetaElement<AutomataBase<Self>, T>::set_final(const typename automaton_traits<T>::hstate_t& state)
00210   {
00211     op_set_final(this->structure(),
00212                  this->value(),
00213                  state,
00214                  this->structure().series().
00215                  identity(SELECT(series_set_elt_value_t)));
00216   }
00217 
00218   template <typename Self, typename T>
00219   void
00220   MetaElement<AutomataBase<Self>, T>::set_final(unsigned state)
00221   {
00222     op_set_final(this->structure(),
00223                  this->value(),
00224                  state,
00225                  this->structure().series().
00226                  identity(SELECT(series_set_elt_value_t)));
00227   }
00228 
00230   template <typename Self, typename T>
00231   void
00232   MetaElement<AutomataBase<Self>, T>::
00233   set_final(const typename automaton_traits<T>::hstate_t& state, const series_set_elt_t& s)
00234   {
00235     op_set_final(this->structure(), this->value(), state, s);
00236   }
00237 
00238   template <typename Self, typename T>
00239   void
00240   MetaElement<AutomataBase<Self>, T>::
00241   set_final(unsigned state, const series_set_elt_t& s)
00242   {
00243     op_set_final(this->structure(), this->value(), state, s);
00244   }
00245 
00247   template <typename Self, typename T>
00248   void
00249   MetaElement<AutomataBase<Self>, T>::unset_initial(const typename automaton_traits<T>::hstate_t& state)
00250   {
00251     op_set_initial(this->structure(),
00252                    this->value(),
00253                    state,
00254                    algebra::zero_as<series_set_elt_value_t>::
00255                    of(this->structure().series()));
00256   }
00257 
00258   template <typename Self, typename T>
00259   void
00260   MetaElement<AutomataBase<Self>, T>::unset_initial(unsigned state)
00261   {
00262     op_set_initial(this->structure(),
00263                    this->value(),
00264                    state,
00265                    algebra::zero_as<series_set_elt_value_t>::
00266                    of(this->structure().series()));
00267   }
00268 
00270   template <typename Self, typename T>
00271   void
00272   MetaElement<AutomataBase<Self>, T>::unset_final(const typename automaton_traits<T>::hstate_t& state)
00273   {
00274     op_set_final(this->structure(),
00275                  this->value(),
00276                  state,
00277                  algebra::zero_as<series_set_elt_value_t>::
00278                  of(this->structure().series()));
00279   }
00280 
00281   template <typename Self, typename T>
00282   void
00283   MetaElement<AutomataBase<Self>, T>::unset_final(unsigned state)
00284   {
00285     op_set_final(this->structure(),
00286                  this->value(),
00287                  state,
00288                  algebra::zero_as<series_set_elt_value_t>::
00289                  of(this->structure().series()));
00290   }
00291 
00293   template <typename Self, typename T>
00294   void
00295   MetaElement<AutomataBase<Self>, T>::clear_initial()
00296   {
00297     return op_clear_initial(this->structure(), this->value());
00298   }
00299 
00301   template <typename Self, typename T>
00302   void
00303   MetaElement<AutomataBase<Self>, T>::clear_final()
00304   {
00305     return op_clear_final(this->structure(), this->value());
00306   }
00307 
00309   template <typename Self, typename T>
00310   typename MetaElement<AutomataBase<Self>, T>::series_set_elt_t
00311   MetaElement<AutomataBase<Self>, T>::get_initial(const typename automaton_traits<T>::hstate_t& state) const
00312   {
00313     return op_get_initial(this->structure(), this->value(), state);
00314   }
00315 
00316   template <typename Self, typename T>
00317   typename MetaElement<AutomataBase<Self>, T>::series_set_elt_t
00318   MetaElement<AutomataBase<Self>, T>::get_initial(unsigned state) const
00319   {
00320     return op_get_initial(this->structure(), this->value(), state);
00321   }
00322 
00324   template <typename Self, typename T>
00325   typename MetaElement<AutomataBase<Self>, T>::series_set_elt_t
00326   MetaElement<AutomataBase<Self>, T>::get_final(const typename automaton_traits<T>::hstate_t& state) const
00327   {
00328     return op_get_final(this->structure(), this->value(), state);
00329   }
00330 
00331   template <typename Self, typename T>
00332   typename MetaElement<AutomataBase<Self>, T>::series_set_elt_t
00333   MetaElement<AutomataBase<Self>, T>::get_final(unsigned state) const
00334   {
00335     return op_get_final(this->structure(), this->value(), state);
00336   }
00337 
00339   template <typename Self, typename T>
00340   typename automaton_traits<T>::hstate_t
00341   MetaElement<AutomataBase<Self>, T>::add_state()
00342   {
00343     return op_add_state(this->structure(), this->value());
00344   }
00345 
00347   template <typename Self, typename T>
00348   typename automaton_traits<T>::hstate_t
00349   MetaElement<AutomataBase<Self>, T>::get_state(unsigned state) const
00350   {
00351     return op_get_state(this->structure(), this->value(), state);
00352   }
00353 
00356   template <typename Self, typename T>
00357   typename automaton_traits<T>::hstate_t
00358   MetaElement<AutomataBase<Self>, T>::choose_state() const
00359   {
00360     return op_choose_state(this->structure(), this->value());
00361   }
00362 
00364   template <typename Self, typename T>
00365   typename automaton_traits<T>::htransition_t
00366   MetaElement<AutomataBase<Self>, T>::add_transition(const typename automaton_traits<T>::hstate_t& src,
00367                                                      const typename automaton_traits<T>::hstate_t& dst,
00368                                                      const label_t& label)
00369   {
00370     return op_add_transition(this->structure(), this->value(),
00371                              src, dst, label);
00372   }
00373 
00374   template <typename Self, typename T>
00375   typename automaton_traits<T>::htransition_t
00376   MetaElement<AutomataBase<Self>, T>::add_transition(unsigned src,
00377                                                      unsigned dst,
00378                                                      const label_t& label)
00379   {
00380     return op_add_transition(this->structure(), this->value(),
00381                              src, dst, label);
00382   }
00383 
00385   template <typename Self, typename T>
00386   typename automaton_traits<T>::htransition_t
00387   MetaElement<AutomataBase<Self>, T>::
00388   add_weighted_transition(const typename automaton_traits<T>::hstate_t& src,
00389                           const typename automaton_traits<T>::hstate_t& dst,
00390                           const semiring_elt_t& w,
00391                           const monoid_elt_value_t& m)
00392   {
00393     return op_add_weighted_transition(this->structure(), this->value(),
00394                                       src, dst, w, m);
00395   }
00396 
00397   template <typename Self, typename T>
00398   typename automaton_traits<T>::htransition_t
00399   MetaElement<AutomataBase<Self>, T>::
00400   add_weighted_transition(unsigned src,
00401                           unsigned dst,
00402                           const semiring_elt_t& w,
00403                           const monoid_elt_value_t& m)
00404   {
00405     return op_add_weighted_transition(this->structure(), this->value(),
00406                                       src, dst, w, m);
00407   }
00408 
00412   template <typename Self, typename T>
00413   typename automaton_traits<T>::htransition_t
00414   MetaElement<AutomataBase<Self>, T>::add_series_transition(const typename automaton_traits<T>::hstate_t& src,
00415                                                             const typename automaton_traits<T>::hstate_t& dst,
00416                                                             const series_set_elt_t& e)
00417   {
00418     return op_add_series_transition(this->structure(), this->value(),
00419                                     src, dst, e);
00420   }
00421 
00422   template <typename Self, typename T>
00423   typename automaton_traits<T>::htransition_t
00424   MetaElement<AutomataBase<Self>, T>::add_series_transition(unsigned src,
00425                                                             unsigned dst,
00426                                                             const series_set_elt_t& e)
00427   {
00428     return op_add_series_transition(this->structure(), this->value(),
00429                                     src, dst, e);
00430   }
00431 
00433   template <typename Self, typename T>
00434   typename automaton_traits<T>::htransition_t
00435   MetaElement<AutomataBase<Self>, T>::add_spontaneous(const typename automaton_traits<T>::hstate_t& src,
00436                                                       const typename automaton_traits<T>::hstate_t& dst)
00437   {
00438     semiring_elt_t w(this->structure().series().semiring());
00439     w = algebra::identity_as<semiring_elt_value_t>
00440       ::of(this->structure().series().semiring());
00441     return op_add_spontaneous(this->structure(), this->value(), src, dst, w);
00442   }
00443 
00444   template <typename Self, typename T>
00445   typename automaton_traits<T>::htransition_t
00446   MetaElement<AutomataBase<Self>, T>::add_spontaneous(unsigned src,
00447                                                       unsigned dst)
00448   {
00449     semiring_elt_t w(this->structure().series().semiring());
00450     w = algebra::identity_as<semiring_elt_value_t>
00451       ::of(this->structure().series().semiring());
00452     return op_add_spontaneous(this->structure(), this->value(), src, dst, w);
00453   }
00454 
00455   template <typename Self, typename T>
00456   typename automaton_traits<T>::htransition_t
00457   MetaElement<AutomataBase<Self>, T>::add_spontaneous(const typename automaton_traits<T>::hstate_t& src,
00458                                                       const typename automaton_traits<T>::hstate_t& dst,
00459                                                       const semiring_elt_t& w)
00460   {
00461     return op_add_spontaneous(this->structure(), this->value(), src, dst, w);
00462   }
00463 
00464   template <typename Self, typename T>
00465   typename automaton_traits<T>::htransition_t
00466   MetaElement<AutomataBase<Self>, T>::add_spontaneous(unsigned src,
00467                                                       unsigned dst,
00468                                                       const semiring_elt_t& w)
00469   {
00470     return op_add_spontaneous(this->structure(), this->value(), src, dst, w);
00471   }
00472 
00474   template <typename Self, typename T>
00475   typename automaton_traits<T>::htransition_t
00476   MetaElement<AutomataBase<Self>, T>::add_letter_transition(const typename automaton_traits<T>::hstate_t& src,
00477                                                             const typename automaton_traits<T>::hstate_t& dst,
00478                                                             const letter_t& l)
00479   {
00480     return op_add_letter_transition(this->structure(), this->value(),
00481                                     src, dst, l);
00482   }
00483 
00484   template <typename Self, typename T>
00485   typename automaton_traits<T>::htransition_t
00486   MetaElement<AutomataBase<Self>, T>::add_letter_transition(unsigned src,
00487                                                             unsigned dst,
00488                                                             const letter_t& l)
00489   {
00490     return op_add_letter_transition(this->structure(), this->value(),
00491                                     src, dst, l);
00492   }
00493 
00496   template <typename Self, typename T>
00497   typename automaton_traits<T>::htransition_t
00498   MetaElement<AutomataBase<Self>, T>::add_letter_transition(const typename automaton_traits<T>::hstate_t& src,
00499                                                             const typename automaton_traits<T>::hstate_t& dst,
00500                                                             const std::string& l)
00501   {
00502     return op_add_letter_transition(this->structure(), this->value(),
00503                                     src, dst, algebra::letter_traits<letter_t>::
00504                                     literal_to_letter(l).second);
00505   }
00506 
00507   template <typename Self, typename T>
00508   typename automaton_traits<T>::htransition_t
00509   MetaElement<AutomataBase<Self>, T>::add_letter_transition(unsigned src,
00510                                                             unsigned dst,
00511                                                             const std::string& l)
00512   {
00513     return op_add_letter_transition(this->structure(), this->value(),
00514                                     src, dst, algebra::letter_traits<letter_t>::
00515                                     literal_to_letter(l).second);
00516   }
00517 
00519   template <typename Self, typename T>
00520   void
00521   MetaElement<AutomataBase<Self>, T>::update(const typename automaton_traits<T>::htransition_t& e, const label_t& l)
00522   {
00523     op_update(this->structure(), this->value(), e, l);
00524   }
00525 
00527   template <typename Self, typename T>
00528   void
00529   MetaElement<AutomataBase<Self>, T>::del_state(const typename automaton_traits<T>::hstate_t& s)
00530   {
00531     return op_del_state(this->structure(), this->value(), s);
00532   }
00533 
00534   template <typename Self, typename T>
00535   void
00536   MetaElement<AutomataBase<Self>, T>::del_state(unsigned state)
00537   {
00538     return op_del_state(this->structure(), this->value(), state);
00539   }
00540 
00542   template <typename Self, typename T>
00543   void
00544   MetaElement<AutomataBase<Self>, T>::del_transition(const typename automaton_traits<T>::htransition_t& e)
00545   {
00546     return op_del_transition(this->structure(), this->value(), e);
00547   }
00548 
00550   template <typename Self, typename T>
00551   bool
00552   MetaElement<AutomataBase<Self>, T>::has_state(const typename automaton_traits<T>::hstate_t& s) const
00553   {
00554     return op_has_state(this->structure(), this->value(), s);
00555   }
00556 
00557   template <typename Self, typename T>
00558   bool
00559   MetaElement<AutomataBase<Self>, T>::has_state(unsigned state) const
00560   {
00561     return op_has_state(this->structure(), this->value(), state);
00562   }
00563 
00565   template <typename Self, typename T>
00566   bool
00567   MetaElement<AutomataBase<Self>, T>::has_transition(const typename automaton_traits<T>::htransition_t& e) const
00568   {
00569     return op_has_transition(this->structure(), this->value(), e);
00570   }
00571 
00573   template <typename Self, typename T>
00574   typename automaton_traits<T>::hstate_t
00575   MetaElement<AutomataBase<Self>, T>::src_of(const typename automaton_traits<T>::htransition_t& e) const
00576   {
00577     return op_src_of(this->structure(), this->value(), e);
00578   }
00579 
00581   template <typename Self, typename T>
00582   typename automaton_traits<T>::hstate_t
00583   MetaElement<AutomataBase<Self>, T>::dst_of(const typename automaton_traits<T>::htransition_t& e) const
00584   {
00585     return op_dst_of(this->structure(), this->value(), e);
00586   }
00587 
00589   template <typename Self, typename T>
00590   typename automaton_traits<T>::label_t
00591   MetaElement<AutomataBase<Self>, T>::label_of(const typename automaton_traits<T>::htransition_t& e) const
00592   {
00593     return op_label_of(this->structure(), this->value(), e);
00594   }
00595 
00597   template <typename Self, typename T>
00598   typename MetaElement<AutomataBase<Self>, T>::series_set_elt_t
00599   MetaElement<AutomataBase<Self>, T>::series_of(const typename automaton_traits<T>::htransition_t& e) const
00600   {
00601     return op_series_of(this->structure(), this->value(), e);
00602   }
00603 
00605   template <typename Self, typename T>
00606   typename MetaElement<AutomataBase<Self>, T>::series_set_elt_value_t
00607   MetaElement<AutomataBase<Self>, T>::series_value_of(const typename automaton_traits<T>::htransition_t& e) const
00608   {
00609     return op_series_value_of(this->structure(), this->value(), e);
00610   }
00611 
00613   template <typename Self, typename T>
00614   bool
00615   MetaElement<AutomataBase<Self>, T>::is_spontaneous(const typename automaton_traits<T>::htransition_t& e) const
00616   {
00617     return op_is_spontaneous(this->structure(), this->value(), e);
00618   }
00619 
00621   template <typename Self, typename T>
00622   typename MetaElement<AutomataBase<Self>, T>::monoid_elt_t
00623   MetaElement<AutomataBase<Self>, T>::word_of(const typename automaton_traits<T>::htransition_t& e) const
00624   {
00625     return op_word_of(this->structure(), this->value(), e);
00626   }
00627 
00629   template <typename Self, typename T>
00630   typename MetaElement<AutomataBase<Self>, T>::semiring_elt_t
00631   MetaElement<AutomataBase<Self>, T>::weight_of(const typename automaton_traits<T>::htransition_t& e) const
00632   {
00633     return op_weight_of(this->structure(), this->value(), e);
00634   }
00635 
00637   template <typename Self, typename T>
00638   typename MetaElement<AutomataBase<Self>, T>::monoid_elt_value_t
00639   MetaElement<AutomataBase<Self>, T>::word_value_of(const typename automaton_traits<T>::htransition_t& e) const
00640   {
00641     return op_word_value_of(this->structure(), this->value(), e);
00642   }
00643 
00647   template <typename Self, typename T>
00648   typename MetaElement<AutomataBase<Self>, T>::letter_t
00649   MetaElement<AutomataBase<Self>, T>::letter_of(const typename automaton_traits<T>::htransition_t& e) const
00650   {
00651     return op_letter_of(this->structure(), this->value(), e);
00652   }
00653 
00654   template<typename S, typename St, typename T>
00655   St& op_rout(const AutomataBase<S>& s, St& st, const T& v)
00656   {
00657     Element<S, T> r(s.self(), v);
00658     st << "{ "
00659        << r.states().size() << " states, "
00660        << r.transitions().size() << " transitions, "
00661        << "#I = " << r.initial().size() << ", "
00662        << "#T = " << r.final().size()
00663        << " }";
00664     return st;
00665   }
00666 
00667   /*----------------------------------------------.
00668   | automaton to generalized automaton convertion |
00669   `----------------------------------------------*/
00670 
00671   template <typename Auto_>
00672   typename generalized_traits<Auto_>::automaton_t
00673   generalized(const Auto_& from)
00674   {
00675     typename generalized_traits<Auto_>::automaton_t to(from.structure());
00676     auto_copy(to, from);
00677     return to;
00678   }
00679 
00680 } // ! vcsn
00681 
00682 #endif // ! VCSN_AUTOMATA_CONCEPT_AUTOMATA_BASE_HXX