00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_TOOLS_IO_HXX
00018 # define VCSN_TOOLS_IO_HXX
00019 
00020 # include <vaucanson/tools/io.hh>
00021 # include <sstream>
00022 
00023 namespace vcsn
00024 {
00025 
00026   namespace tools
00027   {
00028 
00029     
00030 
00031 
00032 
00033     template<typename Auto, typename TransitionConverter, typename Format>
00034     Auto& automaton_saver_<Auto, TransitionConverter, Format>::automaton()
00035     {
00036       return a_;
00037     }
00038 
00039     template<typename Auto, typename TransitionConverter, typename Format>
00040     const Auto& automaton_saver_<Auto, TransitionConverter, Format>::
00041     automaton() const
00042     {
00043       return a_;
00044     }
00045 
00046     template<typename Auto, typename TransitionConverter, typename Format>
00047     automaton_saver_<Auto, TransitionConverter, Format>::
00048     automaton_saver_(const Auto& a,
00049                      const TransitionConverter& c,
00050                      const Format& f)
00051       : a_(a), conv_(c), format_(f)
00052     {}
00053 
00054     template<typename Auto, typename TransitionConverter, typename Format>
00055     std::ostream&
00056     operator<<(std::ostream& o,
00057                const automaton_saver_<Auto, TransitionConverter, Format>& s)
00058     {
00059       TIMER_SCOPED ("automaton output");
00060       s.format_(o, s, s.conv_);
00061       return o;
00062     }
00063 
00064     inline
00065     std::string string_out::check_empty_word(const std::string& str) const
00066     {
00067       if (str.empty())
00068         return std::string("1");
00069       return str;
00070     }
00071 
00072     template<typename S, typename T>
00073     std::string string_out::operator()(const AutomataBase<S>&, const T& t) const
00074     {
00075       std::ostringstream os;
00076       os << t;
00077       return os.str();
00078     }
00079 
00080     template<typename S, typename T>
00081     std::string string_out::operator()(const TransducerBase<S>&, const T& t) const
00082     {
00083       std::ostringstream os;
00084       os << t;
00085       return check_empty_word(os.str());
00086     }
00087 
00088   } 
00089 
00090   template<typename Auto, typename TransitionConverter, typename Format>
00091   tools::automaton_saver_<Auto, TransitionConverter, Format>
00092   automaton_saver(const Auto& a,
00093                   const TransitionConverter& e,
00094                   const Format& f)
00095   {
00096     return tools::automaton_saver_<Auto, TransitionConverter, Format>(a, e, f);
00097   }
00098 
00099   namespace tools
00100   {
00101 
00102     
00103 
00104 
00105 
00106 
00107     template<typename Auto, typename TransitionConverter, typename Format>
00108     Auto& automaton_loader_<Auto, TransitionConverter, Format>::automaton()
00109     {
00110       return a_;
00111     }
00112 
00113     template<typename Auto, typename TransitionConverter, typename Format>
00114     const Auto&
00115     automaton_loader_<Auto, TransitionConverter, Format>::automaton() const
00116     {
00117       return a_;
00118     }
00119 
00120     template<typename Auto, typename TransitionConverter, typename Format>
00121     automaton_loader_<Auto, TransitionConverter, Format>::
00122     automaton_loader_(Auto& a,
00123                       const TransitionConverter& conv,
00124                       const Format& format,
00125                       bool merge_states)
00126       : a_(a),
00127         conv_(conv),
00128         format_(format),
00129         scount_(0),
00130         smap_(),
00131         merge_states_(merge_states)
00132     {}
00133 
00134     template<typename Auto, typename TransitionConverter, typename Format>
00135     typename Auto::hstate_t
00136     automaton_loader_<Auto, TransitionConverter, Format>::
00137     add_state(unsigned s)
00138     {
00139       if (smap_.find(s) == smap_.end())
00140       {
00141         if (a_.has_state(s) && merge_states_)
00142           smap_[s] = hstate_t(s);
00143         else
00144           smap_[s] = a_.add_state();
00145       }
00146       return smap_[s];
00147     }
00148 
00149     template<typename Auto, typename TransitionConverter, typename Format>
00150     void automaton_loader_<Auto, TransitionConverter, Format>::
00151     set_initial(unsigned s, const std::string& lbl)
00152     {
00153       a_.set_initial(add_state(s), conv_(a_, lbl));
00154     }
00155 
00156     template<typename Auto, typename TransitionConverter, typename Format>
00157     void automaton_loader_<Auto, TransitionConverter, Format>::
00158     set_final(unsigned s, const std::string& lbl)
00159     {
00160       a_.set_final(add_state(s), conv_(a_, lbl));
00161     }
00162 
00163     template<typename Auto, typename TransitionConverter, typename Format>
00164     void automaton_loader_<Auto, TransitionConverter, Format>::
00165     add_spontaneous(unsigned from, unsigned to)
00166     {
00167       a_.add_spontaneous(add_state(from), add_state(to));
00168     }
00169 
00170     template<typename Auto, typename TransitionConverter, typename Format>
00171     void automaton_loader_<Auto, TransitionConverter, Format>::
00172     add_transition(unsigned from, unsigned to, const std::string& lbl)
00173     {
00174       a_.add_series_transition(add_state(from), add_state(to), conv_(a_, lbl));
00175     }
00176 
00177     template<typename Auto, typename TransitionConverter, typename Format>
00178     std::istream&
00179     operator>>(std::istream& in,
00180                automaton_loader_<Auto, TransitionConverter, Format> l)
00181     {
00182       TIMER_SCOPED ("automaton input");
00183       l.format_(in, l);
00184       return in;
00185     }
00186 
00187 
00188   } 
00189 
00190   template<typename Auto, typename TransitionConverter, typename Format>
00191   tools::automaton_loader_<Auto, TransitionConverter, Format>
00192   automaton_loader(Auto& a,
00193                    const TransitionConverter& e,
00194                    const Format& f,
00195                    bool merge_states)
00196   {
00197     return tools::automaton_loader_<Auto, TransitionConverter, Format>
00198       (a, e, f, merge_states);
00199   }
00200 
00201 } 
00202 
00203 
00204 #endif // ! VCSN_TOOLS_IO_HXX