FST  openfst-1.8.3
OpenFst Library
arciterator-class.h
Go to the documentation of this file.
1 // Copyright 2005-2024 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the 'License');
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an 'AS IS' BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // See www.openfst.org for extensive documentation on this weighted
16 // finite-state transducer library.
17 
18 #ifndef FST_SCRIPT_ARCITERATOR_CLASS_H_
19 #define FST_SCRIPT_ARCITERATOR_CLASS_H_
20 
21 #include <cstddef>
22 #include <cstdint>
23 #include <memory>
24 #include <tuple>
25 #include <utility>
26 
27 #include <fst/fst.h>
28 #include <fst/fstlib.h>
29 #include <fst/mutable-fst.h>
30 #include <fst/script/arc-class.h>
31 #include <fst/script/fst-class.h>
32 
33 // Scripting API support for ArcIterator.
34 //
35 // A call to Value() causes the underlying arc to be used to construct the
36 // associated ArcClass.
37 
38 namespace fst {
39 namespace script {
40 
41 // Non-mutable arc iterators.
42 
43 // Virtual interface implemented by each concrete ArcIteratorImpl<F>.
45  public:
46  virtual bool Done() const = 0;
47  virtual uint8_t Flags() const = 0;
48  virtual void Next() = 0;
49  virtual size_t Position() const = 0;
50  virtual void Reset() = 0;
51  virtual void Seek(size_t a) = 0;
52  virtual void SetFlags(uint8_t flags, uint8_t mask) = 0;
53  virtual ArcClass Value() const = 0;
54  virtual ~ArcIteratorImplBase() = default;
55 };
56 
57 // Templated implementation.
58 template <class Arc>
60  public:
61  explicit ArcIteratorClassImpl(const Fst<Arc> &fst, int64_t s)
62  : aiter_(fst, s) {}
63 
64  bool Done() const final { return aiter_.Done(); }
65 
66  uint8_t Flags() const final { return aiter_.Flags(); }
67 
68  void Next() final { aiter_.Next(); }
69 
70  size_t Position() const final { return aiter_.Position(); }
71 
72  void Reset() final { aiter_.Reset(); }
73 
74  void Seek(size_t a) final { aiter_.Seek(a); }
75 
76  void SetFlags(uint8_t flags, uint8_t mask) final {
77  aiter_.SetFlags(flags, mask);
78  }
79 
80  // This is returned by value because it has not yet been constructed, and
81  // is likely to participate in return-value optimization.
82  ArcClass Value() const final { return ArcClass(aiter_.Value()); }
83 
84  ~ArcIteratorClassImpl() override = default;
85 
86  private:
87  ArcIterator<Fst<Arc>> aiter_;
88 };
89 
90 class ArcIteratorClass;
91 
93  std::tuple<const FstClass &, int64_t, ArcIteratorClass *>;
94 
95 // Untemplated user-facing class holding a templated pimpl.
97  public:
98  ArcIteratorClass(const FstClass &fst, int64_t s);
99 
100  template <class Arc>
101  ArcIteratorClass(const Fst<Arc> &fst, int64_t s)
102  : impl_(std::make_unique<ArcIteratorClassImpl<Arc>>(fst, s)) {}
103 
104  bool Done() const { return impl_->Done(); }
105 
106  uint8_t Flags() const { return impl_->Flags(); }
107 
108  void Next() { impl_->Next(); }
109 
110  size_t Position() const { return impl_->Position(); }
111 
112  void Reset() { impl_->Reset(); }
113 
114  void Seek(size_t a) { impl_->Seek(a); }
115 
116  void SetFlags(uint8_t flags, uint8_t mask) { impl_->SetFlags(flags, mask); }
117 
118  ArcClass Value() const { return impl_->Value(); }
119 
120  template <class Arc>
122 
123  private:
124  std::unique_ptr<ArcIteratorImplBase> impl_;
125 };
126 
127 template <class Arc>
129  const Fst<Arc> &fst = *std::get<0>(*args).GetFst<Arc>();
130  std::get<2>(*args)->impl_ =
131  std::make_unique<ArcIteratorClassImpl<Arc>>(fst, std::get<1>(*args));
132 }
133 
134 // Mutable arc iterators.
135 
136 // Virtual interface implemented by each concrete MutableArcIteratorImpl<F>.
138  public:
139  virtual void SetValue(const ArcClass &) = 0;
140 
141  ~MutableArcIteratorImplBase() override = default;
142 };
143 
144 // Templated implementation.
145 template <class Arc>
147  public:
149  : aiter_(fst, s) {}
150 
151  bool Done() const final { return aiter_.Done(); }
152 
153  uint8_t Flags() const final { return aiter_.Flags(); }
154 
155  void Next() final { aiter_.Next(); }
156 
157  size_t Position() const final { return aiter_.Position(); }
158 
159  void Reset() final { aiter_.Reset(); }
160 
161  void Seek(size_t a) final { aiter_.Seek(a); }
162 
163  void SetFlags(uint8_t flags, uint8_t mask) final {
164  aiter_.SetFlags(flags, mask);
165  }
166 
167  void SetValue(const ArcClass &ac) final { SetValue(ac.GetArc<Arc>()); }
168 
169  // This is returned by value because it has not yet been constructed, and
170  // is likely to participate in return-value optimization.
171  ArcClass Value() const final { return ArcClass(aiter_.Value()); }
172 
173  ~MutableArcIteratorClassImpl() override = default;
174 
175  private:
176  void SetValue(const Arc &arc) { aiter_.SetValue(arc); }
177 
179 };
180 
182 
184  std::tuple<MutableFstClass *, int64_t, MutableArcIteratorClass *>;
185 
186 // Untemplated user-facing class holding a templated pimpl.
188  public:
190 
191  template <class Arc>
193  : impl_(std::make_unique<MutableArcIteratorClassImpl<Arc>>(fst, s)) {}
194 
195  bool Done() const { return impl_->Done(); }
196 
197  uint8_t Flags() const { return impl_->Flags(); }
198 
199  void Next() { impl_->Next(); }
200 
201  size_t Position() const { return impl_->Position(); }
202 
203  void Reset() { impl_->Reset(); }
204 
205  void Seek(size_t a) { impl_->Seek(a); }
206 
207  void SetFlags(uint8_t flags, uint8_t mask) { impl_->SetFlags(flags, mask); }
208 
209  void SetValue(const ArcClass &ac) { impl_->SetValue(ac); }
210 
211  ArcClass Value() const { return impl_->Value(); }
212 
213  template <class Arc>
214  friend void InitMutableArcIteratorClass(
216 
217  private:
218  std::unique_ptr<MutableArcIteratorImplBase> impl_;
219 };
220 
221 template <class Arc>
223  MutableFst<Arc> *fst = std::get<0>(*args)->GetMutableFst<Arc>();
224  std::get<2>(*args)->impl_ =
225  std::make_unique<MutableArcIteratorClassImpl<Arc>>(fst,
226  std::get<1>(*args));
227 }
228 
229 } // namespace script
230 } // namespace fst
231 
232 #endif // FST_SCRIPT_ARCITERATOR_CLASS_H_
void SetFlags(uint8_t flags, uint8_t mask) final
virtual uint8_t Flags() const =0
void SetFlags(uint8_t flags, uint8_t mask)
MutableArcIteratorClass(MutableFst< Arc > *fst, int64_t s)
std::tuple< const FstClass &, int64_t, ArcIteratorClass * > InitArcIteratorClassArgs
virtual ~ArcIteratorImplBase()=default
std::tuple< MutableFstClass *, int64_t, MutableArcIteratorClass * > InitMutableArcIteratorClassArgs
virtual bool Done() const =0
ArcIteratorClass(const Fst< Arc > &fst, int64_t s)
void SetFlags(uint8_t flags, uint8_t mask)
void SetValue(const ArcClass &ac) final
virtual size_t Position() const =0
virtual ArcClass Value() const =0
void InitArcIteratorClass(InitArcIteratorClassArgs *args)
virtual void SetFlags(uint8_t flags, uint8_t mask)=0
void SetFlags(uint8_t flags, uint8_t mask) final
MutableArcIteratorClassImpl(MutableFst< Arc > *fst, int64_t s)
virtual void Seek(size_t a)=0
ArcIteratorClassImpl(const Fst< Arc > &fst, int64_t s)
void InitMutableArcIteratorClass(InitMutableArcIteratorClassArgs *args)