37 #include <string_view> 46 std::unique_ptr<F> ReadFstClass(std::istream &istrm,
47 const std::string &source) {
49 LOG(ERROR) <<
"ReadFstClass: Can't open file: " << source;
53 if (!hdr.Read(istrm, source))
return nullptr;
54 const FstReadOptions read_options(source, &hdr);
55 const auto &arc_type = hdr.ArcType();
57 const auto reader = reg->GetReader(arc_type);
59 LOG(ERROR) <<
"ReadFstClass: Unknown arc type: " << arc_type;
62 return reader(istrm, read_options);
66 std::unique_ptr<FstClassImplBase> CreateFstClass(
67 std::string_view arc_type) {
69 auto creator = reg->GetCreator(arc_type);
71 FSTERROR() <<
"CreateFstClass: Unknown arc type: " << arc_type;
78 std::unique_ptr<FstClassImplBase> ConvertFstClass(
79 const FstClass &other) {
81 auto converter = reg->GetConverter(other.ArcType());
83 FSTERROR() <<
"ConvertFstClass: Unknown arc type: " << other.ArcType();
86 return converter(other);
94 const std::string &source) {
95 if (!source.empty()) {
96 std::ifstream istrm(source, std::ios_base::in | std::ios_base::binary);
97 return ReadFstClass<FstClass>(istrm, source);
99 return ReadFstClass<FstClass>(std::cin,
"standard input");
104 std::istream &istrm,
const std::string &source) {
105 return ReadFstClass<FstClass>(istrm, source);
109 std::string_view op_name)
const {
111 FSTERROR() << op_name <<
": FST and weight with non-matching weight types: " 121 const std::string &source,
bool convert) {
122 if (convert ==
false) {
123 if (!source.empty()) {
124 std::ifstream in(source, std::ios_base::in | std::ios_base::binary);
125 return ReadFstClass<MutableFstClass>(in, source);
127 return ReadFstClass<MutableFstClass>(std::cin,
"standard input");
131 if (!ifst)
return nullptr;
135 return std::make_unique<VectorFstClass>(*ifst.release());
143 const std::string &source) {
144 if (!source.empty()) {
145 std::ifstream in(source, std::ios_base::in | std::ios_base::binary);
146 return ReadFstClass<VectorFstClass>(in, source);
148 return ReadFstClass<VectorFstClass>(std::cin,
"standard input");
static std::unique_ptr< FstClass > Read(const std::string &source)
constexpr uint64_t kMutable
static std::unique_ptr< VectorFstClass > Read(const std::string &source)
const std::string & Type() const
std::unique_ptr< T > WrapUnique(T *ptr)
VectorFstClass(std::unique_ptr< FstClassImplBase > impl)
const std::string & WeightType() const final
static FstClassIORegister< Reader, Creator, Converter > * GetRegister()
bool WeightTypesMatch(const WeightClass &weight, std::string_view op_name) const
REGISTER_FST_CLASSES(StdArc)
static std::unique_ptr< MutableFstClass > Read(const std::string &source, bool convert=false)