27 #include <initializer_list> 34 #include <string_view> 35 #include <type_traits> 39 #if defined(__GNUC__) || defined(__clang__) 40 #define OPENFST_DEPRECATED(message) __attribute__((deprecated(message))) 41 #elif defined(_MSC_VER) 42 #define OPENFST_DEPRECATED(message) [[deprecated(message)]] 44 #define OPENFST_DEPRECATED(message) 51 template <
typename To,
typename From>
53 return static_cast<To
>(f);
56 template <
typename To,
typename From>
58 return static_cast<To
>(f);
62 template <
class Dest,
class Source>
64 static_assert(
sizeof(Dest) ==
sizeof(Source),
65 "Bitcasting unsafe for specified types");
67 std::memcpy(&dest, &source,
sizeof(dest));
74 std::memcpy(&t, p,
sizeof t);
91 template <
typename To>
103 void Update(std::string_view data);
105 std::string
Digest() {
return check_sum_; }
108 static constexpr
int kCheckSumLength = 32;
110 std::string check_sum_;
123 template <
typename T>
125 return std::unique_ptr<T>(
new T);
128 template <
typename T>
130 return std::unique_ptr<T>(
new std::remove_extent_t<T>[n]);
133 template <
typename T>
135 return std::unique_ptr<T>(ptr);
144 template <
typename IteratorT>
149 using value_type =
typename std::iterator_traits<IteratorT>::value_type;
153 : begin_iterator_(std::move(begin_iterator)),
154 end_iterator_(std::move(end_iterator)) {}
156 IteratorT
begin()
const {
return begin_iterator_; }
157 IteratorT
end()
const {
return end_iterator_; }
160 IteratorT begin_iterator_, end_iterator_;
167 template <
typename T>
179 const auto lambda = [](
size_t partial,
const S &right) {
180 return partial + right.size();
182 return std::accumulate(elements.begin(), elements.end(), 0, lambda) +
183 elements.size() * s_size - s_size;
188 inline bool StrContains(std::string_view haystack, std::string_view needle) {
189 return haystack.find(needle) != haystack.npos;
193 return haystack.find(needle) != haystack.npos;
197 std::string
StrJoin(
const std::vector<S> &elements, std::string_view delim) {
199 if (elements.empty())
return result;
200 const size_t s_size = delim.size();
202 auto it = elements.begin();
203 result.append(it->data(), it->size());
204 for (++it; it != elements.end(); ++it) {
205 result.append(delim.data(), s_size);
206 result.append(it->data(), it->size());
212 std::string
StrJoin(
const std::vector<S> &elements,
char delim) {
213 const std::string_view view_delim(&delim, 1);
214 return StrJoin(elements, view_delim);
221 explicit ByAnyChar(std::string_view sp) : delimiters(sp) {}
234 bool skip_empty =
false)
235 : string_(std::move(string)),
236 delim_(std::move(delim)),
237 skip_empty_(skip_empty),
241 std::vector<std::string_view>() && {
242 return std::move(vec_);
246 std::vector<std::string>() {
247 std::vector<std::string> str_vec(vec_.begin(), vec_.end());
255 std::vector<std::string_view> SplitToSv();
257 std::string_view string_;
260 std::vector<std::string_view> vec_;
280 template <
typename T,
typename = std::enable_if_t<
281 std::is_convertible_v<T, std::string_view>>>
285 str_ = std::to_string(i);
288 const std::string &
Get()
const {
return str_; }
296 return s1.
Get() + s2.
Get();
306 template <
typename... Args>
309 const std::initializer_list<StringOrInt> list{
310 s1, s2, s3,
static_cast<const StringOrInt &
>(args)...};
311 std::ostringstream ostrm;
312 for (
const auto &s : list) ostrm << s.
Get();
318 inline bool StartsWith(std::string_view text, std::string_view prefix) {
319 return prefix.empty() ||
320 (text.size() >= prefix.size() &&
321 std::memcmp(text.data(), prefix.data(), prefix.size()) == 0);
326 s->remove_prefix(expected.size());
332 #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)
const_iterator end() const
StringSplitter(std::string_view string, std::string delim, bool skip_empty=false)
std::string StrJoin(const std::vector< S > &elements, std::string_view delim)
bool StartsWith(std::string_view text, std::string_view prefix)
std::string StrCat(const StringOrInt &s1, const StringOrInt &s2)
bool StrContains(std::string_view haystack, std::string_view needle)
ByAnyChar(std::string_view sp)
iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
const_iterator begin() const