17 #ifndef VCSN_AUTOMATA_CONCEPT_AUTOMATA_HXX
18 # define VCSN_AUTOMATA_CONCEPT_AUTOMATA_HXX
20 #include <vaucanson/automata/concept/automata_base.hh>
25 template <
typename Series,
typename Kind>
26 Automata<Series, Kind>::Automata(
const series_set_t& s):
30 template <
typename Series,
typename Kind>
34 return this->_structure_get();
37 template <
typename Series,
typename Kind>
45 # define PROJECTION_TRAITS \
46 projection_traits<Automata<S, K>, T>
48 template <
typename S,
typename K,
typename T>
49 inline typename PROJECTION_TRAITS::first_projection_t
51 first_projection(
const PROJECTION_TRAITS::automaton_t& aut)
54 static_assertion_(not (misc::static_eq<first_projection_t,
55 undefined_type>::value), need_first_projection);
57 semiring_t semiring = aut.series().semiring();
58 alphabet_t A = aut.series().monoid().alphabet();
61 typename alphabet_traits_t::first_projection_t B =
62 alphabet_traits_t::first_projection(A);
65 typename word_traits_t::first_monoid_t freemonoid(B);
68 typename first_projection_t::series_set_t series(semiring, freemonoid);
71 typename first_projection_t::set_t set_t(series);
73 return first_projection_t(set_t);
76 template <
typename S,
typename K,
typename T>
77 inline typename PROJECTION_TRAITS::second_projection_t
79 second_projection(
const PROJECTION_TRAITS::automaton_t& aut)
82 static_assertion_(not (misc::static_eq<second_projection_t,
83 undefined_type>::value), need_second_projection);
85 semiring_t semiring = aut.series().semiring();
86 alphabet_t A = aut.series().monoid().alphabet();
89 typename alphabet_traits_t::second_projection_t B =
90 alphabet_traits_t::second_projection(A);
93 typename word_traits_t::second_monoid_t freemonoid(B);
96 typename second_projection_t::series_set_t series(semiring, freemonoid);
99 typename second_projection_t::set_t set_t(series);
101 return second_projection_t(set_t);
104 template <
typename S,
typename K,
typename T>
105 inline typename PROJECTION_TRAITS::series_first_projection_t
107 series_first_projection(
const PROJECTION_TRAITS::first_series_t& series,
108 const PROJECTION_TRAITS::series_set_elt_t& ss)
111 static_assertion_(not (misc::static_eq<first_projection_t,
112 undefined_type>::value), need_first_projection);
114 series_first_projection_t ret(series);
116 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
117 ret.assoc(word_traits_t::first_projection(*s),
123 template <
typename S,
typename K,
typename T>
124 inline typename PROJECTION_TRAITS::series_second_projection_t
126 series_second_projection(
const PROJECTION_TRAITS::second_series_t& series,
127 const PROJECTION_TRAITS::series_set_elt_t& ss)
130 static_assertion_(not (misc::static_eq<second_projection_t,
131 undefined_type>::value), need_second_projection);
133 series_second_projection_t ret(series);
135 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
136 ret.assoc(word_traits_t::second_projection(*s),
142 # undef PROJECTION_TRAITS
146 #endif // ! VCSN_AUTOMATA_CONCEPT_AUTOMATA_HXX