00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_AUTOMATA_CONCEPT_TRANSDUCER_HH
00018 # define VCSN_AUTOMATA_CONCEPT_TRANSDUCER_HH
00019
00020 # include <vaucanson/design_pattern/design_pattern.hh>
00021 # include <vaucanson/automata/concept/automata.hh>
00022 # include <vaucanson/automata/concept/automata_base.hh>
00023 # include <vaucanson/automata/concept/transducer_base.hh>
00024
00025 namespace vcsn {
00026
00027 template <class Series>
00028 struct Transducer;
00029
00031 template <class Series>
00032 struct dynamic_traits<Transducer<Series> >
00033 : dynamic_traits<TransducerBase<Series> >
00034 {
00035 static const bool ret = dynamic_traits<Series>::ret;
00036 };
00037
00039 template <class Series, typename T>
00040 struct MetaElement<Transducer<Series>, T>
00041 : MetaElement<TransducerBase<Transducer<Series> >, T>
00042 {};
00043
00045 template <class Series>
00046 struct virtual_types<Transducer<Series> >
00047 {
00048 typedef Series series_set_t;
00049 };
00050
00052 template <class Series>
00053 class Transducer
00054 : public TransducerBase<Transducer<Series> >,
00055 private SetSlot<Series>
00056 {
00057 public:
00058 typedef Transducer<Series> self_t;
00059 typedef typename virtual_types<self_t>::series_set_t series_set_t;
00060
00061 Transducer(const series_set_t&);
00062
00063 const series_set_t& series() const;
00064
00065 };
00066
00067
00068
00069
00070
00071
00072 template <class S, class T>
00073 struct input_projection_helper
00074 { };
00075
00076 template <class S, class T>
00077 struct input_projection_helper<Transducer<S>, T>
00078 {
00079 typedef typename Transducer<S>::series_set_t::semiring_t
00080 typeof_auto_series_set_t;
00081
00082 typedef typename Transducer<S>::series_set_t::monoid_t auto_monoid_t;
00083
00084 typedef typename typeof_auto_series_set_t::semiring_t auto_semiring_t;
00085 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t,
00086 auto_semiring_t,
00087 auto_monoid_t>::ret
00088 auto_series_set_t;
00089
00090 typedef typename output_projection_traits<T>::ret auto_impl_t;
00091 typedef Element<Automata<auto_series_set_t>, auto_impl_t> ret;
00092 };
00093
00094 template <class S, class T>
00095 struct input_projection_helper<Automata<S>, T>
00096 {
00097 typedef Automata<S> structure_t;
00098
00099 typedef typename structure_t::series_set_t typeof_auto_series_set_t;
00100
00101 typedef typename structure_t::series_set_t::semiring_t auto_semiring_t;
00102
00103 typedef typename structure_t::series_set_t::monoid_t::first_monoid_t
00104 auto_monoid_t;
00105
00106 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t,
00107 auto_semiring_t,
00108 auto_monoid_t>::ret
00109 auto_series_set_t;
00110
00111 typedef typename fmp_projection_traits<T>::ret auto_impl_t;
00112 typedef Element<Automata<auto_series_set_t>, auto_impl_t> ret;
00113 };
00114
00115
00116
00117
00118
00119 template <class S, class T>
00120 struct output_projection_helper
00121 { };
00122
00123
00124 template <class S, class T>
00125 struct output_projection_helper<Transducer<S>, T>
00126 {
00127 typedef Transducer<S> structure_t;
00128
00129 typedef typename structure_t::series_set_t::semiring_t
00130 typeof_auto_series_set_t;
00131
00132 typedef typename structure_t::series_set_t::semiring_t::monoid_t
00133 auto_monoid_t;
00134
00135 typedef typename typeof_auto_series_set_t::semiring_t auto_semiring_t;
00136 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t,
00137 auto_semiring_t,
00138 auto_monoid_t>::ret
00139 auto_series_set_t;
00140
00141 typedef typename output_projection_traits<T>::ret auto_impl_t;
00142 typedef Element<Automata<auto_series_set_t>, auto_impl_t> ret;
00143 };
00144
00145
00146
00147
00148
00149 template <class S, class T>
00150 struct output_projection_helper<Automata<S>, T>
00151 {
00152 typedef Automata<S> structure_t;
00153
00154 typedef typename structure_t::series_set_t typeof_auto_series_set_t;
00155
00156 typedef typename structure_t::series_set_t::semiring_t auto_semiring_t;
00157
00158 typedef typename structure_t::series_set_t::monoid_t::second_monoid_t
00159 auto_monoid_t;
00160
00161 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t,
00162 auto_semiring_t,
00163 auto_monoid_t>::ret
00164 auto_series_set_t;
00165
00166 typedef typename fmp_output_projection_traits<T>::ret auto_impl_t;
00167
00168 typedef Element<Automata<auto_series_set_t>, auto_impl_t> ret;
00169 };
00170
00171
00172
00173
00174
00175 template <class S, class T>
00176 struct identity_transducer_helper
00177 {
00178 typedef typename S::series_set_t series_set_t;
00179 typedef typename series_set_t::monoid_t monoid_t;
00180 typedef typename series_set_t::semiring_t semiring_t;
00181 typedef typename algebra::mute_series_traits<series_set_t, series_set_t, monoid_t>
00182 ::ret tseries_set_t;
00183 typedef typename extension_traits<T>::ret impl_t;
00184 typedef Element<Transducer<tseries_set_t>, impl_t> ret;
00185 };
00186
00187 template <class S, class T>
00188 typename identity_transducer_helper<S, T>::ret
00189 partial_identity(const Element<S, T>&);
00190
00191 template <class Series>
00192 bool
00193 operator==(const Transducer<Series>&, const Transducer<Series>&);
00194
00195 }
00196
00197
00198 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00199 # include <vaucanson/automata/concept/transducer.hxx>
00200 #endif // VCSN_USE_INTERFACE_ONLY
00201
00202
00203 #endif // ! VCSN_AUTOMATA_CONCEPT_TRANSDUCER_HH