00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #ifndef VCSN_TOOLS_IO_HXX
00019 # define VCSN_TOOLS_IO_HXX
00020 
00021 # include <vaucanson/tools/io.hh>
00022 # include <sstream>
00023 
00024 namespace vcsn
00025 {
00026 
00027   namespace tools
00028   {
00029 
00030     
00031 
00032 
00033 
00034     template<typename Auto, typename TransitionConverter, typename Format>
00035     Auto& automaton_saver_<Auto, TransitionConverter, Format>::automaton()
00036     {
00037       return a_;
00038     }
00039 
00040     template<typename Auto, typename TransitionConverter, typename Format>
00041     const Auto& automaton_saver_<Auto, TransitionConverter, Format>::
00042     automaton() const
00043     {
00044       return a_;
00045     }
00046 
00047     template<typename Auto, typename TransitionConverter, typename Format>
00048     automaton_saver_<Auto, TransitionConverter, Format>::
00049     automaton_saver_(const Auto& a,
00050                      const TransitionConverter& c,
00051                      const Format& f)
00052       : a_(a), conv_(c), format_(f)
00053     {}
00054 
00055     template<typename Auto, typename TransitionConverter, typename Format>
00056     std::ostream&
00057     operator<<(std::ostream& o,
00058                const automaton_saver_<Auto, TransitionConverter, Format>& s)
00059     {
00060       BENCH_TASK_SCOPED("automaton output");
00061       s.format_(o, s, s.conv_);
00062       return o;
00063     }
00064 
00065     template<typename S, typename T>
00066     std::string string_out::operator()(const AutomataBase<S>&, const T& t) const
00067     {
00068       std::ostringstream os;
00069       os << t;
00070       return os.str();
00071     }
00072 
00073     template<typename S, typename T>
00074     std::string string_out::operator()(const TransducerBase<S>&, const T& t) const
00075     {
00076       std::ostringstream os;
00077       os << t;
00078       return os.str();
00079     }
00080 
00081   } 
00082 
00083   template<typename Auto, typename TransitionConverter, typename Format>
00084   tools::automaton_saver_<Auto, TransitionConverter, Format>
00085   automaton_saver(const Auto& a,
00086                   const TransitionConverter& e,
00087                   const Format& f)
00088   {
00089     return tools::automaton_saver_<Auto, TransitionConverter, Format>(a, e, f);
00090   }
00091 
00092   namespace tools
00093   {
00094     
00095 
00096 
00097 
00098     template<typename RE, typename TransitionConverter, typename Format>
00099     RE& regexp_saver_<RE, TransitionConverter, Format>::rat_exp()
00100     {
00101       return r_;
00102     }
00103 
00104     template<typename RE, typename TransitionConverter, typename Format>
00105     const RE& regexp_saver_<RE, TransitionConverter, Format>::
00106     rat_exp() const
00107     {
00108       return r_;
00109     }
00110 
00111     template<typename RE, typename TransitionConverter, typename Format>
00112     regexp_saver_<RE, TransitionConverter, Format>::
00113     regexp_saver_(const RE& r,
00114                   const TransitionConverter& c,
00115                   const Format& f)
00116       : r_(r), conv_(c), format_(f)
00117     {}
00118 
00119     template<typename RE, typename TransitionConverter, typename Format>
00120     std::ostream&
00121     operator<<(std::ostream& o,
00122                const regexp_saver_<RE, TransitionConverter, Format>& s)
00123     {
00124       BENCH_TASK_SCOPED("regexp output");
00125       s.format_(o, s, s.conv_);
00126       return o;
00127     }
00128 
00129   } 
00130 
00131   template<typename RE, typename TransitionConverter, typename Format>
00132   tools::regexp_saver_<RE, TransitionConverter, Format>
00133   regexp_saver(const RE& r,
00134                const TransitionConverter& e,
00135                const Format& f)
00136   {
00137     return tools::regexp_saver_<RE, TransitionConverter, Format>(r, e, f);
00138   }
00139 
00140   namespace tools
00141   {
00142 
00143     
00144 
00145 
00146 
00147     template<typename Auto, typename TransitionConverter, typename Format>
00148     Auto& automaton_loader_<Auto, TransitionConverter, Format>::automaton()
00149     {
00150       return a_;
00151     }
00152 
00153     template<typename Auto, typename TransitionConverter, typename Format>
00154     const Auto&
00155     automaton_loader_<Auto, TransitionConverter, Format>::automaton() const
00156     {
00157       return a_;
00158     }
00159 
00160     template<typename Auto, typename TransitionConverter, typename Format>
00161     automaton_loader_<Auto, TransitionConverter, Format>::
00162     automaton_loader_(Auto& a,
00163                       const TransitionConverter& conv,
00164                       const Format& format,
00165                       bool merge_states)
00166       : a_(a),
00167         conv_(conv),
00168         format_(format),
00169         scount_(0),
00170         smap_(),
00171         merge_states_(merge_states)
00172     {}
00173 
00174     template<typename Auto, typename TransitionConverter, typename Format>
00175     typename Auto::hstate_t
00176     automaton_loader_<Auto, TransitionConverter, Format>::
00177     add_state(unsigned s)
00178     {
00179       if (smap_.find(s) == smap_.end())
00180       {
00181         if (a_.has_state(s) && merge_states_)
00182           smap_[s] = hstate_t(s);
00183         else
00184           smap_[s] = a_.add_state();
00185       }
00186       return smap_[s];
00187     }
00188 
00189     template<typename Auto, typename TransitionConverter, typename Format>
00190     void automaton_loader_<Auto, TransitionConverter, Format>::
00191     set_initial(unsigned s, const std::string& lbl)
00192     {
00193       a_.set_initial(add_state(s), conv_(a_, lbl));
00194     }
00195 
00196     template<typename Auto, typename TransitionConverter, typename Format>
00197     void automaton_loader_<Auto, TransitionConverter, Format>::
00198     set_final(unsigned s, const std::string& lbl)
00199     {
00200       a_.set_final(add_state(s), conv_(a_, lbl));
00201     }
00202 
00203     template<typename Auto, typename TransitionConverter, typename Format>
00204     void automaton_loader_<Auto, TransitionConverter, Format>::
00205     add_spontaneous(unsigned from, unsigned to)
00206     {
00207       a_.add_spontaneous(add_state(from), add_state(to));
00208     }
00209 
00210     template<typename Auto, typename TransitionConverter, typename Format>
00211     void automaton_loader_<Auto, TransitionConverter, Format>::
00212     add_transition(unsigned from, unsigned to, const std::string& lbl)
00213     {
00214       a_.add_series_transition(add_state(from), add_state(to), conv_(a_, lbl));
00215     }
00216 
00217     template<typename Auto, typename TransitionConverter, typename Format>
00218     std::istream&
00219     operator>>(std::istream& in,
00220                automaton_loader_<Auto, TransitionConverter, Format> l)
00221     {
00222       BENCH_TASK_SCOPED("automaton input");
00223       l.format_(in, l);
00224       return in;
00225     }
00226 
00227   } 
00228 
00229   template<typename Auto, typename TransitionConverter, typename Format>
00230   tools::automaton_loader_<Auto, TransitionConverter, Format>
00231   automaton_loader(Auto& a,
00232                    const TransitionConverter& e,
00233                    const Format& f,
00234                    bool merge_states)
00235   {
00236     return tools::automaton_loader_<Auto, TransitionConverter, Format>
00237       (a, e, f, merge_states);
00238   }
00239 
00240   namespace tools
00241   {
00242 
00243     
00244 
00245 
00246 
00247     template<typename RE, typename TransitionConverter, typename Format>
00248     RE& regexp_loader_<RE, TransitionConverter, Format>::rat_exp()
00249     {
00250       return r_;
00251     }
00252 
00253     template<typename RE, typename TransitionConverter, typename Format>
00254     const RE&
00255     regexp_loader_<RE, TransitionConverter, Format>::rat_exp() const
00256     {
00257       return r_;
00258     }
00259 
00260     template<typename RE, typename TransitionConverter, typename Format>
00261     regexp_loader_<RE, TransitionConverter, Format>::
00262     regexp_loader_(RE& r,
00263                    const TransitionConverter& conv,
00264                    const Format& format)
00265       : r_(r),
00266         conv_(conv),
00267         format_(format)
00268     {}
00269 
00270     template<typename RE, typename TransitionConverter, typename Format>
00271     std::istream&
00272     operator>>(std::istream& in,
00273                regexp_loader_<RE, TransitionConverter, Format> l)
00274     {
00275       BENCH_TASK_SCOPED("regexp input");
00276       l.format_(in, l);
00277       return in;
00278     }
00279 
00280   } 
00281 
00282   template<typename RE, typename TransitionConverter, typename Format>
00283   tools::regexp_loader_<RE, TransitionConverter, Format>
00284   regexp_loader(RE& r,
00285                 const TransitionConverter& e,
00286                 const Format& f)
00287   {
00288     return tools::regexp_loader_<RE, TransitionConverter, Format>
00289       (r, e, f);
00290   }
00291 
00292 
00293 } 
00294 
00295 #endif // ! VCSN_TOOLS_IO_HXX