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 TIMER_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 TIMER_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 TIMER_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 TIMER_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