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     typedef typename rhs_t::state_iterator state_iterator;
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     typedef std::list<typename rhs_t::htransition_t> dst_t;
00065     dst_t dst;
00066 
00067     for_all_const_states(i, rhs)
00068     {
00069       dst.clear();
00070       rhs.deltac(dst, *i, delta_kind::transitions());
00071       for (typename dst_t::const_iterator d = dst.begin();
00072            d != dst.end();
00073            ++d)
00074       {
00075         lhs.add_transition(states_map[rhs.src_of(*d)],
00076                            states_map[rhs.dst_of(*d)],
00077                            rhs.label_of(*d));
00078 
00079         
00080         
00081       }
00082     }
00083   }
00084 
00085   
00086   template<typename A, typename AI1, typename AI2>
00087   void
00088   sum_here(Element<A, AI1>& lhs, const Element<A, AI2>& rhs)
00089   {
00090     do_sum(lhs.structure(), lhs, rhs);
00091   }
00092 
00093   template<typename A, typename AI1, typename AI2>
00094   Element<A, AI1>
00095   sum(const Element<A, AI1>& lhs, const Element<A, AI2>& rhs)
00096   {
00097     Element<A, AI1> ret(lhs);
00098     
00099     do_sum(ret.structure(), ret, rhs);
00100     return ret;
00101   }
00102 
00103 } 
00104 
00105 #endif // ! VCSN_ALGORITHMS_SUM_HXX