00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_SUM_HXX
00018 # define VCSN_ALGORITHMS_SUM_HXX
00019
00020 # include <vaucanson/algorithms/sum.hh>
00021
00022 # include <vaucanson/automata/concept/automata_base.hh>
00023
00024 # include <set>
00025 # include <map>
00026
00027 namespace vcsn {
00028
00029
00030 # define INSUM_EVENT "in place sum "
00031
00032
00033
00034
00035
00036 template <typename A, typename AI1, typename AI2>
00037 void
00038 do_sum(const AutomataBase<A>&, Element<A, AI1>& lhs, const Element<A, AI2>& rhs)
00039 {
00040 typedef Element<A, AI1> lhs_t;
00041 typedef Element<A, AI2> rhs_t;
00042 AUTOMATON_TYPES(rhs_t);
00043
00044
00045
00046
00047 std::map<typename rhs_t::hstate_t, typename lhs_t::hstate_t> states_map;
00048
00049 for_all_const_states(i, rhs)
00050 {
00051 typename lhs_t::hstate_t new_state = lhs.add_state();
00052 states_map[*i] = new_state;
00053
00054
00055
00056 lhs.set_final(new_state, rhs.get_final(*i));
00057 lhs.set_initial(new_state, rhs.get_initial(*i));
00058 }
00059
00060
00061
00062
00063
00064 for_all_const_states(i, rhs)
00065 {
00066 for (delta_iterator d(rhs.value(), *i);
00067 ! d.done();
00068 d.next())
00069 {
00070 lhs.add_transition(states_map[rhs.src_of(*d)],
00071 states_map[rhs.dst_of(*d)],
00072 rhs.label_of(*d));
00073
00074
00075
00076 }
00077 }
00078 }
00079
00080
00081 template<typename A, typename AI1, typename AI2>
00082 void
00083 sum_here(Element<A, AI1>& lhs, const Element<A, AI2>& rhs)
00084 {
00085 do_sum(lhs.structure(), lhs, rhs);
00086 }
00087
00088 template<typename A, typename AI1, typename AI2>
00089 Element<A, AI1>
00090 sum(const Element<A, AI1>& lhs, const Element<A, AI2>& rhs)
00091 {
00092 Element<A, AI1> ret(lhs);
00093
00094 do_sum(ret.structure(), ret, rhs);
00095 return ret;
00096 }
00097
00098 }
00099
00100 #endif // ! VCSN_ALGORITHMS_SUM_HXX