00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_AUTOMATA_CONCEPT_TRANSDUCER_BASE_HH
00018 # define VCSN_AUTOMATA_CONCEPT_TRANSDUCER_BASE_HH
00019
00020 # include <iterator>
00021 # include <vaucanson/design_pattern/design_pattern.hh>
00022 # include <vaucanson/design_pattern/predecls.hh>
00023 # include <vaucanson/automata/concept/automata_base.hh>
00024 # include <vaucanson/misc/usual_macros.hh>
00025
00026 namespace vcsn {
00027
00031
00032
00033
00040 template <typename Self>
00041 struct TransducerBase
00042 : AutomataBase<Self>
00043 {
00044 public:
00046 typedef typename virtual_types<Self>::series_set_t series_set_t;
00047
00048 protected:
00050 TransducerBase();
00051
00053 TransducerBase(const TransducerBase& other);
00054 };
00055
00057 template <typename T>
00058 struct transducer_traits
00059 {
00060 typedef undefined_type input_monoid_elt_value_t;
00061 typedef undefined_type output_monoid_elt_value_t;
00062 };
00063
00064 template <typename T>
00065 struct extension_traits
00066 {
00067 typedef undefined_type ret;
00068 };
00069
00070 template <class S, class T>
00071 struct projection_traits
00072 {
00073 typedef undefined_type ret;
00074 };
00075
00076 template <class T>
00077 struct output_projection_traits
00078 {
00079 typedef undefined_type ret;
00080 };
00081
00082
00083
00084
00085 template <class S>
00086 struct virtual_types<TransducerBase<S> >
00087 : virtual_types<AutomataBase<S> >
00088 { };
00089
00090
00091
00092
00093 template <class S>
00094 struct dynamic_traits<TransducerBase<S> >
00095 : dynamic_traits<AutomataBase<S> >
00096 { };
00097
00098
00099
00100
00108 template <typename Self, typename T>
00109 struct MetaElement<TransducerBase<Self>, T>
00110 : MetaElement<AutomataBase<Self>, T>
00111 {
00113 typedef MetaElement<TransducerBase<Self>, T> self_t;
00114
00116 typedef MetaElement<AutomataBase<Self>, T> super_t;
00117
00119 typedef MetaElement<AutomataBase<Self>, T> automaton_t;
00120
00122 IMPORT_TYPEDEF_(automaton_t, series_set_t);
00123
00125 IMPORT_TYPEDEF_(automaton_t, series_set_elt_value_t);
00126
00128 IMPORT_TYPEDEF_(automaton_t, series_set_elt_t);
00129
00131 IMPORT_TYPEDEF_(automaton_t, monoid_t);
00132
00134 IMPORT_TYPEDEF_(automaton_t, monoid_elt_t);
00135
00137 IMPORT_TYPEDEF_(automaton_t, monoid_elt_value_t);
00138
00140 IMPORT_TYPEDEF_(automaton_t, letter_t);
00141
00143 IMPORT_TYPEDEF_(automaton_t, semiring_t);
00144
00146 IMPORT_TYPEDEF_(automaton_t, semiring_elt_t);
00147
00149 IMPORT_TYPEDEF_(automaton_t, semiring_elt_value_t);
00150
00152 IMPORT_TYPEDEF_(automaton_t, tag_t);
00153
00155 IMPORT_TYPEDEF_(automaton_t, label_t);
00156
00158 IMPORT_TYPEDEF_(automaton_t, states_t);
00159
00161 IMPORT_TYPEDEF_(automaton_t, state_iterator);
00162
00164 IMPORT_TYPEDEF_(automaton_t, transitions_t);
00165
00167 IMPORT_TYPEDEF_(automaton_t, transition_iterator);
00168
00170 IMPORT_TYPEDEF_(automaton_t, initial_support_t);
00171
00173 IMPORT_TYPEDEF_(automaton_t, initial_iterator);
00174
00176 IMPORT_TYPEDEF_(automaton_t, final_support_t);
00177
00179 IMPORT_TYPEDEF_(automaton_t, final_iterator);
00180
00182 typedef typename super_t::semiring_elt_t output_series_set_elt_t;
00183
00184 typedef typename algebra::series_traits<semiring_elt_value_t>::monoid_elt_value_t
00185 output_monoid_elt_value_t;
00186
00188 typedef typename semiring_t::monoid_t output_monoid_t;
00189
00191 typedef Element<output_monoid_t, output_monoid_elt_value_t>
00192 output_monoid_elt_t;
00193
00194 typedef typename output_monoid_t::letter_t output_letter_t;
00195
00197 typedef typename super_t::monoid_elt_value_t input_monoid_elt_value_t;
00198
00200 typedef typename super_t::monoid_t input_monoid_t;
00201
00203 typedef Element<input_monoid_t, input_monoid_elt_value_t>
00204 input_monoid_elt_t;
00205
00206 typedef typename input_monoid_t::letter_t input_letter_t;
00207
00209 typedef typename algebra::series_traits<semiring_elt_value_t>::semiring_elt_value_t
00210 output_semiring_elt_value_t;
00211
00213 typedef typename semiring_t::semiring_t output_semiring_t;
00214
00216 typedef Element<output_semiring_t, output_semiring_elt_value_t>
00217 output_semiring_elt_t;
00218
00220 input_monoid_elt_t input_of(typename automaton_traits<T>::htransition_t) const;
00221
00223 output_series_set_elt_t output_of(typename automaton_traits<T>::htransition_t) const;
00224
00227 typename automaton_traits<T>::htransition_t
00228 add_io_transition(typename automaton_traits<T>::hstate_t, typename automaton_traits<T>::hstate_t,
00229 input_monoid_elt_value_t,
00230 output_monoid_elt_value_t,
00231 output_semiring_elt_t = output_semiring_elt_t());
00232
00235 typename automaton_traits<T>::htransition_t
00236 add_io_transition(typename automaton_traits<T>::hstate_t, typename automaton_traits<T>::hstate_t, input_letter_t, output_letter_t,
00237 output_semiring_elt_t = output_semiring_elt_t());
00238
00240 typename automaton_traits<T>::htransition_t
00241 add_o_transition(typename automaton_traits<T>::hstate_t, typename automaton_traits<T>::hstate_t, output_letter_t,
00242 output_semiring_elt_t = output_semiring_elt_t());
00243
00245 typename automaton_traits<T>::htransition_t
00246 add_i_transition(typename automaton_traits<T>::hstate_t, typename automaton_traits<T>::hstate_t, input_letter_t,
00247 output_semiring_elt_t = output_semiring_elt_t());
00248
00250 void set_o_final(typename automaton_traits<T>::hstate_t, output_monoid_elt_value_t);
00251
00254 void set_o_initial(typename automaton_traits<T>::hstate_t, output_monoid_elt_value_t);
00255
00256 protected:
00257 MetaElement();
00258 MetaElement(const MetaElement& other);
00259 };
00260
00261
00265 }
00266
00267
00268 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00269 # include <vaucanson/automata/concept/transducer_base.hxx>
00270 # endif // VCSN_USE_INTERFACE_ONLY
00271
00272
00273 #endif // ! VCSN_AUTOMATA_CONCEPT_TRANSDUCER_BASE_HH