1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Licensed under the Apache License, Version 2.0 (the "License");
3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you may not use this file except in compliance with the License.
4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// You may obtain a copy of the License at
5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//     http://www.apache.org/licenses/LICENSE-2.0
7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Unless required by applicable law or agreed to in writing, software
9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// distributed under the License is distributed on an "AS IS" BASIS,
10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See the License for the specific language governing permissions and
12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// limitations under the License.
13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Copyright 2005-2010 Google, Inc.
15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Author: jpr@google.com (Jake Ratkiewicz)
16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_SCRIPT_REGISTER_H_
18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_SCRIPT_REGISTER_H_
19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <string>
21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/generic-register.h>
23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/script/fst-class.h>
24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/script/weight-class.h>
25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Holds methods and classes responsible for maintaining
27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// the register for FstClass arc types.
28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst {
30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace script {
31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Registers for reading and converting various kinds of FST classes.
34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// This class definition is to avoid a nested class definition inside
37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// the IORegistration struct.
38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Reader, class Creator, class Converter>
39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct FstClassRegEntry {
40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Reader reader;
41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Creator creator;
42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Converter converter;
43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  FstClassRegEntry(Reader r, Creator cr, Converter co) :
45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      reader(r), creator(cr), converter(co) { }
46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  FstClassRegEntry() : reader(0), creator(0), converter(0) { }
47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class Reader, class Creator, class Converter>
50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonclass FstClassIORegister
51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    : public GenericRegister<string,
52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                             FstClassRegEntry<Reader, Creator, Converter>,
53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                             FstClassIORegister<Reader, Creator,
54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                                                Converter> > {
55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public:
56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Reader GetReader(const string &arc_type) const {
57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return this->GetEntry(arc_type).reader;
58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Creator GetCreator(const string &arc_type) const {
61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return this->GetEntry(arc_type).creator;
62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Converter GetConverter(const string &arc_type) const {
65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return this->GetEntry(arc_type).converter;
66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson protected:
69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  virtual string ConvertKeyToSoFilename(
70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      const string& key) const {
71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    string legal_type(key);
72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    ConvertToLegalCSymbol(&legal_type);
73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return legal_type + "-arc.so";
75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Struct containing everything needed to register a particular type
80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// of FST class (e.g. a plain FstClass, or a MutableFstClass, etc)
81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate<class FstClassType>
83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonstruct IORegistration {
84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef FstClassType *(*Reader)(istream &stream,
85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                                  const FstReadOptions &opts);
86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef FstClassImplBase *(*Creator)();
88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef FstClassImplBase *(*Converter)(const FstClass &other);
89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef FstClassRegEntry<Reader, Creator, Converter> Entry;
91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  // FST class Register
93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef FstClassIORegister<Reader, Creator, Converter> Register;
94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  // FST class Register-er
96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef GenericRegisterer<FstClassIORegister<Reader, Creator, Converter> >
97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    Registerer;
98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// REGISTRATION MACROS
103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson//
104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define REGISTER_FST_CLASS(Class, Arc)                                  \
106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  static IORegistration<Class>::Registerer Class ## _ ## Arc ## _registerer( \
107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      Arc::Type(),                                                      \
108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      IORegistration<Class>::Entry(Class::Read<Arc>,                    \
109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                                   Class::Create<Arc>,                  \
110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                                   Class::Convert<Arc>))
111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define REGISTER_FST_CLASSES(Arc)               \
113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  REGISTER_FST_CLASS(FstClass, Arc);            \
114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  REGISTER_FST_CLASS(MutableFstClass, Arc);     \
115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  REGISTER_FST_CLASS(VectorFstClass, Arc);
116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}  // namespace script
118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}  // namespace fst
119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif  // FST_SCRIPT_REGISTER_H_
121