summaryrefslogtreecommitdiff
path: root/kaldi_io/src/tools/openfst/include/fst/extensions/far
diff options
context:
space:
mode:
Diffstat (limited to 'kaldi_io/src/tools/openfst/include/fst/extensions/far')
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/compile-strings.h304
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/create.h87
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/equal.h99
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/extract.h140
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/far.h532
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/farlib.h31
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/farscript.h273
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/info.h128
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/main.h43
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/print-strings.h138
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/stlist.h305
-rw-r--r--kaldi_io/src/tools/openfst/include/fst/extensions/far/sttable.h371
12 files changed, 0 insertions, 2451 deletions
diff --git a/kaldi_io/src/tools/openfst/include/fst/extensions/far/compile-strings.h b/kaldi_io/src/tools/openfst/include/fst/extensions/far/compile-strings.h
deleted file mode 100644
index ca247db..0000000
--- a/kaldi_io/src/tools/openfst/include/fst/extensions/far/compile-strings.h
+++ /dev/null
@@ -1,304 +0,0 @@
-
-// 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.
-// Authors: allauzen@google.com (Cyril Allauzen)
-// ttai@google.com (Terry Tai)
-// jpr@google.com (Jake Ratkiewicz)
-
-
-#ifndef FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_
-#define FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_
-
-#include <libgen.h>
-#include <string>
-#include <vector>
-using std::vector;
-
-#include <fst/extensions/far/far.h>
-#include <fst/string.h>
-
-namespace fst {
-
-// Construct a reader that provides FSTs from a file (stream) either on a
-// line-by-line basis or on a per-stream basis. Note that the freshly
-// constructed reader is already set to the first input.
-//
-// Sample Usage:
-// for (StringReader<Arc> reader(...); !reader.Done(); reader.Next()) {
-// Fst *fst = reader.GetVectorFst();
-// }
-template <class A>
-class StringReader {
- public:
- typedef A Arc;
- typedef typename A::Label Label;
- typedef typename A::Weight Weight;
- typedef typename StringCompiler<A>::TokenType TokenType;
-
- enum EntryType { LINE = 1, FILE = 2 };
-
- StringReader(istream &istrm,
- const string &source,
- EntryType entry_type,
- TokenType token_type,
- bool allow_negative_labels,
- const SymbolTable *syms = 0,
- Label unknown_label = kNoStateId)
- : nline_(0), strm_(istrm), source_(source), entry_type_(entry_type),
- token_type_(token_type), symbols_(syms), done_(false),
- compiler_(token_type, syms, unknown_label, allow_negative_labels) {
- Next(); // Initialize the reader to the first input.
- }
-
- bool Done() {
- return done_;
- }
-
- void Next() {
- VLOG(1) << "Processing source " << source_ << " at line " << nline_;
- if (!strm_) { // We're done if we have no more input.
- done_ = true;
- return;
- }
- if (entry_type_ == LINE) {
- getline(strm_, content_);
- ++nline_;
- } else {
- content_.clear();
- string line;
- while (getline(strm_, line)) {
- ++nline_;
- content_.append(line);
- content_.append("\n");
- }
- }
- if (!strm_ && content_.empty()) // We're also done if we read off all the
- done_ = true; // whitespace at the end of a file.
- }
-
- VectorFst<A> *GetVectorFst(bool keep_symbols = false) {
- VectorFst<A> *fst = new VectorFst<A>;
- if (keep_symbols) {
- fst->SetInputSymbols(symbols_);
- fst->SetOutputSymbols(symbols_);
- }
- if (compiler_(content_, fst)) {
- return fst;
- } else {
- delete fst;
- return NULL;
- }
- }
-
- CompactFst<A, StringCompactor<A> > *GetCompactFst(bool keep_symbols = false) {
- CompactFst<A, StringCompactor<A> > *fst;
- if (keep_symbols) {
- VectorFst<A> tmp;
- tmp.SetInputSymbols(symbols_);
- tmp.SetOutputSymbols(symbols_);
- fst = new CompactFst<A, StringCompactor<A> >(tmp);
- } else {
- fst = new CompactFst<A, StringCompactor<A> >;
- }
- if (compiler_(content_, fst)) {
- return fst;
- } else {
- delete fst;
- return NULL;
- }
- }
-
- private:
- size_t nline_;
- istream &strm_;
- string source_;
- EntryType entry_type_;
- TokenType token_type_;
- const SymbolTable *symbols_;
- bool done_;
- StringCompiler<A> compiler_;
- string content_; // The actual content of the input stream's next FST.
-
- DISALLOW_COPY_AND_ASSIGN(StringReader);
-};
-
-// Compute the minimal length required to encode each line number as a decimal
-// number.
-int KeySize(const char *filename);
-
-template <class Arc>
-void FarCompileStrings(const vector<string> &in_fnames,
- const string &out_fname,
- const string &fst_type,
- const FarType &far_type,
- int32 generate_keys,
- FarEntryType fet,
- FarTokenType tt,
- const string &symbols_fname,
- const string &unknown_symbol,
- bool keep_symbols,
- bool initial_symbols,
- bool allow_negative_labels,
- bool file_list_input,
- const string &key_prefix,
- const string &key_suffix) {
- typename StringReader<Arc>::EntryType entry_type;
- if (fet == FET_LINE) {
- entry_type = StringReader<Arc>::LINE;
- } else if (fet == FET_FILE) {
- entry_type = StringReader<Arc>::FILE;
- } else {
- FSTERROR() << "FarCompileStrings: unknown entry type";
- return;
- }
-
- typename StringCompiler<Arc>::TokenType token_type;
- if (tt == FTT_SYMBOL) {
- token_type = StringCompiler<Arc>::SYMBOL;
- } else if (tt == FTT_BYTE) {
- token_type = StringCompiler<Arc>::BYTE;
- } else if (tt == FTT_UTF8) {
- token_type = StringCompiler<Arc>::UTF8;
- } else {
- FSTERROR() << "FarCompileStrings: unknown token type";
- return;
- }
-
- bool compact;
- if (fst_type.empty() || (fst_type == "vector")) {
- compact = false;
- } else if (fst_type == "compact") {
- compact = true;
- } else {
- FSTERROR() << "FarCompileStrings: unknown fst type: "
- << fst_type;
- return;
- }
-
- const SymbolTable *syms = 0;
- typename Arc::Label unknown_label = kNoLabel;
- if (!symbols_fname.empty()) {
- SymbolTableTextOptions opts;
- opts.allow_negative = allow_negative_labels;
- syms = SymbolTable::ReadText(symbols_fname, opts);
- if (!syms) {
- FSTERROR() << "FarCompileStrings: error reading symbol table: "
- << symbols_fname;
- return;
- }
- if (!unknown_symbol.empty()) {
- unknown_label = syms->Find(unknown_symbol);
- if (unknown_label == kNoLabel) {
- FSTERROR() << "FarCompileStrings: unknown label \"" << unknown_label
- << "\" missing from symbol table: " << symbols_fname;
- return;
- }
- }
- }
-
- FarWriter<Arc> *far_writer =
- FarWriter<Arc>::Create(out_fname, far_type);
- if (!far_writer) return;
-
- vector<string> inputs;
- if (file_list_input) {
- for (int i = 1; i < in_fnames.size(); ++i) {
- istream *istrm = in_fnames.empty() ? &cin :
- new ifstream(in_fnames[i].c_str());
- string str;
- while (getline(*istrm, str))
- inputs.push_back(str);
- if (!in_fnames.empty())
- delete istrm;
- }
- } else {
- inputs = in_fnames;
- }
-
- for (int i = 0, n = 0; i < inputs.size(); ++i) {
- if (generate_keys == 0 && inputs[i].empty()) {
- FSTERROR() << "FarCompileStrings: read from a file instead of stdin or"
- << " set the --generate_keys flags.";
- delete far_writer;
- delete syms;
- return;
- }
- int key_size = generate_keys ? generate_keys :
- (entry_type == StringReader<Arc>::FILE ? 1 :
- KeySize(inputs[i].c_str()));
- istream *istrm = inputs[i].empty() ? &cin :
- new ifstream(inputs[i].c_str());
-
- bool keep_syms = keep_symbols;
- for (StringReader<Arc> reader(
- *istrm, inputs[i].empty() ? "stdin" : inputs[i],
- entry_type, token_type, allow_negative_labels,
- syms, unknown_label);
- !reader.Done();
- reader.Next()) {
- ++n;
- const Fst<Arc> *fst;
- if (compact)
- fst = reader.GetCompactFst(keep_syms);
- else
- fst = reader.GetVectorFst(keep_syms);
- if (initial_symbols)
- keep_syms = false;
- if (!fst) {
- FSTERROR() << "FarCompileStrings: compiling string number " << n
- << " in file " << inputs[i] << " failed with token_type = "
- << (tt == FTT_BYTE ? "byte" :
- (tt == FTT_UTF8 ? "utf8" :
- (tt == FTT_SYMBOL ? "symbol" : "unknown")))
- << " and entry_type = "
- << (fet == FET_LINE ? "line" :
- (fet == FET_FILE ? "file" : "unknown"));
- delete far_writer;
- delete syms;
- if (!inputs[i].empty()) delete istrm;
- return;
- }
- ostringstream keybuf;
- keybuf.width(key_size);
- keybuf.fill('0');
- keybuf << n;
- string key;
- if (generate_keys > 0) {
- key = keybuf.str();
- } else {
- char* filename = new char[inputs[i].size() + 1];
- strcpy(filename, inputs[i].c_str());
- key = basename(filename);
- if (entry_type != StringReader<Arc>::FILE) {
- key += "-";
- key += keybuf.str();
- }
- delete[] filename;
- }
- far_writer->Add(key_prefix + key + key_suffix, *fst);
- delete fst;
- }
- if (generate_keys == 0)
- n = 0;
- if (!inputs[i].empty())
- delete istrm;
- }
-
- delete far_writer;
-}
-
-} // namespace fst
-
-
-#endif // FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_
diff --git a/kaldi_io/src/tools/openfst/include/fst/extensions/far/create.h b/kaldi_io/src/tools/openfst/include/fst/extensions/far/create.h
deleted file mode 100644
index edb31e7..0000000
--- a/kaldi_io/src/tools/openfst/include/fst/extensions/far/create.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// create-main.h
-
-// 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: riley@google.com (Michael Riley)
-// Modified: jpr@google.com (Jake Ratkiewicz) to use new dispatch
-//
-// \file
-// Creates a finite-state archive from component FSTs. Includes
-// helper function for farcreate.cc that templates the main on the arc
-// type to support multiple and extensible arc types.
-//
-
-#ifndef FST_EXTENSIONS_FAR_CREATE_H__
-#define FST_EXTENSIONS_FAR_CREATE_H__
-
-#include <libgen.h>
-#include <string>
-#include <vector>
-using std::vector;
-
-#include <fst/extensions/far/far.h>
-
-namespace fst {
-
-template <class Arc>
-void FarCreate(const vector<string> &in_fnames,
- const string &out_fname,
- const int32 generate_keys,
- const bool file_list_input,
- const FarType &far_type,
- const string &key_prefix,
- const string &key_suffix) {
- FarWriter<Arc> *far_writer =
- FarWriter<Arc>::Create(out_fname, far_type);
- if (!far_writer) return;
-
- vector<string> inputs;
- if (file_list_input) {
- for (int i = 1; i < in_fnames.size(); ++i) {
- ifstream istrm(in_fnames[i].c_str());
- string str;
- while (getline(istrm, str))
- inputs.push_back(str);
- }
- } else {
- inputs = in_fnames;
- }
-
- for (int i = 0; i < inputs.size(); ++i) {
- Fst<Arc> *ifst = Fst<Arc>::Read(inputs[i]);
- if (!ifst) return;
- string key;
- if (generate_keys > 0) {
- ostringstream keybuf;
- keybuf.width(generate_keys);
- keybuf.fill('0');
- keybuf << i + 1;
- key = keybuf.str();
- } else {
- char* filename = new char[inputs[i].size() + 1];
- strcpy(filename, inputs[i].c_str());
- key = basename(filename);
- delete[] filename;
- }
-
- far_writer->Add(key_prefix + key + key_suffix, *ifst);
- delete ifst;
- }
-
- delete far_writer;
-}
-
-} // namespace fst
-
-#endif // FST_EXTENSIONS_FAR_CREATE_H__
diff --git a/kaldi_io/src/tools/openfst/include/fst/extensions/far/equal.h b/kaldi_io/src/tools/openfst/include/fst/extensions/far/equal.h
deleted file mode 100644
index be82e2d..0000000
--- a/kaldi_io/src/tools/openfst/include/fst/extensions/far/equal.h
+++ /dev/null
@@ -1,99 +0,0 @@
-
-// 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: allauzen@google.com (Cyril Allauzen)
-
-#ifndef FST_EXTENSIONS_FAR_EQUAL_H_
-#define FST_EXTENSIONS_FAR_EQUAL_H_
-
-#include <string>
-
-#include <fst/extensions/far/far.h>
-#include <fst/equal.h>
-
-namespace fst {
-
-template <class Arc>
-bool FarEqual(const string &filename1,
- const string &filename2,
- float delta = kDelta,
- const string &begin_key = string(),
- const string &end_key = string()) {
-
- FarReader<Arc> *reader1 = FarReader<Arc>::Open(filename1);
- FarReader<Arc> *reader2 = FarReader<Arc>::Open(filename2);
- if (!reader1 || !reader2) {
- delete reader1;
- delete reader2;
- VLOG(1) << "FarEqual: cannot open input Far file(s)";
- return false;
- }
-
- if (!begin_key.empty()) {
- bool find_begin1 = reader1->Find(begin_key);
- bool find_begin2 = reader2->Find(begin_key);
- if (!find_begin1 || !find_begin2) {
- bool ret = !find_begin1 && !find_begin2;
- if (!ret) {
- VLOG(1) << "FarEqual: key \"" << begin_key << "\" missing from "
- << (find_begin1 ? "second" : "first") << " archive.";
- }
- delete reader1;
- delete reader2;
- return ret;
- }
- }
-
- for(; !reader1->Done() && !reader2->Done();
- reader1->Next(), reader2->Next()) {
- const string key1 = reader1->GetKey();
- const string key2 = reader2->GetKey();
- if (!end_key.empty() && end_key < key1 && end_key < key2) {
- delete reader1;
- delete reader2;
- return true;
- }
- if (key1 != key2) {
- VLOG(1) << "FarEqual: mismatched keys \""
- << key1 << "\" <> \"" << key2 << "\".";
- delete reader1;
- delete reader2;
- return false;
- }
- if (!Equal(reader1->GetFst(), reader2->GetFst(), delta)) {
- VLOG(1) << "FarEqual: Fsts for key \"" << key1 << "\" are not equal.";
- delete reader1;
- delete reader2;
- return false;
- }
- }
-
- if (!reader1->Done() || !reader2->Done()) {
- VLOG(1) << "FarEqual: key \""
- << (reader1->Done() ? reader2->GetKey() : reader1->GetKey())
- << "\" missing form " << (reader2->Done() ? "first" : "second")
- << " archive.";
- delete reader1;
- delete reader2;
- return false;
- }
-
- delete reader1;
- delete reader2;
- return true;
-}
-
-} // namespace fst
-
-#endif // FST_EXTENSIONS_FAR_EQUAL_H_
diff --git a/kaldi_io/src/tools/openfst/include/fst/extensions/far/extract.h b/kaldi_io/src/tools/openfst/include/fst/extensions/far/extract.h
deleted file mode 100644
index 95866de..0000000
--- a/kaldi_io/src/tools/openfst/include/fst/extensions/far/extract.h
+++ /dev/null
@@ -1,140 +0,0 @@
-// extract-main.h
-
-// 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: riley@google.com (Michael Riley)
-// Modified: jpr@google.com (Jake Ratkiewicz) to use the new arc-dispatch
-
-// \file
-// Extracts component FSTs from an finite-state archive.
-//
-
-#ifndef FST_EXTENSIONS_FAR_EXTRACT_H__
-#define FST_EXTENSIONS_FAR_EXTRACT_H__
-
-#include <string>
-#include <vector>
-using std::vector;
-
-#include <fst/extensions/far/far.h>
-
-namespace fst {
-
-template<class Arc>
-inline void FarWriteFst(const Fst<Arc>* fst, string key,
- string* okey, int* nrep,
- const int32 &generate_filenames, int i,
- const string &filename_prefix,
- const string &filename_suffix) {
- if (key == *okey)
- ++*nrep;
- else
- *nrep = 0;
-
- *okey = key;
-
- string ofilename;
- if (generate_filenames) {
- ostringstream tmp;
- tmp.width(generate_filenames);
- tmp.fill('0');
- tmp << i;
- ofilename = tmp.str();
- } else {
- if (*nrep > 0) {
- ostringstream tmp;
- tmp << '.' << nrep;
- key.append(tmp.str().data(), tmp.str().size());
- }
- ofilename = key;
- }
- fst->Write(filename_prefix + ofilename + filename_suffix);
-}
-
-template<class Arc>
-void FarExtract(const vector<string> &ifilenames,
- const int32 &generate_filenames,
- const string &keys,
- const string &key_separator,
- const string &range_delimiter,
- const string &filename_prefix,
- const string &filename_suffix) {
- FarReader<Arc> *far_reader = FarReader<Arc>::Open(ifilenames);
- if (!far_reader) return;
-
- string okey;
- int nrep = 0;
-
- vector<char *> key_vector;
- // User has specified a set of fsts to extract, where some of the "fsts" could
- // be ranges.
- if (!keys.empty()) {
- char *keys_cstr = new char[keys.size()+1];
- strcpy(keys_cstr, keys.c_str());
- SplitToVector(keys_cstr, key_separator.c_str(), &key_vector, true);
- int i = 0;
- for (int k = 0; k < key_vector.size(); ++k, ++i) {
- string key = string(key_vector[k]);
- char *key_cstr = new char[key.size()+1];
- strcpy(key_cstr, key.c_str());
- vector<char *> range_vector;
- SplitToVector(key_cstr, range_delimiter.c_str(), &range_vector, false);
- if (range_vector.size() == 1) { // Not a range
- if (!far_reader->Find(key)) {
- LOG(ERROR) << "FarExtract: Cannot find key: " << key;
- return;
- }
- const Fst<Arc> &fst = far_reader->GetFst();
- FarWriteFst(&fst, key, &okey, &nrep, generate_filenames, i,
- filename_prefix, filename_suffix);
- } else if (range_vector.size() == 2) { // A legal range
- string begin_key = string(range_vector[0]);
- string end_key = string(range_vector[1]);
- if (begin_key.empty() || end_key.empty()) {
- LOG(ERROR) << "FarExtract: Illegal range specification: " << key;
- return;
- }
- if (!far_reader->Find(begin_key)) {
- LOG(ERROR) << "FarExtract: Cannot find key: " << begin_key;
- return;
- }
- for ( ; !far_reader->Done(); far_reader->Next(), ++i) {
- string ikey = far_reader->GetKey();
- if (end_key < ikey) break;
- const Fst<Arc> &fst = far_reader->GetFst();
- FarWriteFst(&fst, ikey, &okey, &nrep, generate_filenames, i,
- filename_prefix, filename_suffix);
- }
- } else {
- LOG(ERROR) << "FarExtract: Illegal range specification: " << key;
- return;
- }
- delete key_cstr;
- }
- delete keys_cstr;
- return;
- }
- // Nothing specified: extract everything.
- for (int i = 1; !far_reader->Done(); far_reader->Next(), ++i) {
- string key = far_reader->GetKey();
- const Fst<Arc> &fst = far_reader->GetFst();
- FarWriteFst(&fst, key, &okey, &nrep, generate_filenames, i,
- filename_prefix, filename_suffix);
- }
- return;
-}
-
-} // namespace fst
-
-#endif // FST_EXTENSIONS_FAR_EXTRACT_H__
diff --git a/kaldi_io/src/tools/openfst/include/fst/extensions/far/far.h b/kaldi_io/src/tools/openfst/include/fst/extensions/far/far.h
deleted file mode 100644
index acce76e..0000000
--- a/kaldi_io/src/tools/openfst/include/fst/extensions/far/far.h
+++ /dev/null
@@ -1,532 +0,0 @@
-// far.h
-
-// 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: riley@google.com (Michael Riley)
-//
-// \file
-// Finite-State Transducer (FST) archive classes.
-//
-
-#ifndef FST_EXTENSIONS_FAR_FAR_H__
-#define FST_EXTENSIONS_FAR_FAR_H__
-
-#include <fst/extensions/far/stlist.h>
-#include <fst/extensions/far/sttable.h>
-#include <fst/fst.h>
-#include <fst/vector-fst.h>
-
-namespace fst {
-
-enum FarEntryType { FET_LINE, FET_FILE };
-enum FarTokenType { FTT_SYMBOL, FTT_BYTE, FTT_UTF8 };
-
-inline bool IsFst(const string &filename) {
- ifstream strm(filename.c_str());
- if (!strm)
- return false;
- return IsFstHeader(strm, filename);
-}
-
-// FST archive header class
-class FarHeader {
- public:
- const string &FarType() const { return fartype_; }
- const string &ArcType() const { return arctype_; }
-
- bool Read(const string &filename) {
- FstHeader fsthdr;
- if (filename.empty()) {
- // Header reading unsupported on stdin. Assumes STList and StdArc.
- fartype_ = "stlist";
- arctype_ = "standard";
- return true;
- } else if (IsSTTable(filename)) { // Check if STTable
- ReadSTTableHeader(filename, &fsthdr);
- fartype_ = "sttable";
- arctype_ = fsthdr.ArcType().empty() ? "unknown" : fsthdr.ArcType();
- return true;
- } else if (IsSTList(filename)) { // Check if STList
- ReadSTListHeader(filename, &fsthdr);
- fartype_ = "sttable";
- arctype_ = fsthdr.ArcType().empty() ? "unknown" : fsthdr.ArcType();
- return true;
- } else if (IsFst(filename)) { // Check if Fst
- ifstream istrm(filename.c_str());
- fsthdr.Read(istrm, filename);
- fartype_ = "fst";
- arctype_ = fsthdr.ArcType().empty() ? "unknown" : fsthdr.ArcType();
- return true;
- }
- return false;
- }
-
- private:
- string fartype_;
- string arctype_;
-};
-
-enum FarType {
- FAR_DEFAULT = 0,
- FAR_STTABLE = 1,
- FAR_STLIST = 2,
- FAR_FST = 3,
-};
-
-// This class creates an archive of FSTs.
-template <class A>
-class FarWriter {
- public:
- typedef A Arc;
-
- // Creates a new (empty) FST archive; returns NULL on error.
- static FarWriter *Create(const string &filename, FarType type = FAR_DEFAULT);
-
- // Adds an FST to the end of an archive. Keys must be non-empty and
- // in lexicographic order. FSTs must have a suitable write method.
- virtual void Add(const string &key, const Fst<A> &fst) = 0;
-
- virtual FarType Type() const = 0;
-
- virtual bool Error() const = 0;
-
- virtual ~FarWriter() {}
-
- protected:
- FarWriter() {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FarWriter);
-};
-
-
-// This class iterates through an existing archive of FSTs.
-template <class A>
-class FarReader {
- public:
- typedef A Arc;
-
- // Opens an existing FST archive in a single file; returns NULL on error.
- // Sets current position to the beginning of the achive.
- static FarReader *Open(const string &filename);
-
- // Opens an existing FST archive in multiple files; returns NULL on error.
- // Sets current position to the beginning of the achive.
- static FarReader *Open(const vector<string> &filenames);
-
- // Resets current posision to beginning of archive.
- virtual void Reset() = 0;
-
- // Sets current position to first entry >= key. Returns true if a match.
- virtual bool Find(const string &key) = 0;
-
- // Current position at end of archive?
- virtual bool Done() const = 0;
-
- // Move current position to next FST.
- virtual void Next() = 0;
-
- // Returns key at the current position. This reference is invalidated if
- // the current position in the archive is changed.
- virtual const string &GetKey() const = 0;
-
- // Returns FST at the current position. This reference is invalidated if
- // the current position in the archive is changed.
- virtual const Fst<A> &GetFst() const = 0;
-
- virtual FarType Type() const = 0;
-
- virtual bool Error() const = 0;
-
- virtual ~FarReader() {}
-
- protected:
- FarReader() {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FarReader);
-};
-
-
-template <class A>
-class FstWriter {
- public:
- void operator()(ostream &strm, const Fst<A> &fst) const {
- fst.Write(strm, FstWriteOptions());
- }
-};
-
-
-template <class A>
-class STTableFarWriter : public FarWriter<A> {
- public:
- typedef A Arc;
-
- static STTableFarWriter *Create(const string &filename) {
- STTableWriter<Fst<A>, FstWriter<A> > *writer =
- STTableWriter<Fst<A>, FstWriter<A> >::Create(filename);
- return new STTableFarWriter(writer);
- }
-
- void Add(const string &key, const Fst<A> &fst) { writer_->Add(key, fst); }
-
- FarType Type() const { return FAR_STTABLE; }
-
- bool Error() const { return writer_->Error(); }
-
- ~STTableFarWriter() { delete writer_; }
-
- private:
- explicit STTableFarWriter(STTableWriter<Fst<A>, FstWriter<A> > *writer)
- : writer_(writer) {}
-
- private:
- STTableWriter<Fst<A>, FstWriter<A> > *writer_;
-
- DISALLOW_COPY_AND_ASSIGN(STTableFarWriter);
-};
-
-
-template <class A>
-class STListFarWriter : public FarWriter<A> {
- public:
- typedef A Arc;
-
- static STListFarWriter *Create(const string &filename) {
- STListWriter<Fst<A>, FstWriter<A> > *writer =
- STListWriter<Fst<A>, FstWriter<A> >::Create(filename);
- return new STListFarWriter(writer);
- }
-
- void Add(const string &key, const Fst<A> &fst) { writer_->Add(key, fst); }
-
- FarType Type() const { return FAR_STLIST; }
-
- bool Error() const { return writer_->Error(); }
-
- ~STListFarWriter() { delete writer_; }
-
- private:
- explicit STListFarWriter(STListWriter<Fst<A>, FstWriter<A> > *writer)
- : writer_(writer) {}
-
- private:
- STListWriter<Fst<A>, FstWriter<A> > *writer_;
-
- DISALLOW_COPY_AND_ASSIGN(STListFarWriter);
-};
-
-
-template <class A>
-class FstFarWriter : public FarWriter<A> {
- public:
- typedef A Arc;
-
- explicit FstFarWriter(const string &filename)
- : filename_(filename), error_(false), written_(false) {}
-
- static FstFarWriter *Create(const string &filename) {
- return new FstFarWriter(filename);
- }
-
- void Add(const string &key, const Fst<A> &fst) {