20 #ifndef FST_MATCHER_FST_H_ 21 #define FST_MATCHER_FST_H_ 89 using Arc =
typename FST::Arc;
108 : CreateDataAndImpl(fst, Name)) {}
116 : CreateDataAndImpl(fst, Name)) {}
130 return impl ?
new MatcherFst(std::shared_ptr<Impl>(impl)) :
nullptr;
137 return impl ?
new MatcherFst(std::shared_ptr<Impl>(impl)) :
nullptr;
141 return GetImpl()->Write(strm, opts);
144 bool Write(
const std::string &source)
const override {
149 return GetImpl()->InitStateIterator(data);
153 return GetImpl()->InitArcIterator(s, data);
157 return new FstMatcher(&GetFst(), match_type, GetSharedData(match_type));
160 const FST &
GetFst()
const {
return GetImpl()->GetFst(); }
162 const Data *
GetAddOn()
const {
return GetImpl()->GetAddOn(); }
165 return GetImpl()->GetSharedAddOn();
169 const auto *data = GetAddOn();
170 return match_type ==
MATCH_INPUT ? data->First() : data->Second();
174 const auto *data = GetAddOn();
175 return match_type ==
MATCH_INPUT ? data->SharedFirst()
176 : data->SharedSecond();
184 const std::string &name) {
187 return CreateImpl(fst, name,
188 std::make_shared<Data>(imatcher.GetSharedData(),
189 omatcher.GetSharedData()));
194 const std::string &name) {
196 return CreateDataAndImpl(result, name);
201 const std::string &name,
202 std::shared_ptr<Data> data) {
203 auto impl = std::make_shared<Impl>(fst, name);
204 impl->SetAddOn(data);
211 const std::string &name,
212 std::shared_ptr<Data> data) {
213 auto impl = std::make_shared<Impl>(fst, name);
214 impl->SetAddOn(data);
227 template <
class FST,
class M, const
char *Name,
class Init>
236 template <
class FST,
class M, const
char *Name,
class Init>
242 typename FST::Arc::StateId s)
247 template <
class F,
class M, const
char *Name,
class Init>
251 using Arc =
typename F::Arc;
256 : matcher_(fst.InitMatcher(match_type)) {}
266 bool Find(
Label label) {
return matcher_->Find(label); }
268 bool Done()
const {
return matcher_->Done(); }
270 const Arc &
Value()
const {
return matcher_->Value(); }
272 void Next() { matcher_->Next(); }
275 return matcher_->Properties(props);
278 uint32_t
Flags()
const {
return matcher_->Flags(); }
281 std::unique_ptr<M> matcher_;
285 template <
class F,
class M, const
char *Name,
class Init>
289 using Arc =
typename F::Arc;
295 : matcher_(fst.InitMatcher(match_type)) {}
298 : matcher_(matcher.matcher_->Copy(safe)) {}
309 bool Find(
Label label) {
return matcher_->Find(label); }
311 bool Done()
const {
return matcher_->Done(); }
313 const Arc &
Value()
const {
return matcher_->Value(); }
315 void Next() { matcher_->Next(); }
320 return matcher_->Properties(props);
323 uint32_t
Flags()
const {
return matcher_->Flags(); }
326 return matcher_->LookAheadLabel(label);
330 return matcher_->LookAheadFst(fst, s);
336 return matcher_->LookAheadPrefix(arc);
340 matcher_->InitLookAheadFst(fst, copy);
344 std::unique_ptr<M> matcher_;
354 arc_lookahead_fst_type>;
375 LabelLookAheadMatcher<SortedMatcher<ConstFst<StdArc>>,
381 #endif // FST_MATCHER_FST_H_ static Impl * Read(std::istream &strm, const FstReadOptions &opts)
typename Arc::Label Label
typename Arc::StateId StateId
typename FstMatcher::MatcherData MatcherData
void InitLookAheadFst(const Fst< Arc > &fst, bool copy=false)
typename M::MatcherData MatcherData
LookAheadMatcher * Copy(bool safe=false) const
MatcherFst * Copy(bool safe=false) const override
const FST & GetFst() const
constexpr char olabel_lookahead_fst_type[]
const MatcherData * GetData(MatchType match_type) const
constexpr char ilabel_lookahead_fst_type[]
static std::shared_ptr< Impl > CreateImpl(const FST &fst, const std::string &name, std::shared_ptr< Data > data)
typename Arc::StateId StateId
static MatcherFst * Read(std::istream &strm, const FstReadOptions &opts)
std::shared_ptr< Data > GetSharedAddOn() const
static std::shared_ptr< Impl > CreateDataAndImpl(const FST &fst, const std::string &name)
uint64_t Properties(uint64_t props) const
LookAheadMatcher(const FST &fst, MatchType match_type)
static MatcherFst * Read(const std::string &source)
constexpr auto olabel_lookahead_flags
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data) const override
constexpr uint32_t kOutputLookAheadMatcher
static std::shared_ptr< Impl > CreateImpl(const Fst< Arc > &fst, const std::string &name, std::shared_ptr< Data > data)
constexpr uint32_t kLookAheadEpsilons
LookAheadMatcher(const LookAheadMatcher &matcher, bool safe=false)
constexpr uint32_t kLookAheadNonEpsilonPrefix
MatchType Type(bool test) const
MatcherFst(const Fst< Arc > &fst, std::shared_ptr< Data > data=nullptr)
void InitStateIterator(StateIteratorData< Arc > *data) const override
constexpr auto ilabel_lookahead_flags
MatcherFst(const FST &fst, std::shared_ptr< Data > data=nullptr)
constexpr uint32_t kInputLookAheadMatcher
AddOnPair< MatcherData, MatcherData > Data
typename Arc::StateId StateId
constexpr uint32_t kLookAheadPrefix
const Arc & Value() const
typename Arc::Weight Weight
MatcherFst(std::shared_ptr< Impl > impl)
MatchType Type(bool test) const
static std::shared_ptr< Impl > CreateDataAndImpl(const Fst< Arc > &fst, const std::string &name)
bool Write(std::ostream &strm, const FstWriteOptions &opts) const override
Matcher(const FST &fst, MatchType match_type)
bool WriteFile(const std::string &source) const
ArcIterator(const MatcherFst< FST, M, Name, Init > &fst, typename FST::Arc::StateId s)
bool LookAheadFst(const Fst< Arc > &fst, StateId s)
bool Write(const std::string &source) const override
constexpr uint32_t kLookAheadWeight
StateIterator(const MatcherFst< FST, M, Name, Init > &fst)
std::shared_ptr< MatcherData > GetSharedData(MatchType match_type) const
NullMatcherFstInit(std::shared_ptr< Impl > *)
const Data * GetAddOn() const
MatcherFst(const MatcherFst &fst, bool safe=false)
FstMatcher * InitMatcher(MatchType match_type) const override
const Arc & Value() const
bool LookAheadPrefix(Arc *arc) const
typename Arc::StateId StateId
const FST & GetFst() const
constexpr char arc_lookahead_fst_type[]
uint64_t Properties(uint64_t props) const
static AddOnImpl * Read(std::istream &strm, const FstReadOptions &opts)
bool LookAheadLabel(Label label) const
typename Arc::Label Label
Weight LookAheadWeight() const
Matcher(const Matcher &matcher)