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