32 #include <string_view> 33 #include <type_traits> 37 #if defined(__GNUC__) || defined(__clang__) 38 #define OPENFST_DEPRECATED(message) __attribute__((deprecated(message))) 39 #elif defined(_MSC_VER) 40 #define OPENFST_DEPRECATED(message) [[deprecated(message)]] 42 #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));
72 memcpy(&t, p,
sizeof t);
89 template <
typename To>
101 void Update(std::string_view data);
103 std::string
Digest() {
return check_sum_; }
106 static constexpr
int kCheckSumLength = 32;
108 std::string check_sum_;
121 template <
typename T>
123 return std::unique_ptr<T>(
new T);
126 template <
typename T>
128 return std::unique_ptr<T>(
new std::remove_extent_t<T>[n]);
131 template <
typename T>
133 return std::unique_ptr<T>(ptr);
142 template <
typename IteratorT>
147 using value_type =
typename std::iterator_traits<IteratorT>::value_type;
151 : begin_iterator_(std::move(begin_iterator)),
152 end_iterator_(std::move(end_iterator)) {}
154 IteratorT
begin()
const {
return begin_iterator_; }
155 IteratorT
end()
const {
return end_iterator_; }
158 IteratorT begin_iterator_, end_iterator_;
165 template <
typename T>
177 const auto lambda = [](
size_t partial,
const S &right) {
178 return partial + right.size();
180 return std::accumulate(elements.begin(), elements.end(), 0, lambda) +
181 elements.size() * s_size - s_size;
187 std::string
StringJoin(
const std::vector<S> &elements, std::string_view delim) {
189 if (elements.empty())
return result;
190 const size_t s_size = delim.size();
192 auto it = elements.begin();
193 result.append(it->data(), it->size());
194 for (++it; it != elements.end(); ++it) {
195 result.append(delim.data(), s_size);
196 result.append(it->data(), it->size());
202 std::string
StringJoin(
const std::vector<S> &elements,
char delim) {
203 const std::string_view view_delim(&delim, 1);
211 explicit ByAnyChar(std::string_view sp) : delimiters(sp) {}
224 bool skip_empty =
false)
225 : string_(std::move(string)),
226 delim_(std::move(delim)),
227 skip_empty_(skip_empty),
231 std::vector<std::string_view>() && {
232 return std::move(vec_);
236 std::vector<std::string>() {
237 std::vector<std::string> str_vec(vec_.begin(), vec_.end());
245 std::vector<std::string_view> SplitToSv();
247 std::string_view string_;
250 std::vector<std::string_view> vec_;
270 template <
typename T,
typename = std::enable_if_t<
271 std::is_convertible_v<T, std::string_view>>>
275 str_ = std::to_string(i);
278 const std::string &
Get()
const {
return str_; }
287 return s1.
Get() + s2.
Get();
303 return s1.
Get() +
StrCat(s2, s3, s4, s5);
308 inline bool StartsWith(std::string_view text, std::string_view prefix) {
309 return prefix.empty() ||
310 (text.size() >= prefix.size() &&
311 memcmp(text.data(), prefix.data(), prefix.size()) == 0);
316 s->remove_prefix(expected.size());
322 #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)
T UnalignedLoad(const void *p)
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