14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// fst.h 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Licensed under the Apache License, Version 2.0 (the "License"); 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// you may not use this file except in compliance with the License. 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// You may obtain a copy of the License at 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// http://www.apache.org/licenses/LICENSE-2.0 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Unless required by applicable law or agreed to in writing, software 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// distributed under the License is distributed on an "AS IS" BASIS, 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// See the License for the specific language governing permissions and 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// limitations under the License. 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// \file 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Finite-State Transducer (FST) - abstract base class definition, 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// state and arc iterator interface, and suggested base implementation. 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef FST_LIB_FST_H__ 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FST_LIB_FST_H__ 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/arc.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/compat.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/properties.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/register.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/symbol-table.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fst/lib/util.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectnamespace fst { 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass FstHeader; 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> class StateIteratorData; 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> class ArcIteratorData; 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstruct FstReadOptions { 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project string source; // Where you're reading from 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const FstHeader *header; // Pointer to Fst header (if non-zero) 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SymbolTable* isymbols; // Pointer to input symbols (if non-zero) 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SymbolTable* osymbols; // Pointer to output symbols (if non-zero) 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit FstReadOptions(const string& src = "<unspecified>", 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const FstHeader *hdr = 0, 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SymbolTable* isym = 0, 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SymbolTable* osym = 0) 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : source(src), header(hdr), isymbols(isym), osymbols(osym) {} 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstruct FstWriteOptions { 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project string source; // Where you're writing to 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool write_header; // Write the header? 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool write_isymbols; // Write input symbols? 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool write_osymbols; // Write output symbols? 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit FstWriteOptions(const string& src = "<unspecifed>", 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool hdr = true, bool isym = true, 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool osym = true) 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : source(src), write_header(hdr), 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project write_isymbols(isym), write_osymbols(osym) {} 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Fst HEADER CLASS 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// This is the recommended Fst file header representation. 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass FstHeader { 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project enum { 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HAS_ISYMBOLS = 1, // Has input symbol table 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HAS_OSYMBOLS = 2 // Has output symbol table 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } Flags; 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FstHeader() : version_(0), flags_(0), properties_(0), start_(-1), 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project numstates_(0), numarcs_(0) {} 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const string &FstType() const { return fsttype_; } 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const string &ArcType() const { return arctype_; } 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int32 Version() const { return version_; } 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int32 GetFlags() const { return flags_; } 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 Properties() const { return properties_; } 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int64 Start() const { return start_; } 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int64 NumStates() const { return numstates_; } 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int64 NumArcs() const { return numarcs_; } 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetFstType(const string& type) { fsttype_ = type; } 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetArcType(const string& type) { arctype_ = type; } 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetVersion(int32 version) { version_ = version; } 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetFlags(int32 flags) { flags_ = flags; } 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetProperties(uint64 properties) { properties_ = properties; } 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetStart(int64 start) { start_ = start; } 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetNumStates(int64 numstates) { numstates_ = numstates; } 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetNumArcs(int64 numarcs) { numarcs_ = numarcs; } 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool Read(istream &strm, const string &source); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool Write(ostream &strm, const string &source) const; 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project string fsttype_; // E.g. "vector" 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project string arctype_; // E.g. "standard" 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int32 version_; // Type version # 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int32 flags_; // File format bits 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 properties_; // FST property bits 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int64 start_; // Start state 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int64 numstates_; // # of states 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int64 numarcs_; // # of arcs 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Fst INTERFACE CLASS DEFINITION 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// A generic FST, templated on the arc definition, with 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// common-demoninator methods (use StateIterator and ArcIterator to 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// iterate over its states and arcs). 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass Fst { 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef A Arc; 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Weight Weight; 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual ~Fst() {} 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual StateId Start() const = 0; // Initial state 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual Weight Final(StateId) const = 0; // State's final weight 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumArcs(StateId) const = 0; // State's arc count 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumInputEpsilons(StateId) 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const = 0; // State's input epsilon count 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual size_t NumOutputEpsilons(StateId) 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const = 0; // State's output epsilon count 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // If test=false, return stored properties bits for mask (some poss. unknown) 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // If test=true, return property bits for mask (computing o.w. unknown) 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual uint64 Properties(uint64 mask, bool test) 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const = 0; // Property bits 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const string& Type() const = 0; // Fst type name 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Get a copy of this Fst. 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual Fst<A> *Copy() const = 0; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Read an Fst from an input stream; returns NULL on error 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static Fst<A> *Read(istream &strm, const FstReadOptions &opts) { 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FstReadOptions ropts(opts); 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FstHeader hdr; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ropts.header) 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hdr = *opts.header; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!hdr.Read(strm, opts.source)) 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ropts.header = &hdr; 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FstRegister<A> *registr = FstRegister<A>::GetRegister(); 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const typename FstRegister<A>::Reader reader = 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project registr->GetReader(hdr.FstType()); 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!reader) { 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG(ERROR) << "Fst::Read: Unknown FST type \"" << hdr.FstType() 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << "\" (arc type = \"" << A::Type() 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << "\"): " << ropts.source; 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return reader(strm, ropts); 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project }; 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Read an Fst from a file; return NULL on error 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static Fst<A> *Read(const string &filename) { 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ifstream strm(filename.c_str()); 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!strm) { 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG(ERROR) << "Fst::Read: Can't open file: " << filename; 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return 0; 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return Read(strm, FstReadOptions(filename)); 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Write an Fst to an output stream; return false on error 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG(ERROR) << "Fst::Write: No write method for " << Type() << " Fst type"; 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Write an Fst to a file; return false on error 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual bool Write(const string &filename) const { 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG(ERROR) << "Fst::Write: No write method for " 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << Type() << " Fst type: " 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << (filename.empty() ? "standard output" : filename); 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Return input label symbol table; return NULL if not specified 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const SymbolTable* InputSymbols() const = 0; 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Return output label symbol table; return NULL if not specified 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const SymbolTable* OutputSymbols() const = 0; 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // For generic state iterator construction; not normally called 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // directly by users. 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void InitStateIterator(StateIteratorData<A> *) const = 0; 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // For generic arc iterator construction; not normally called 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // directly by users. 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void InitArcIterator(StateId s, ArcIteratorData<A> *) const = 0; 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// STATE and ARC ITERATOR DEFINITIONS 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// State iterator interface templated on the Arc definition; used 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// for StateIterator specializations returned by InitStateIterator. 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass StateIteratorBase { 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef A Arc; 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual ~StateIteratorBase() {} 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual bool Done() const = 0; // End of iterator? 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual StateId Value() const = 0; // Current state (when !Done) 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void Next() = 0; // Advance to next state (when !Done) 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void Reset() = 0; // Return to initial condition 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// StateIterator initialization data 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> struct StateIteratorData { 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateIteratorBase<A> *base; // Specialized iterator if non-zero 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typename A::StateId nstates; // O.w. total # of states 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Generic state iterator, templated on the FST definition 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// - a wrapper around pointer to specific one. 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Here is a typical use: \code 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// for (StateIterator<StdFst> siter(fst); 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// !siter.Done(); 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// siter.Next()) { 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// StateId s = siter.Value(); 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ... 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// } \endcode 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class F> 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass StateIterator { 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename F::Arc Arc; 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename Arc::StateId StateId; 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project explicit StateIterator(const F &fst) : s_(0) { 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst.InitStateIterator(&data_); 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ~StateIterator() { if (data_.base) delete data_.base; } 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool Done() const { 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return data_.base ? data_.base->Done() : s_ >= data_.nstates; 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId Value() const { return data_.base ? data_.base->Value() : s_; } 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Next() { 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data_.base) 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data_.base->Next(); 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++s_; 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Reset() { 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data_.base) 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data_.base->Reset(); 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project s_ = 0; 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateIteratorData<Arc> data_; 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project StateId s_; 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DISALLOW_EVIL_CONSTRUCTORS(StateIterator); 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Arc iterator interface, templated on the Arc definition; used 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// for Arc iterator specializations that are returned by InitArcIterator. 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass ArcIteratorBase { 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef A Arc; 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual ~ArcIteratorBase() {} 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual bool Done() const = 0; // End of iterator? 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual const A& Value() const = 0; // Current state (when !Done) 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void Next() = 0; // Advance to next arc (when !Done) 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void Reset() = 0; // Return to initial condition 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project virtual void Seek(size_t a) = 0; // Random arc access by position 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ArcIterator initialization data 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> struct ArcIteratorData { 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArcIteratorBase<A> *base; // Specialized iterator if non-zero 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const A *arcs; // O.w. arcs pointer 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t narcs; // ... and arc count 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *ref_count; // ... and reference count if non-zero 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Generic arc iterator, templated on the FST definition 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// - a wrapper around pointer to specific one. 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Here is a typical use: \code 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// for (ArcIterator<StdFst> aiter(fst, s)); 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// !aiter.Done(); 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// aiter.Next()) { 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// StdArc &arc = aiter.Value(); 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// ... 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// } \endcode 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class F> 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass ArcIterator { 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename F::Arc Arc; 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename Arc::StateId StateId; 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArcIterator(const F &fst, StateId s) : i_(0) { 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fst.InitArcIterator(s, &data_); 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ~ArcIterator() { 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data_.base) 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete data_.base; 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (data_.ref_count) 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project --(*data_.ref_count); 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool Done() const { 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return data_.base ? data_.base->Done() : i_ >= data_.narcs; 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const Arc& Value() const { 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return data_.base ? data_.base->Value() : data_.arcs[i_]; 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Next() { 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data_.base) 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data_.base->Next(); 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++i_; 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Reset() { 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data_.base) 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data_.base->Reset(); 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project i_ = 0; 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void Seek(size_t a) { 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (data_.base) 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project data_.base->Seek(a); 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project i_ = a; 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ArcIteratorData<Arc> data_; 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i_; 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DISALLOW_EVIL_CONSTRUCTORS(ArcIterator); 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// A useful alias when using StdArc. 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef Fst<StdArc> StdFst; 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// CONSTANT DEFINITIONS 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectconst int kNoStateId = -1; // Not a valid state ID 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectconst int kNoLabel = -1; // Not a valid label 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectconst int kPhiLabel = -2; // Failure transition label 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectconst int kRhoLabel = -3; // Matches o.w. unmatched labels (lib. internal) 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectconst int kSigmaLabel = -4; // Matches all labels in alphabet. 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Fst IMPLEMENTATION BASE 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// This is the recommended Fst implementation base class. It will 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// handle reference counts, property bits, type information and symbols. 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <class A> class FstImpl { 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project public: 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::Weight Weight; 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef typename A::StateId StateId; 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FstImpl() 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : properties_(0), type_("null"), isymbols_(0), osymbols_(0), 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ref_count_(1) {} 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FstImpl(const FstImpl<A> &impl) 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project : properties_(impl.properties_), type_(impl.type_), 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project isymbols_(impl.isymbols_ ? new SymbolTable(impl.isymbols_) : 0), 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project osymbols_(impl.osymbols_ ? new SymbolTable(impl.osymbols_) : 0), 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ref_count_(1) {} 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ~FstImpl() { 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete isymbols_; 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete osymbols_; 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const string& Type() const { return type_; } 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetType(const string &type) { type_ = type; } 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 Properties() const { return properties_; } 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 Properties(uint64 mask) const { return properties_ & mask; } 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetProperties(uint64 props) { properties_ = props; } 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetProperties(uint64 props, uint64 mask) { 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project properties_ &= ~mask; 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project properties_ |= props & mask; 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SymbolTable* InputSymbols() const { return isymbols_; } 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const SymbolTable* OutputSymbols() const { return osymbols_; } 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SymbolTable* InputSymbols() { return isymbols_; } 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SymbolTable* OutputSymbols() { return osymbols_; } 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetInputSymbols(const SymbolTable* isyms) { 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isymbols_) delete isymbols_; 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project isymbols_ = isyms ? isyms->Copy() : 0; 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void SetOutputSymbols(const SymbolTable* osyms) { 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (osymbols_) delete osymbols_; 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project osymbols_ = osyms ? osyms->Copy() : 0; 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int RefCount() const { return ref_count_; } 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int IncrRefCount() { return ++ref_count_; } 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int DecrRefCount() { return --ref_count_; } 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Read-in header and symbols, initialize Fst, and return the header. 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // If opts.header is non-null, skip read-in and use the option value. 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // If opts.[io]symbols is non-null, read-in but use the option value. 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool ReadHeaderAndSymbols(istream &strm, const FstReadOptions& opts, 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int min_version, FstHeader *hdr) { 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (opts.header) 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *hdr = *opts.header; 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (!hdr->Read(strm, opts.source)) 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hdr->FstType() != type_) { 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG(ERROR) << "FstImpl::ReadHeaderAndSymbols: Fst not of type \"" 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << type_ << "\": " << opts.source; 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hdr->ArcType() != A::Type()) { 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG(ERROR) << "FstImpl::ReadHeaderAndSymbols: Arc not of type \"" 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << A::Type() 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << "\": " << opts.source; 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hdr->Version() < min_version) { 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG(ERROR) << "FstImpl::ReadHeaderAndSymbols: Obsolete " 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project << type_ << " Fst version: " << opts.source; 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project properties_ = hdr->Properties(); 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hdr->GetFlags() & FstHeader::HAS_ISYMBOLS) 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project isymbols_ = SymbolTable::Read(strm, opts.source); 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (hdr->GetFlags() & FstHeader::HAS_OSYMBOLS) 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project osymbols_ =SymbolTable::Read(strm, opts.source); 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (opts.isymbols) { 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete isymbols_; 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project isymbols_ = opts.isymbols->Copy(); 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (opts.osymbols) { 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete osymbols_; 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project osymbols_ = opts.osymbols->Copy(); 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return true; 4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Write-out header and symbols. 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // If a opts.header is false, skip writing header. 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // If opts.[io]symbols is false, skip writing those symbols. 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void WriteHeaderAndSymbols(ostream &strm, const FstWriteOptions& opts, 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int version, FstHeader *hdr) const { 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (opts.write_header) { 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hdr->SetFstType(type_); 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hdr->SetArcType(A::Type()); 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hdr->SetVersion(version); 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hdr->SetProperties(properties_); 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int32 file_flags = 0; 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isymbols_ && opts.write_isymbols) 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project file_flags |= FstHeader::HAS_ISYMBOLS; 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (osymbols_ && opts.write_osymbols) 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project file_flags |= FstHeader::HAS_OSYMBOLS; 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hdr->SetFlags(file_flags); 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hdr->Write(strm, opts.source); 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isymbols_ && opts.write_isymbols) isymbols_->Write(strm); 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (osymbols_ && opts.write_osymbols) osymbols_->Write(strm); 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project protected: 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project uint64 properties_; // Property bits 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project private: 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project string type_; // Unique name of Fst class 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SymbolTable *isymbols_; // Ilabel symbol table 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SymbolTable *osymbols_; // Olabel symbol table 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ref_count_; // Reference count 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void operator=(const FstImpl<A> &impl); // disallow 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // namespace fst; 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif // FST_LIB_FST_H__ 534