30 #include <string_view> 31 #include <type_traits> 35 #if defined(__GNUC__) || defined(__clang__) 36 #define OPENFST_DEPRECATED(message) __attribute__((deprecated(message))) 37 #elif defined(_MSC_VER) 38 #define OPENFST_DEPRECATED(message) [[deprecated(message)]] 40 #define OPENFST_DEPRECATED(message) 49 template <
typename To,
typename From>
51 return static_cast<To
>(f);
54 template <
typename To,
typename From>
56 return static_cast<To
>(f);
60 template <
class Dest,
class Source>
62 static_assert(
sizeof(Dest) ==
sizeof(Source),
63 "Bitcasting unsafe for specified types");
65 memcpy(&dest, &source,
sizeof(dest));
82 template <
typename To>
94 void Update(std::string_view data);
96 std::string
Digest() {
return check_sum_; }
99 static constexpr
int kCheckSumLength = 32;
101 std::string check_sum_;
114 template <
typename T>
116 return std::unique_ptr<T>(
new T);
119 template <
typename T>
121 return std::unique_ptr<T>(
new std::remove_extent_t<T>[n]);
124 template <
typename T>
126 return std::unique_ptr<T>(ptr);
135 template <
typename IteratorT>
140 using value_type =
typename std::iterator_traits<IteratorT>::value_type;
144 : begin_iterator_(std::move(begin_iterator)),
145 end_iterator_(std::move(end_iterator)) {}
147 IteratorT
begin()
const {
return begin_iterator_; }
148 IteratorT
end()
const {
return end_iterator_; }
151 IteratorT begin_iterator_, end_iterator_;
158 template <
typename T>
170 const auto lambda = [](
size_t partial,
const S &right) {
171 return partial + right.size();
173 return std::accumulate(elements.begin(), elements.end(), 0, lambda) +
174 elements.size() * s_size - s_size;
180 std::string
StringJoin(
const std::vector<S> &elements, std::string_view delim) {
182 if (elements.empty())
return result;
183 const size_t s_size = delim.size();
185 auto it = elements.begin();
186 result.append(it->data(), it->size());
187 for (++it; it != elements.end(); ++it) {
188 result.append(delim.data(), s_size);
189 result.append(it->data(), it->size());
195 std::string
StringJoin(
const std::vector<S> &elements,
char delim) {
196 const std::string_view view_delim(&delim, 1);
204 explicit ByAnyChar(std::string_view sp) : delimiters(sp) {}
217 bool skip_empty =
false)
218 : string_(std::move(string)),
219 delim_(std::move(delim)),
220 skip_empty_(skip_empty),
224 std::vector<std::string_view>() && {
225 return std::move(vec_);
229 std::vector<std::string>() {
230 std::vector<std::string> str_vec(vec_.begin(), vec_.end());
238 std::vector<std::string_view> SplitToSv();
240 std::string_view string_;
243 std::vector<std::string_view> vec_;
263 template <
typename T,
typename = std::enable_if_t<
264 std::is_convertible_v<T, std::string_view>>>
268 str_ = std::to_string(i);
271 const std::string &
Get()
const {
return str_; }
280 return s1.
Get() + s2.
Get();
296 return s1.
Get() +
StrCat(s2, s3, s4, s5);
301 inline bool StartsWith(std::string_view text, std::string_view prefix) {
302 return prefix.empty() ||
303 (text.size() >= prefix.size() &&
304 memcmp(text.data(), prefix.data(), prefix.size()) == 0);
309 s->remove_prefix(expected.size());
315 #endif // FST_COMPAT_H_ std::vector< std::string_view >::const_iterator const_iterator
Dest bit_cast(const Source &source)
std::string_view value_type
size_t GetResultSize(const std::vector< S > &elements, size_t s_size)
typename type_identity< T >::type type_identity_t
iterator_range< T > make_range(T x, T y)
const std::string & Get() const
typename std::iterator_traits< IteratorT >::value_type value_type
std::unique_ptr< T > WrapUnique(T *ptr)
void StripTrailingAsciiWhitespace(std::string *full)
internal::StringSplitter StrSplit(std::string_view full, ByAnyChar delim)
bool ConsumePrefix(std::string_view *s, std::string_view expected)
std::unique_ptr< T > make_unique_for_overwrite()
constexpr To implicit_cast(typename internal::type_identity_t< To > to)
std::string StringJoin(const std::vector< S > &elements, std::string_view delim)
const_iterator end() const
StringSplitter(std::string_view string, std::string delim, bool skip_empty=false)
bool StartsWith(std::string_view text, std::string_view prefix)
std::string StrCat(const StringOrInt &s1, const StringOrInt &s2)
ByAnyChar(std::string_view sp)
iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
const_iterator begin() const