Vaucanson 1.4
automata.hh
00001 // automata.hh: 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, 2007, 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_HH
00018 # define VCSN_AUTOMATA_CONCEPT_AUTOMATA_HH
00019 
00020 # include <vaucanson/automata/concept/automata_base.hh>
00021 # include <vaucanson/design_pattern/slots.hh>
00022 
00023 namespace vcsn
00024 {
00025 
00026   template <typename Series, typename Kind>
00027   // FIXME: Rename to AutomatonSet (see Trac #3)
00028   struct Automata;
00029 
00031   template <typename Series, typename Kind>
00032   struct dynamic_traits<Automata<Series, Kind> >
00033     : dynamic_traits<AutomataBase<Automata<Series, Kind> > >
00034   {
00035       static const bool ret = dynamic_traits<Series>::ret;
00036   };
00037 
00039   template <typename Series, typename Kind, typename T>
00040   struct MetaElement<Automata<Series, Kind>, T>
00041     : MetaElement<AutomataBase<Automata<Series, Kind> >, T>
00042   {};
00043 
00045   template <typename Series, typename Kind>
00046   struct virtual_types<Automata<Series, Kind> >
00047     : virtual_types<AutomataBase<Automata<Series, Kind> > >
00048   {
00049       typedef Series series_set_t;
00050       typedef Kind kind_t;
00051   };
00052 
00053 
00055   template <typename Series, typename Kind>
00056   class Automata
00057     : public AutomataBase<Automata<Series, Kind> >,
00058       private SetSlot<Series>
00059   {
00060     public:
00061       typedef Automata<Series, Kind> self_t;
00062       typedef Series series_set_t;
00063       typedef Kind kind_t;
00064 
00065       Automata(const series_set_t&);
00066 
00067       const series_set_t&       series() const;
00068   };
00069 
00070   template <typename S, typename K, typename T>
00071   struct projection_traits<Automata<S, K>, T>
00072   {
00073     typedef Automata<S, K> structure_t;
00074     typedef T impl_t;
00075 
00076     typedef Element<structure_t, impl_t> automaton_t;
00077 
00078     typedef typename automaton_t::series_set_elt_t series_set_elt_t;
00079 
00080     typedef typename structure_t::series_set_t series_set_t;
00081 
00082     typedef typename structure_t::series_set_t::semiring_t semiring_t;
00083 
00084     typedef typename structure_t::series_set_t::monoid_t monoid_t;
00085 
00086     typedef typename impl_t::monoid_elt_value_t monoid_elt_value_t;
00087 
00088     typedef typename monoid_t::alphabet_t alphabet_t;
00089 
00090     typedef typename algebra::alphabet_traits<typename alphabet_t::set_t,
00091                                               typename alphabet_t::value_t>
00092                                               alphabet_traits_t;
00093 
00094     typedef typename algebra::word_traits<monoid_t, monoid_elt_value_t>
00095                                           word_traits_t;
00096 
00097     typedef typename word_traits_t::first_monoid_t first_monoid_t;
00098 
00099     typedef typename word_traits_t::second_monoid_t second_monoid_t;
00100 
00101     typedef typename algebra::mute_series_traits<series_set_t,
00102                                                  semiring_t,
00103                                                  first_monoid_t>::ret
00104                                                  first_series_t;
00105 
00106     typedef typename algebra::mute_series_traits<series_set_t,
00107                                                  semiring_t,
00108                                                  second_monoid_t>::ret
00109                                                  second_series_t;
00110 
00111     typedef typename mute_graph_impl_traits<impl_t, word_traits_t>::
00112         first_projection_t first_impl_t;
00113 
00114     typedef typename mute_graph_impl_traits<impl_t, word_traits_t>::
00115         second_projection_t second_impl_t;
00116 
00117     typedef Element<Automata<first_series_t, K>, first_impl_t>
00118         first_projection_t;
00119 
00120     typedef Element<Automata<second_series_t, K>, second_impl_t>
00121         second_projection_t;
00122 
00123     // These are only "makers". Ie they will not contruct the projection.
00124     // See the relevant algorithms.
00125     static first_projection_t first_projection(const automaton_t&);
00126     static second_projection_t second_projection(const automaton_t&);
00127 
00128     typedef automaton_traits<first_impl_t> first_series_traits_t;
00129 
00130     typedef automaton_traits<second_impl_t> second_series_traits_t;
00131 
00132     typedef Element<first_series_t,
00133                     typename first_series_traits_t::series_set_elt_value_t>
00134         series_first_projection_t;
00135 
00136     typedef Element<second_series_t,
00137                     typename second_series_traits_t::series_set_elt_value_t>
00138         series_second_projection_t;
00139 
00140     // FIXME: As for now we limit series projection here. In the future,
00141     // we will move it in series_traits.
00142     static series_first_projection_t
00143         series_first_projection(const first_series_t&,
00144                                 const series_set_elt_t&);
00145     static series_second_projection_t
00146         series_second_projection(const second_series_t&,
00147                                  const series_set_elt_t&);
00148   };
00149 
00150 // Some usefull types to manipulate pair letters automaton.
00151 # define AUTOMATON_PROJECTION_TYPES()                                           \
00152       typedef algebra::alphabet_traits<alphabet_t::set_t,                       \
00153               alphabet_t::value_t> alphabet_traits_t;                           \
00154       typedef alphabet_traits_t::first_projection_t                             \
00155               first_projection_alphabet_t;                                      \
00156       typedef alphabet_traits_t::second_projection_t                            \
00157               second_projection_alphabet_t;                                     \
00158                                                                                 \
00159       typedef algebra::word_traits<monoid_elt_t::set_t,                         \
00160               monoid_elt_t::value_t> word_traits_t;                             \
00161       typedef word_traits_t::first_monoid_t first_monoid_t;                     \
00162       typedef word_traits_t::second_monoid_t second_monoid_t;                   \
00163       typedef word_traits_t::first_projection_t first_projection_word_t;        \
00164       typedef word_traits_t::second_projection_t second_projection_word_t;      \
00165                                                                                 \
00166       typedef projection_traits<automata_set_t, automaton_impl_t>               \
00167               projection_traits_t;                                              \
00168       typedef projection_traits_t::first_projection_t                           \
00169               first_projection_automaton_t;                                     \
00170       typedef projection_traits_t::second_projection_t                          \
00171               second_projection_automaton_t
00172 
00173   template <typename Series, typename Kind>
00174   bool
00175   operator==(const Automata<Series, Kind>&, const Automata<Series, Kind>&);
00176 
00177 } // ! vcsn
00178 
00179 
00180 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00181 #  include <vaucanson/automata/concept/automata.hxx>
00182 # endif // VCSN_USE_INTERFACE_ONLY
00183 
00184 
00185 #endif // ! VCSN_AUTOMATA_CONCEPT_AUTOMATA_HH