/usr/include/fst/register.h is in libfst-dev 1.5.3+r3-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | // See www.openfst.org for extensive documentation on this weighted
// finite-state transducer library.
//
// Classes for registering derived FST for generic reading.
#ifndef FST_LIB_REGISTER_H_
#define FST_LIB_REGISTER_H_
#include <string>
#include <fst/compat.h>
#include <fst/generic-register.h>
#include <fst/util.h>
#include <fst/types.h>
namespace fst {
template <class A>
class Fst;
struct FstReadOptions;
// This class represents a single entry in a FstRegister
template <class A>
struct FstRegisterEntry {
typedef Fst<A> *(*Reader)(std::istream &strm, const FstReadOptions &opts);
typedef Fst<A> *(*Converter)(const Fst<A> &fst);
Reader reader;
Converter converter;
FstRegisterEntry() : reader(0), converter(0) {}
FstRegisterEntry(Reader r, Converter c) : reader(r), converter(c) {}
};
// This class maintains the correspondence between a string describing
// an FST type, and its reader and converter.
template <class A>
class FstRegister
: public GenericRegister<string, FstRegisterEntry<A>, FstRegister<A>> {
public:
typedef typename FstRegisterEntry<A>::Reader Reader;
typedef typename FstRegisterEntry<A>::Converter Converter;
const Reader GetReader(const string &type) const {
return this->GetEntry(type).reader;
}
const Converter GetConverter(const string &type) const {
return this->GetEntry(type).converter;
}
protected:
string ConvertKeyToSoFilename(const string &key) const override {
string legal_type(key);
ConvertToLegalCSymbol(&legal_type);
return legal_type + "-fst.so";
}
};
// This class registers an Fst type for generic reading and creating.
// The Fst type must have a default constructor and a copy constructor
// from 'Fst<Arc>' for this to work.
template <class F>
class FstRegisterer : public GenericRegisterer<FstRegister<typename F::Arc>> {
public:
typedef typename F::Arc Arc;
typedef typename FstRegister<Arc>::Entry Entry;
typedef typename FstRegister<Arc>::Reader Reader;
FstRegisterer()
: GenericRegisterer<FstRegister<typename F::Arc>>(F().Type(),
BuildEntry()) {}
private:
static Entry BuildEntry() {
F *(*reader)(std::istream &strm, const FstReadOptions &opts) = &F::Read;
return Entry(reinterpret_cast<Reader>(reader), &FstRegisterer<F>::Convert);
}
static Fst<Arc> *Convert(const Fst<Arc> &fst) { return new F(fst); }
};
// Convenience macro to generate static FstRegisterer instance.
#define REGISTER_FST(F, A) \
static fst::FstRegisterer<F<A>> F##_##A##_registerer
// Converts an fst to type 'type'.
template <class A>
Fst<A> *Convert(const Fst<A> &fst, const string &ftype) {
FstRegister<A> *registr = FstRegister<A>::GetRegister();
const typename FstRegister<A>::Converter converter =
registr->GetConverter(ftype);
if (!converter) {
string atype = A::Type();
FSTERROR() << "Fst::Convert: Unknown FST type " << ftype
<< " (arc type " << atype << ")";
return nullptr;
}
return converter(fst);
}
} // namespace fst
#endif // FST_LIB_REGISTER_H_
|