aboutsummaryrefslogtreecommitdiff
path: root/src/script/fst-class.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/fst-class.cc')
-rw-r--r--src/script/fst-class.cc141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/script/fst-class.cc b/src/script/fst-class.cc
new file mode 100644
index 0000000..a784b08
--- /dev/null
+++ b/src/script/fst-class.cc
@@ -0,0 +1,141 @@
+
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Copyright 2005-2010 Google, Inc.
+// Author: jpr@google.com (Jake Ratkiewicz)
+
+// 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 <fst/script/fst-class.h>
+#include <fst/script/register.h>
+#include <fst/fst-decl.h>
+#include <fst/union.h>
+#include <fst/reverse.h>
+#include <fst/equal.h>
+
+namespace fst {
+namespace script {
+
+//
+// REGISTRATION
+//
+
+REGISTER_FST_CLASSES(StdArc);
+REGISTER_FST_CLASSES(LogArc);
+REGISTER_FST_CLASSES(Log64Arc);
+
+//
+// FST CLASS METHODS
+//
+
+template<class FstT>
+FstT *ReadFst(istream &in, const string &fname) {
+ if (!in) {
+ LOG(ERROR) << "ReadFst: Can't open file: " << fname;
+ return 0;
+ }
+
+ FstHeader hdr;
+ if (!hdr.Read(in, fname)) {
+ return 0;
+ }
+
+ FstReadOptions read_options(fname, &hdr);
+
+ typename IORegistration<FstT>::Register *reg =
+ IORegistration<FstT>::Register::GetRegister();
+
+ const typename IORegistration<FstT>::Reader reader =
+ reg->GetReader(hdr.ArcType());
+
+ if (!reader) {
+ LOG(ERROR) << "ReadFst : unknown arc type \""
+ << hdr.ArcType() << "\" : " << read_options.source;
+ return 0;
+ }
+
+ return reader(in, read_options);
+}
+
+FstClass *FstClass::Read(const string &fname) {
+ if (!fname.empty()) {
+ ifstream in(fname.c_str(), ifstream::in | ifstream::binary);
+ return ReadFst<FstClass>(in, fname);
+ } else {
+ return ReadFst<FstClass>(std::cin, "standard input");
+ }
+}
+
+//
+// MUTABLE FST CLASS METHODS
+//
+
+MutableFstClass *MutableFstClass::Read(const string &fname, bool convert) {
+ if (convert == false) {
+ if (!fname.empty()) {
+ ifstream in(fname.c_str(), ifstream::in | ifstream::binary);
+ return ReadFst<MutableFstClass>(in, fname);
+ } else {
+ return ReadFst<MutableFstClass>(std::cin, "standard input");
+ }
+ } else { // Converts to VectorFstClass if not mutable.
+ FstClass *ifst = FstClass::Read(fname);
+ if (!ifst) return 0;
+ if (ifst->Properties(fst::kMutable, false)) {
+ return static_cast<MutableFstClass *>(ifst);
+ } else {
+ MutableFstClass *ofst = new VectorFstClass(*ifst);
+ delete ifst;
+ return ofst;
+ }
+ }
+}
+
+//
+// VECTOR FST CLASS METHODS
+//
+
+IORegistration<VectorFstClass>::Entry GetVFSTRegisterEntry(
+ const string &arc_type) {
+ IORegistration<VectorFstClass>::Register *reg =
+ IORegistration<VectorFstClass>::Register::GetRegister();
+ const IORegistration<VectorFstClass>::Entry &entry = reg->GetEntry(arc_type);
+
+ if (entry.converter == 0) {
+ LOG(ERROR) << "Unknown arc type " << arc_type;
+ return entry;
+ }
+
+ return entry;
+}
+
+VectorFstClass::VectorFstClass(const FstClass &other)
+ : MutableFstClass(GetVFSTRegisterEntry(other.ArcType()).converter(other)) {
+}
+
+VectorFstClass::VectorFstClass(const string &arc_type)
+ : MutableFstClass(GetVFSTRegisterEntry(arc_type).creator()) { }
+
+VectorFstClass *VectorFstClass::Read(const string &fname) {
+ if (!fname.empty()) {
+ ifstream in(fname.c_str(), ifstream::in | ifstream::binary);
+ return ReadFst<VectorFstClass>(in, fname);
+ } else {
+ return ReadFst<VectorFstClass>(std::cin, "standard input");
+ }
+}
+
+} // namespace script
+} // namespace fst