37 #include <type_traits> 38 #include <unordered_map> 39 #include <unordered_set> 48 #include <unordered_map> 49 #include <string_view> 57 (FST_FLAGS_fst_error_fatal ? LOG(FATAL) : LOG(ERROR)) 73 std::is_arithmetic_v<T> || std::is_enum_v<T>;
79 template <
class T,
typename std::enable_if_t<std::is_
class_v<T>, T> * =
nullptr>
80 inline std::istream &
ReadType(std::istream &strm, T *t) {
85 template <
class T,
typename std::enable_if_t<
internal::IsScalarIOTypeV<T>, T>
87 inline std::istream &
ReadType(std::istream &strm, T *t) {
88 return strm.read(reinterpret_cast<char *>(t),
sizeof(T));
93 inline std::istream &
ReadType(std::istream &strm,
size_t n, T *t) {
94 static_assert(internal::IsScalarIOTypeV<T>,
95 "Type not supported for batch read.");
96 return strm.read(reinterpret_cast<char *>(t),
sizeof(T) * n);
100 inline std::istream &
ReadType(std::istream &strm, std::string *s) {
104 if (ns <= 0)
return strm;
111 template <
class... T>
112 std::istream &
ReadType(std::istream &strm, std::vector<T...> *c);
113 template <
class... T>
114 std::istream &
ReadType(std::istream &strm, std::list<T...> *c);
115 template <
class... T>
116 std::istream &
ReadType(std::istream &strm, std::set<T...> *c);
117 template <
class... T>
118 std::istream &
ReadType(std::istream &strm, std::map<T...> *c);
119 template <
class... T>
120 std::istream &
ReadType(std::istream &strm, std::unordered_map<T...> *c);
121 template <
class... T>
122 std::istream &
ReadType(std::istream &strm, std::unordered_set<T...> *c);
125 template <
typename S,
typename T>
126 inline std::istream &
ReadType(std::istream &strm, std::pair<S, T> *p) {
132 template <
typename S,
typename T>
133 inline std::istream &
ReadType(std::istream &strm, std::pair<const S, T> *p) {
134 ReadType(strm, const_cast<S *>(&p->first));
140 template <
class C,
class ReserveFn>
146 auto insert = std::inserter(*c, c->begin());
147 for (int64_t i = 0; i < n; ++i) {
148 typename C::value_type value;
156 template <
typename T,
class A,
157 typename std::enable_if_t<std::is_class_v<T>, T> * =
nullptr>
160 strm, c, [](decltype(c) v,
int n) { v->reserve(n); });
166 typename std::enable_if_t<internal::IsScalarIOTypeV<T>, T> * =
nullptr>
167 inline std::istream &
ReadVectorType(std::istream &strm, std::vector<T, A> *c) {
171 if (n == 0)
return strm;
178 template <
class T,
size_t N>
179 std::istream &
ReadType(std::istream &strm, std::array<T, N> *c) {
180 if constexpr (internal::IsScalarIOTypeV<T>) {
181 ReadType(strm, c->size(), c->data());
183 for (
auto &v : *c)
ReadType(strm, &v);
188 template <
class... T>
189 std::istream &
ReadType(std::istream &strm, std::vector<T...> *c) {
193 template <
class... T>
194 std::istream &
ReadType(std::istream &strm, std::list<T...> *c) {
198 template <
class... T>
199 std::istream &
ReadType(std::istream &strm, std::set<T...> *c) {
203 template <
class... T>
204 std::istream &
ReadType(std::istream &strm, std::map<T...> *c) {
208 template <
class... T>
209 std::istream &
ReadType(std::istream &strm, std::unordered_set<T...> *c) {
211 strm, c, [](decltype(c) v,
int n) { v->reserve(n); });
214 template <
class... T>
215 std::istream &
ReadType(std::istream &strm, std::unordered_map<T...> *c) {
217 strm, c, [](decltype(c) v,
int n) { v->reserve(n); });
223 template <
class T,
typename std::enable_if<
224 std::is_class<T>::value &&
226 !std::is_convertible<T, std::string_view>::value,
227 T>::type * =
nullptr>
228 inline std::ostream &
WriteType(std::ostream &strm,
const T t) {
234 template <
class T,
typename std::enable_if_t<
internal::IsScalarIOTypeV<T>, T>
236 inline std::ostream &
WriteType(std::ostream &strm,
const T t) {
237 return strm.write(reinterpret_cast<const char *>(&t),
sizeof(T));
242 inline std::ostream &
WriteType(std::ostream &strm,
size_t n,
const T *t) {
243 static_assert(internal::IsScalarIOTypeV<T>,
244 "Type not supported for batch write.");
245 return strm.write(reinterpret_cast<const char *>(t),
sizeof(T) * n);
248 inline std::ostream &
WriteType(std::ostream &strm, std::string_view s) {
249 int32_t ns = s.size();
251 return strm.write(s.data(), ns);
256 template <
typename... T>
257 std::ostream &
WriteType(std::ostream &strm,
const std::vector<T...> &c);
259 template <
typename... T>
260 std::ostream &
WriteType(std::ostream &strm,
const std::list<T...> &c);
262 template <
typename... T>
263 std::ostream &
WriteType(std::ostream &strm,
const std::set<T...> &c);
265 template <
typename... T>
266 std::ostream &
WriteType(std::ostream &strm,
const std::map<T...> &c);
268 template <
typename... T>
269 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_map<T...> &c);
271 template <
typename... T>
272 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_set<T...> &c);
275 template <
typename S,
typename T>
276 inline std::ostream &
WriteType(std::ostream &strm,
const std::pair<S, T> &p) {
285 for (
const auto &e : c) {
293 const int64_t n = c.size();
300 template <
class T,
size_t N>
301 std::ostream &
WriteType(std::ostream &strm,
const std::array<T, N> &c) {
305 template <
typename... T>
306 std::ostream &
WriteType(std::ostream &strm,
const std::vector<T...> &c) {
310 template <
typename... T>
311 std::ostream &
WriteType(std::ostream &strm,
const std::list<T...> &c) {
315 template <
typename... T>
316 std::ostream &
WriteType(std::ostream &strm,
const std::set<T...> &c) {
320 template <
typename... T>
321 std::ostream &
WriteType(std::ostream &strm,
const std::map<T...> &c) {
325 template <
typename... T>
326 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_map<T...> &c) {
330 template <
typename... T>
331 std::ostream &
WriteType(std::ostream &strm,
const std::unordered_set<T...> &c) {
341 std::optional<int64_t>
ParseInt64(std::string_view s,
int base = 10);
343 int64_t
StrToInt64(std::string_view s, std::string_view source,
size_t nline,
344 bool * error =
nullptr);
346 template <
typename Weight>
349 std::istringstream strm(std::string{s});
352 FSTERROR() <<
"StrToWeight: Bad weight: " << s;
353 return Weight::NoWeight();
358 template <
typename Weight>
360 std::ostringstream strm;
368 template <
typename I>
370 std::vector<std::pair<I, I>> *pairs) {
371 std::ifstream strm(std::string(source), std::ios_base::in);
373 LOG(ERROR) <<
"ReadIntPairs: Can't open file: " << source;
380 while (strm.getline(line, kLineLen)) {
382 std::vector<std::string_view> col =
385 if (col.empty() || col[0].empty() || col[0][0] ==
'#')
continue;
386 if (col.size() != 2) {
387 LOG(ERROR) <<
"ReadIntPairs: Bad number of columns, " 388 <<
"file = " << source <<
", line = " << nline;
392 I i1 =
StrToInt64(col[0], source, nline, &err);
393 if (err)
return false;
394 I i2 =
StrToInt64(col[1], source, nline, &err);
395 if (err)
return false;
396 pairs->emplace_back(i1, i2);
401 template <
typename I>
403 const std::vector<std::pair<I, I>> &pairs) {
405 if (!source.empty()) {
406 fstrm.open(std::string(source));
408 LOG(ERROR) <<
"WriteIntPairs: Can't open file: " << source;
412 std::ostream &ostrm = fstrm.is_open() ? fstrm : std::cout;
413 for (
const auto &pair : pairs) {
414 ostrm << pair.first <<
"\t" << pair.second <<
"\n";
421 template <
typename Label>
423 std::vector<std::pair<Label, Label>> *pairs) {
427 template <
typename Label>
429 const std::vector<std::pair<Label, Label>> &pairs) {
447 template <
class Key, Key NoKey>
458 if (min_key_ == NoKey || key < min_key_) min_key_ = key;
459 if (max_key_ == NoKey || max_key_ < key) max_key_ = key;
465 min_key_ = max_key_ = NoKey;
466 }
else if (key == min_key_) {
468 }
else if (key == max_key_) {
475 min_key_ = max_key_ = NoKey;
479 if (min_key_ == NoKey || key < min_key_ || max_key_ < key) {
482 return set_.find(key);
487 if (min_key_ == NoKey || key < min_key_ || max_key_ < key) {
489 }
else if (min_key_ != NoKey && max_key_ + 1 == min_key_ + set_.size()) {
492 return set_.count(key);
516 #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)