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/tools/usual_macros.hh>
00025
00026 namespace vcsn {
00027
00031
00032
00033
00035
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
00056
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
00102
00108 template <typename Self, typename T>
00109 struct MetaElement<TransducerBase<Self>, T>
00110 : MetaElement<AutomataBase<Self>, T>
00111 {
00113 typedef MetaElement<AutomataBase<Self>, T> automaton_t;
00114
00116 INHERIT_TYPEDEF_(automaton_t, series_set_t);
00117
00119 INHERIT_TYPEDEF_(automaton_t, series_set_elt_value_t);
00120
00122 INHERIT_TYPEDEF_(automaton_t, series_set_elt_t);
00123
00125 INHERIT_TYPEDEF_(automaton_t, monoid_t);
00126
00128 INHERIT_TYPEDEF_(automaton_t, monoid_elt_t);
00129
00131 INHERIT_TYPEDEF_(automaton_t, monoid_elt_value_t);
00132
00134 INHERIT_TYPEDEF_(automaton_t, letter_t);
00135
00137 INHERIT_TYPEDEF_(automaton_t, semiring_t);
00138
00140 INHERIT_TYPEDEF_(automaton_t, semiring_elt_t);
00141
00143 INHERIT_TYPEDEF_(automaton_t, semiring_elt_value_t);
00144
00146 INHERIT_TYPEDEF_(automaton_t, tag_t);
00147
00149 INHERIT_TYPEDEF_(automaton_t, label_t);
00150
00152 INHERIT_TYPEDEF_(automaton_t, states_t);
00153
00155 INHERIT_TYPEDEF_(automaton_t, state_iterator);
00156
00158 INHERIT_TYPEDEF_(automaton_t, transitions_t);
00159
00161 INHERIT_TYPEDEF_(automaton_t, transition_iterator);
00162
00164 INHERIT_TYPEDEF_(automaton_t, initial_t);
00165
00167 INHERIT_TYPEDEF_(automaton_t, initial_support_t);
00168
00170 INHERIT_TYPEDEF_(automaton_t, initial_iterator);
00171
00173 INHERIT_TYPEDEF_(automaton_t, final_t);
00174
00176 INHERIT_TYPEDEF_(automaton_t, final_iterator);
00177
00179 typedef MetaElement<TransducerBase<Self>, T> self_t;
00180
00182 typedef MetaElement<AutomataBase<Self>, T> mother_t;
00183
00185 typedef typename mother_t::semiring_elt_t output_series_set_elt_t;
00186
00187 typedef typename algebra::series_traits<semiring_elt_value_t>::monoid_elt_value_t
00188 output_monoid_elt_value_t;
00189
00191 typedef typename semiring_t::monoid_t output_monoid_t;
00192
00194 typedef Element<output_monoid_t, output_monoid_elt_value_t>
00195 output_monoid_elt_t;
00196
00197 typedef typename output_monoid_t::letter_t output_letter_t;
00198
00200 typedef typename mother_t::monoid_elt_value_t input_monoid_elt_value_t;
00201
00203 typedef typename mother_t::monoid_t input_monoid_t;
00204
00205
00206 typedef Element<input_monoid_t, input_monoid_elt_value_t>
00207 input_monoid_elt_t;
00208
00209 typedef typename input_monoid_t::letter_t input_letter_t;
00210
00212 typedef typename algebra::series_traits<semiring_elt_value_t>::semiring_elt_value_t
00213 output_semiring_elt_value_t;
00214
00216 typedef typename semiring_t::semiring_t output_semiring_t;
00217
00219 typedef Element<output_semiring_t, output_semiring_elt_value_t>
00220 output_semiring_elt_t;
00221
00223 input_monoid_elt_t input_of(htransition_t) const;
00224
00226 output_series_set_elt_t output_of(htransition_t) const;
00227
00230 htransition_t add_io_transition(hstate_t, hstate_t, input_monoid_elt_value_t,
00231 output_monoid_elt_value_t,
00232 output_semiring_elt_t = output_semiring_elt_t());
00233
00236 htransition_t add_io_transition(hstate_t, hstate_t, input_letter_t, output_letter_t,
00237 output_semiring_elt_t = output_semiring_elt_t());
00238
00240 htransition_t add_o_transition(hstate_t, hstate_t, output_letter_t,
00241 output_semiring_elt_t = output_semiring_elt_t());
00242
00244 htransition_t add_i_transition(hstate_t, hstate_t, input_letter_t,
00245 output_semiring_elt_t = output_semiring_elt_t());
00246
00248 void set_o_final(hstate_t, output_monoid_elt_value_t);
00249
00252 void set_o_initial(hstate_t, output_monoid_elt_value_t);
00253
00254 protected:
00255 MetaElement();
00256 MetaElement(const MetaElement& other);
00257 };
00258
00259
00262 }
00263
00264
00265 #ifndef VCSN_USE_INTERFACE_ONLY
00266 # include <vaucanson/automata/concept/transducer_base.hxx>
00267 #endif // VCSN_USE_INTERFACE_ONLY
00268
00269
00270 #endif // ! VCSN_AUTOMATA_CONCEPT_TRANSDUCER_BASE_HH