Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef FST_LIB_MUTABLE_FST_H__
00024 #define FST_LIB_MUTABLE_FST_H__
00025
00026 #include <string>
00027 #include <vector>
00028 using std::vector;
00029 #include <fst/expanded-fst.h>
00030
00031 namespace fst {
00032
00033 template <class A> class MutableArcIteratorData;
00034
00035
00036 template <class A>
00037 class MutableFst : public ExpandedFst<A> {
00038 public:
00039 typedef A Arc;
00040 typedef typename A::Weight Weight;
00041 typedef typename A::StateId StateId;
00042
00043 virtual MutableFst<A> &operator=(const Fst<A> &fst) = 0;
00044
00045 MutableFst<A> &operator=(const MutableFst<A> &fst) {
00046 return operator=(static_cast<const Fst<A> &>(fst));
00047 }
00048
00049 virtual void SetStart(StateId) = 0;
00050 virtual void SetFinal(StateId, Weight) = 0;
00051 virtual void SetProperties(uint64 props,
00052 uint64 mask) = 0;
00053 virtual StateId AddState() = 0;
00054 virtual void AddArc(StateId, const A &arc) = 0;
00055
00056 virtual void DeleteStates(const vector<StateId>&) = 0;
00057 virtual void DeleteStates() = 0;
00058 virtual void DeleteArcs(StateId, size_t n) = 0;
00059 virtual void DeleteArcs(StateId) = 0;
00060
00061
00062 virtual const SymbolTable* InputSymbols() const = 0;
00063
00064 virtual const SymbolTable* OutputSymbols() const = 0;
00065
00066
00067 virtual SymbolTable* MutableInputSymbols() = 0;
00068
00069 virtual SymbolTable* MutableOutputSymbols() = 0;
00070
00071
00072 virtual void SetInputSymbols(const SymbolTable* isyms) = 0;
00073
00074 virtual void SetOutputSymbols(const SymbolTable* osyms) = 0;
00075
00076
00077 virtual MutableFst<A> *Copy(bool safe = false) const = 0;
00078
00079
00080 static MutableFst<A> *Read(istream &strm, const FstReadOptions &opts) {
00081 FstReadOptions ropts(opts);
00082 FstHeader hdr;
00083 if (ropts.header)
00084 hdr = *opts.header;
00085 else {
00086 if (!hdr.Read(strm, opts.source))
00087 return 0;
00088 ropts.header = &hdr;
00089 }
00090 if (!(hdr.Properties() & kMutable)) {
00091 LOG(ERROR) << "MutableFst::Read: Not an MutableFst: " << ropts.source;
00092 return 0;
00093 }
00094 FstRegister<A> *registr = FstRegister<A>::GetRegister();
00095 const typename FstRegister<A>::Reader reader =
00096 registr->GetReader(hdr.FstType());
00097 if (!reader) {
00098 LOG(ERROR) << "MutableFst::Read: Unknown FST type \"" << hdr.FstType()
00099 << "\" (arc type = \"" << A::Type()
00100 << "\"): " << ropts.source;
00101 return 0;
00102 }
00103 Fst<A> *fst = reader(strm, ropts);
00104 if (!fst) return 0;
00105 return static_cast<MutableFst<A> *>(fst);
00106 }
00107
00108
00109
00110 static MutableFst<A> *Read(const string &filename) {
00111 if (!filename.empty()) {
00112 ifstream strm(filename.c_str(), ifstream::in | ifstream::binary);
00113 if (!strm) {
00114 LOG(ERROR) << "MutableFst::Read: Can't open file: " << filename;
00115 return 0;
00116 }
00117 return Read(strm, FstReadOptions(filename));
00118 } else {
00119 return Read(std::cin, FstReadOptions("standard input"));
00120 }
00121 }
00122
00123
00124
00125 virtual void InitMutableArcIterator(StateId s,
00126 MutableArcIteratorData<A> *) = 0;
00127 };
00128
00129
00130
00131
00132 template <class A>
00133 class MutableArcIteratorBase : public ArcIteratorBase<A> {
00134 public:
00135 typedef A Arc;
00136
00137 void SetValue(const A &arc) { SetValue_(arc); }
00138
00139 private:
00140 virtual void SetValue_(const A &arc) = 0;
00141 };
00142
00143 template <class A>
00144 struct MutableArcIteratorData {
00145 MutableArcIteratorBase<A> *base;
00146 };
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 template <class F>
00161 class MutableArcIterator {
00162 public:
00163 typedef F FST;
00164 typedef typename F::Arc Arc;
00165 typedef typename Arc::StateId StateId;
00166
00167 MutableArcIterator(F *fst, StateId s) {
00168 fst->InitMutableArcIterator(s, &data_);
00169 }
00170 ~MutableArcIterator() { delete data_.base; }
00171
00172 bool Done() const { return data_.base->Done(); }
00173 const Arc& Value() const { return data_.base->Value(); }
00174 void Next() { data_.base->Next(); }
00175 size_t Position() const { return data_.base->Position(); }
00176 void Reset() { data_.base->Reset(); }
00177 void Seek(size_t a) { data_.base->Seek(a); }
00178 void SetValue(const Arc &a) { data_.base->SetValue(a); }
00179 uint32 Flags() const { return data_.base->Flags(); }
00180 void SetFlags(uint32 f, uint32 m) {
00181 return data_.base->SetFlags(f, m);
00182 }
00183
00184 private:
00185 MutableArcIteratorData<Arc> data_;
00186 DISALLOW_COPY_AND_ASSIGN(MutableArcIterator);
00187 };
00188
00189
00190
00191 template <class A> inline
00192 typename A::Weight Final(const MutableFst<A> &fst, typename A::StateId s) {
00193 return fst.Final(s);
00194 }
00195
00196 template <class A> inline
00197 ssize_t NumArcs(const MutableFst<A> &fst, typename A::StateId s) {
00198 return fst.NumArcs(s);
00199 }
00200
00201 template <class A> inline
00202 ssize_t NumInputEpsilons(const MutableFst<A> &fst, typename A::StateId s) {
00203 return fst.NumInputEpsilons(s);
00204 }
00205
00206 template <class A> inline
00207 ssize_t NumOutputEpsilons(const MutableFst<A> &fst, typename A::StateId s) {
00208 return fst.NumOutputEpsilons(s);
00209 }
00210
00211
00212
00213 typedef MutableFst<StdArc> StdMutableFst;
00214
00215
00216
00217
00218
00219 template <class I, class F = MutableFst<typename I::Arc> >
00220 class ImplToMutableFst : public ImplToExpandedFst<I, F> {
00221 public:
00222 typedef typename I::Arc Arc;
00223 typedef typename Arc::Weight Weight;
00224 typedef typename Arc::StateId StateId;
00225
00226 using ImplToFst<I, F>::GetImpl;
00227 using ImplToFst<I, F>::SetImpl;
00228
00229 virtual void SetStart(StateId s) {
00230 MutateCheck();
00231 GetImpl()->SetStart(s);
00232 }
00233
00234 virtual void SetFinal(StateId s, Weight w) {
00235 MutateCheck();
00236 GetImpl()->SetFinal(s, w);
00237 }
00238
00239 virtual void SetProperties(uint64 props, uint64 mask) {
00240 GetImpl()->SetProperties(props, mask);
00241 }
00242
00243 virtual StateId AddState() {
00244 MutateCheck();
00245 return GetImpl()->AddState();
00246 }
00247
00248 virtual void AddArc(StateId s, const Arc &arc) {
00249 MutateCheck();
00250 GetImpl()->AddArc(s, arc);
00251 }
00252
00253 virtual void DeleteStates(const vector<StateId> &dstates) {
00254 MutateCheck();
00255 GetImpl()->DeleteStates(dstates);
00256 }
00257
00258 virtual void DeleteStates() {
00259 MutateCheck();
00260 GetImpl()->DeleteStates();
00261 }
00262
00263 virtual void DeleteArcs(StateId s, size_t n) {
00264 MutateCheck();
00265 GetImpl()->DeleteArcs(s, n);
00266 }
00267
00268 virtual void DeleteArcs(StateId s) {
00269 MutateCheck();
00270 GetImpl()->DeleteArcs(s);
00271 }
00272
00273 virtual const SymbolTable* InputSymbols() const {
00274 return GetImpl()->InputSymbols();
00275 }
00276
00277 virtual const SymbolTable* OutputSymbols() const {
00278 return GetImpl()->OutputSymbols();
00279 }
00280
00281 virtual SymbolTable* MutableInputSymbols() {
00282 MutateCheck();
00283 return GetImpl()->InputSymbols();
00284 }
00285
00286 virtual SymbolTable* MutableOutputSymbols() {
00287 MutateCheck();
00288 return GetImpl()->OutputSymbols();
00289 }
00290
00291 virtual void SetInputSymbols(const SymbolTable* isyms) {
00292 MutateCheck();
00293 GetImpl()->SetInputSymbols(isyms);
00294 }
00295
00296 virtual void SetOutputSymbols(const SymbolTable* osyms) {
00297 MutateCheck();
00298 GetImpl()->SetOutputSymbols(osyms);
00299 }
00300
00301 protected:
00302 ImplToMutableFst() : ImplToExpandedFst<I, F>() {}
00303
00304 ImplToMutableFst(I *impl) : ImplToExpandedFst<I, F>(impl) {}
00305
00306
00307 ImplToMutableFst(const ImplToMutableFst<I, F> &fst)
00308 : ImplToExpandedFst<I, F>(fst) {}
00309
00310 ImplToMutableFst(const ImplToMutableFst<I, F> &fst, bool safe)
00311 : ImplToExpandedFst<I, F>(fst, safe) {}
00312
00313 void MutateCheck() {
00314
00315 if (GetImpl()->RefCount() > 1)
00316 SetImpl(new I(*this));
00317 }
00318
00319 private:
00320
00321 ImplToMutableFst<I, F> &operator=(const ImplToMutableFst<I, F> &fst);
00322
00323 ImplToMutableFst<I, F> &operator=(const Fst<Arc> &fst) {
00324 LOG(FATAL) << "ImplToMutableFst: Assignment operator disallowed";
00325 return *this;
00326 }
00327 };
00328
00329
00330 }
00331
00332 #endif /// FST_LIB_MUTABLE_FST_H__
00333