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(htransition_t) const;
00221 
00223       output_series_set_elt_t output_of(htransition_t) const;
00224 
00227       htransition_t
00228       add_io_transition(hstate_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       htransition_t
00236       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
00241       add_o_transition(hstate_t, hstate_t, output_letter_t,
00242                        output_semiring_elt_t = output_semiring_elt_t());
00243 
00245       htransition_t
00246       add_i_transition(hstate_t, hstate_t, input_letter_t,
00247                        output_semiring_elt_t = output_semiring_elt_t());
00248 
00250       void set_o_final(hstate_t, output_monoid_elt_value_t);
00251 
00254       void set_o_initial(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