38 #include <type_traits> 39 #include <unordered_map> 40 #include <unordered_set> 49 #include <unordered_map> 50 #include <string_view> 58 (FST_FLAGS_fst_error_fatal ? LOG(FATAL) : LOG(ERROR)) 74 std::is_arithmetic_v<T> || std::is_enum_v<T>;
80 template <
class T,
typename std::enable_if_t<std::is_
class_v<T>, T> * =
nullptr>
81 inline std::istream &
ReadType(std::istream &strm, T *t) {
86 template <
class T,
typename std::enable_if_t<
internal::IsScalarIOTypeV<T>, T>
88 inline std::istream &
ReadType(std::istream &strm, T *t) {
89 return strm.read(reinterpret_cast<char *>(t),
sizeof(T));
94 inline std::istream &
ReadType(std::istream &strm,
size_t n, T *t) {
95 static_assert(internal::IsScalarIOTypeV<T>,
96 "Type not supported for batch read.");
97 return strm.read(reinterpret_cast<char *>(t),
sizeof(T) * n);
101 inline std::istream &
ReadType(std::istream &strm, std::string *s) {
105 if (ns <= 0)
return strm;
112 template <
class... T>
113 std::istream &
ReadType(std::istream &strm, std::vector<T...> *c);
114 template <
class... T>
115 std::istream &
ReadType(std::istream &strm, std::list<T...> *c);
116 template <
class... T>
117 std::istream &
ReadType(std::istream &strm, std::set<T...> *c);
118 template <
class... T>
119 std::istream &
ReadType(std::istream &strm, std::map<T...> *c);
120 template <
class... T>
121 std::istream &
ReadType(std::istream &strm, std::unordered_map<T...> *c);
122 template <
class... T>
123 std::istream &
ReadType(std::istream &strm, std::unordered_set<T...> *c);
126 template <
typename S,
typename T>
127 inline std::istream &
ReadType(std::istream &strm, std::pair<S, T> *p) {
133 template <
typename S,
typename T>
134 inline std::istream &
ReadType(std::istream &strm, std::pair<const S, T> *p) {
135 ReadType(strm, const_cast<S *>(&p->first));
141 template <
class C,
class ReserveFn>
147 auto insert = std::inserter(*c, c->begin());
148 for (int64_t i = 0; i < n; ++i) {
149 typename C::value_type value;
157 template <
typename T,
class A,
158 typename std::enable_if_t<std::is_class_v<T>, T> * =
nullptr>
161 strm, c, [](decltype(c) v,
int n) { v->reserve(n); });
167 typename std::enable_if_t<internal::IsScalarIOTypeV<T>, T> * =
nullptr>
168 inline std::istream &
ReadVectorType(std::istream &strm, std::vector<T, A> *c) {
172 if (n == 0)
return strm;
179 template <
class T,
size_t N>
180 std::istream &
ReadType(std::istream &strm, std::array<T, N> *c) {
181 if constexpr (internal::IsScalarIOTypeV<T>) {
182 ReadType(strm, c->size(), c->data());
184 for (
auto &v : *c)
ReadType(strm, &v);
189 template <
class... T>
190 std::istream &
ReadType(std::istream &strm, std::vector<T...> *c) {
194 template <
class... T>
195 std::istream &
ReadType(std::istream &strm, std::list<T...> *c) {
199 template <
class... T>
200 std::istream &
ReadType(std::istream &strm, std::set<T...> *c) {
204 template <
class... T>
205 std::istream &
ReadType(std::istream &strm, std::map<T...> *c) {
209 template <
class... T>
210 std::istream &
ReadType(std::istream &strm, std::unordered_set<T...> *c) {
212 strm, c, [](decltype(c) v,
int n) { v->reserve(n); });
215 template <
class... T>
216 std::istream &
ReadType(std::istream &strm, std::unordered_map<T...> *c) {
218 strm, c, [](decltype(c) v,
int n) { v->reserve(n); });
224 template <
class T,
typename std::enable_if<
225 std::is_class<T>::value &&
227 !std::is_convertible<T, std::string_view>::value,
228 T>::type * =
nullptr>
229 inline std::ostream &
WriteType(std::ostream &strm,
const T t) {
235 template <
class T,
typename std::enable_if_t<
internal::IsScalarIOTypeV<T>, T>
237 inline std::ostream &
WriteType(std::ostream &strm,
const T t) {
238 return strm.write(reinterpret_cast<const char *>(&t),
sizeof(T));
243 inline std::ostream &
WriteType(std::ostream &strm,
size_t n,
const T *t) {
244 static_assert(internal::IsScalarIOTypeV<T>,
245 "Type not supported for batch write.");
246 return strm.write(reinterpret_cast<const char *>(t),
sizeof(T) * n);
249 inline std::ostream &
WriteType(std::ostream &strm, std::string_view s) {
250 int32_t ns = s.size();
252 return strm.write(s.data(), ns);
257 template <
typename... T>
258 std::ostream &
WriteType(std::ostream &strm,
const std::vector<T...> &c);
260 template <
typename... T>
261 std::ostream &
WriteType(std::ostream &strm,
const std::list<T...> &c);
263 template <
typename... T>
264 std::ostream &
WriteType(std::ostream &strm,
const std::set<T...> &c);
266 template <
typename... T>
267 std::ostream &
WriteType(std::ostream &strm,
const std::map<T...> &c);
269 template <
typename... T>
270 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_map<T...> &c);
272 template <
typename... T>
273 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_set<T...> &c);
276 template <
typename S,
typename T>
277 inline std::ostream &
WriteType(std::ostream &strm,
const std::pair<S, T> &p) {
286 for (
const auto &e : c) {
294 const int64_t n = c.size();
301 template <
class T,
size_t N>
302 std::ostream &
WriteType(std::ostream &strm,
const std::array<T, N> &c) {
306 template <
typename... T>
307 std::ostream &
WriteType(std::ostream &strm,
const std::vector<T...> &c) {
311 template <
typename... T>
312 std::ostream &
WriteType(std::ostream &strm,
const std::list<T...> &c) {
316 template <
typename... T>
317 std::ostream &
WriteType(std::ostream &strm,
const std::set<T...> &c) {
321 template <
typename... T>
322 std::ostream &
WriteType(std::ostream &strm,
const std::map<T...> &c) {
326 template <
typename... T>
327 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_map<T...> &c) {
331 template <
typename... T>
332 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_set<T...> &c) {
342 std::optional<int64_t>
ParseInt64(std::string_view s,
int base = 10);
344 int64_t
StrToInt64(std::string_view s, std::string_view source,
size_t nline,
345 bool * error =
nullptr);
347 template <
typename Weight>
350 std::istringstream strm(std::string{s});
353 FSTERROR() <<
"StrToWeight: Bad weight: " << s;
354 return Weight::NoWeight();
359 template <
typename Weight>
361 std::ostringstream strm;
369 template <
typename I>
371 std::vector<std::pair<I, I>> *pairs) {
372 std::ifstream strm(std::string(source), std::ios_base::in);
374 LOG(ERROR) <<
"ReadIntPairs: Can't open file: " << source;
381 while (strm.getline(line, kLineLen)) {
383 std::vector<std::string_view> col =
386 if (col.empty() || col[0].empty() || col[0][0] ==
'#')
continue;
387 if (col.size() != 2) {
388 LOG(ERROR) <<
"ReadIntPairs: Bad number of columns, " 389 <<
"file = " << source <<
", line = " << nline;
393 I i1 =
StrToInt64(col[0], source, nline, &err);
394 if (err)
return false;
395 I i2 =
StrToInt64(col[1], source, nline, &err);
396 if (err)
return false;
397 pairs->emplace_back(i1, i2);
402 template <
typename I>
404 const std::vector<std::pair<I, I>> &pairs) {
406 if (!source.empty()) {
407 fstrm.open(std::string(source));
409 LOG(ERROR) <<
"WriteIntPairs: Can't open file: " << source;
413 std::ostream &ostrm = fstrm.is_open() ? fstrm : std::cout;
414 for (
const auto &pair : pairs) {
415 ostrm << pair.first <<
"\t" << pair.second <<
"\n";
422 template <
typename Label>
424 std::vector<std::pair<Label, Label>> *pairs) {
428 template <
typename Label>
430 const std::vector<std::pair<Label, Label>> &pairs) {
448 template <
class Key, Key NoKey>
459 if (min_key_ == NoKey || key < min_key_) min_key_ = key;
460 if (max_key_ == NoKey || max_key_ < key) max_key_ = key;
466 min_key_ = max_key_ = NoKey;
467 }
else if (key == min_key_) {
469 }
else if (key == max_key_) {
476 min_key_ = max_key_ = NoKey;
480 if (min_key_ == NoKey || key < min_key_ || max_key_ < key) {
483 return set_.find(key);
488 if (min_key_ == NoKey || key < min_key_ || max_key_ < key) {
490 }
else if (min_key_ != NoKey && max_key_ + 1 == min_key_ + set_.size()) {
493 return set_.count(key);
517 #endif // FST_UTIL_H_ bool AlignInput(std::istream &strm, size_t align=MappedFile::kArchAlignment)
void ConvertToLegalCSymbol(std::string *s)
std::ostream & WriteSequence(std::ostream &strm, const C &c)
bool WriteLabelPairs(std::string_view source, const std::vector< std::pair< Label, Label >> &pairs)
bool AlignOutput(std::ostream &strm, size_t align=MappedFile::kArchAlignment)
static constexpr size_t kArchAlignment
internal::StringSplitter StrSplit(std::string_view full, ByAnyChar delim)
typename std::set< Label >::const_iterator const_iterator
std::ostream & WriteType(std::ostream &strm, const T t)
std::optional< int64_t > ParseInt64(std::string_view s, int base=10)
DECLARE_bool(fst_error_fatal)
const_iterator Find(Key key) const
std::string WeightToStr(Weight w)
constexpr bool IsScalarIOTypeV
bool Member(Key key) const
std::ostream & WriteContainer(std::ostream &strm, const C &c)
std::istream & ReadType(std::istream &strm, T *t)
const_iterator Begin() const
std::istream & ReadContainerType(std::istream &strm, C *c, ReserveFn reserve)
bool ReadLabelPairs(std::string_view source, std::vector< std::pair< Label, Label >> *pairs)
int64_t StrToInt64(std::string_view s, std::string_view source, size_t nline, bool *error=nullptr)
bool ReadIntPairs(std::string_view source, std::vector< std::pair< I, I >> *pairs)
std::istream & ReadVectorType(std::istream &strm, std::vector< T, A > *c)
const_iterator End() const
Weight StrToWeight(std::string_view s)
bool WriteIntPairs(std::string_view source, const std::vector< std::pair< I, I >> &pairs)