18 #ifndef VCSN_ALGORITHMS_AUT_PROJECTION_HXX
19 # define VCSN_ALGORITHMS_AUT_PROJECTION_HXX
25 template <
typename S,
typename T>
27 do_first_projection(
const Element<S, T>& src,
28 typename projection_traits<S, T>::
29 first_projection_t& dst)
31 BENCH_TASK_SCOPED(
"first_projection");
34 typedef Element<S, T> automaton_t;
35 typedef projection_traits<S, T> projection_traits_t;
36 typedef typename projection_traits_t::first_projection_t res_t;
37 AUTOMATON_TYPES(automaton_t);
38 AUTOMATON_TYPES_(res_t, res_);
41 std::map<hstate_t, res_hstate_t> m;
44 for_all_const_states(p, src)
45 m[*p] = dst.add_state();
48 for_all_const_initial_states(i, src)
50 dst.set_initial(m[*i],
52 series_first_projection(dst.series(),
53 src.get_initial(*i)));
57 for_all_const_transitions(e, src)
59 dst.add_series_transition(m[src.src_of(*e)],
62 series_first_projection(dst.series(),
67 for_all_const_final_states(f, src)
71 series_first_projection(dst.series(),
76 template <
typename S,
typename T>
78 do_second_projection(
const Element<S, T>& src,
79 typename projection_traits<S, T>::
80 second_projection_t& dst)
82 BENCH_TASK_SCOPED(
"second_projection");
85 typedef Element<S, T> automaton_t;
86 typedef projection_traits<S, T> projection_traits_t;
87 typedef typename projection_traits_t::second_projection_t res_t;
88 AUTOMATON_TYPES(automaton_t);
89 AUTOMATON_TYPES_(res_t, res_);
92 std::map<hstate_t, res_hstate_t> m;
95 for_all_const_states(p, src)
96 m[*p] = dst.add_state();
99 for_all_const_initial_states(i, src)
101 dst.set_initial(m[*i],
102 projection_traits_t::
103 series_second_projection(dst.series(),
104 src.get_initial(*i)));
108 for_all_const_transitions(e, src)
110 dst.add_series_transition(m[src.src_of(*e)],
112 projection_traits_t::
113 series_second_projection(dst.series(),
118 for_all_const_final_states(f, src)
121 projection_traits_t::
122 series_second_projection(dst.series(),
135 template <
typename S,
typename T>
137 first_projection(
const Element<S, T>& src,
138 typename projection_traits<S, T>::first_projection_t& dst)
140 do_first_projection(src, dst);
143 template <
typename S,
typename T>
144 typename projection_traits<S, T>::first_projection_t
145 first_projection(
const Element<S, T>& src)
147 typename projection_traits<S, T>::first_projection_t
148 dst = projection_traits<S, T>::first_projection(src);
150 do_first_projection(src, dst);
159 template <
typename S,
typename T>
161 second_projection(
const Element<S, T>& src,
162 typename projection_traits<S, T>::
163 second_projection_t& dst)
165 do_second_projection(src, dst);
168 template <
typename S,
typename T>
169 typename projection_traits<S, T>::second_projection_t
170 second_projection(
const Element<S, T>& src)
172 typename projection_traits<S, T>::second_projection_t
173 dst = projection_traits<S, T>::second_projection(src);
175 do_second_projection(src, dst);
182 #endif // ! VCSN_ALGORITHMS_AUT_PROJECTION_HXX