00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_AUTOMATA_CONCEPT_COPY_HXX
00018 # define VCSN_AUTOMATA_CONCEPT_COPY_HXX
00019
00020 #include <vaucanson/automata/concept/handlers.hh>
00021 #include <map>
00022
00023
00024 namespace vcsn
00025 {
00026
00027 template<typename lhs_t, typename rhs_t>
00028 void auto_copy(lhs_t& dst_,
00029 const rhs_t& from)
00030 {
00031 lhs_t dst(dst_.structure());
00032 typedef typename lhs_t::series_set_elt_t dst_series_set_elt_t;
00033
00034 std::map<hstate_t, hstate_t> stmap;
00035
00036 for (typename rhs_t::state_iterator i = from.states().begin();
00037 i != from.states().end();
00038 ++i)
00039 {
00040 hstate_t s = dst.add_state();
00041 dst_series_set_elt_t s_(from.get_final(*i));
00042 dst.set_final(s, s_);
00043 dst_series_set_elt_t s__(from.get_initial(*i));
00044 dst.set_initial(s, s__);
00045 stmap[*i] = s;
00046 }
00047
00048 for (typename rhs_t::transition_iterator i = from.transitions().begin();
00049 i != from.transitions().end();
00050 ++i)
00051 {
00052 dst_series_set_elt_t s(from.series_of(*i));
00053 dst.add_series_transition(stmap[from.src_of(*i)], stmap[from.dst_of(*i)], s);
00054 }
00055 dst_.swap(dst);
00056 }
00057
00058 template<typename auto_t>
00059 auto_t auto_copy(const auto_t& from)
00060 {
00061 auto_t dst;
00062 auto_copy(dst, from);
00063 return dst;
00064 }
00065
00066 }
00067
00068
00069 #endif // ! VCSN_AUTOMATA_CONCEPT_COPY_HXX