Blame view

tools/openfst-1.6.7/src/script/fst-class.cc 3.62 KB
8dcb6dfcb   Yannick Estève   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  // See www.openfst.org for extensive documentation on this weighted
  // finite-state transducer library.
  //
  // These classes are only recommended for use in high-level scripting
  // applications. Most users should use the lower-level templated versions
  // corresponding to these classes.
  
  #include <istream>
  
  #include <fst/log.h>
  
  #include <fst/equal.h>
  #include <fst/fst-decl.h>
  #include <fst/reverse.h>
  #include <fst/union.h>
  #include <fst/script/fst-class.h>
  #include <fst/script/register.h>
  
  namespace fst {
  namespace script {
  
  // Registration.
  
  REGISTER_FST_CLASSES(StdArc);
  REGISTER_FST_CLASSES(LogArc);
  REGISTER_FST_CLASSES(Log64Arc);
  
  // FstClass methods.
  
  namespace {
  
  template <class F>
  F *ReadFst(std::istream &istrm, const string &fname) {
    if (!istrm) {
      LOG(ERROR) << "ReadFst: Can't open file: " << fname;
      return nullptr;
    }
    FstHeader hdr;
    if (!hdr.Read(istrm, fname)) return nullptr;
    const FstReadOptions read_options(fname, &hdr);
    const auto &arc_type = hdr.ArcType();
    static const auto *io_register = IORegistration<F>::Register::GetRegister();
    const auto reader = io_register->GetReader(arc_type);
    if (!reader) {
      LOG(ERROR) << "ReadFst: Unknown arc type: " << arc_type;
      return nullptr;
    }
    return reader(istrm, read_options);
  }
  
  }  // namespace
  
  FstClass *FstClass::Read(const string &fname) {
    if (!fname.empty()) {
      std::ifstream istrm(fname, std::ios_base::in | std::ios_base::binary);
      return ReadFst<FstClass>(istrm, fname);
    } else {
      return ReadFst<FstClass>(std::cin, "standard input");
    }
  }
  
  FstClass *FstClass::Read(std::istream &istrm, const string &source) {
    return ReadFst<FstClass>(istrm, source);
  }
  
  bool FstClass::WeightTypesMatch(const WeightClass &weight,
                                  const string &op_name) const {
    if (WeightType() != weight.Type()) {
      FSTERROR() << "FST and weight with non-matching weight types passed to "
                 << op_name << ": " << WeightType() << " and " << weight.Type();
      return false;
    }
    return true;
  }
  
  // MutableFstClass methods.
  
  MutableFstClass *MutableFstClass::Read(const string &fname, bool convert) {
    if (convert == false) {
      if (!fname.empty()) {
        std::ifstream in(fname, std::ios_base::in | std::ios_base::binary);
        return ReadFst<MutableFstClass>(in, fname);
      } else {
        return ReadFst<MutableFstClass>(std::cin, "standard input");
      }
    } else {  // Converts to VectorFstClass if not mutable.
      std::unique_ptr<FstClass> ifst(FstClass::Read(fname));
      if (!ifst) return nullptr;
      if (ifst->Properties(kMutable, false) == kMutable) {
        return static_cast<MutableFstClass *>(ifst.release());
      } else {
        return new VectorFstClass(*ifst.release());
      }
    }
  }
  
  // VectorFstClass methods.
  
  VectorFstClass *VectorFstClass::Read(const string &fname) {
    if (!fname.empty()) {
      std::ifstream in(fname, std::ios_base::in | std::ios_base::binary);
      return ReadFst<VectorFstClass>(in, fname);
    } else {
      return ReadFst<VectorFstClass>(std::cin, "standard input");
    }
  }
  
  IORegistration<VectorFstClass>::Entry GetVFSTRegisterEntry(
      const string &arc_type) {
    static const auto *io_register =
        IORegistration<VectorFstClass>::Register::GetRegister();
    return io_register->GetEntry(arc_type);
  }
  
  VectorFstClass::VectorFstClass(const string &arc_type)
      : MutableFstClass(GetVFSTRegisterEntry(arc_type).creator()) {
    if (Properties(kError, true) == kError) {
      FSTERROR() << "VectorFstClass: Unknown arc type: " << arc_type;
    }
  }
  
  VectorFstClass::VectorFstClass(const FstClass &other)
      : MutableFstClass(GetVFSTRegisterEntry(other.ArcType()).converter(other)) {}
  
  }  // namespace script
  }  // namespace fst