Vaucanson 1.4
|
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