#include "util.h" #include "split.h" #include "vector.h" #include template static inline void DoSplit2(TConsumer& c, TDelim& d, const TBasicStringBuf str, int) { SplitString(str.data(), str.data() + str.size(), d, c); } template static inline void DoSplit1(TConsumer& cc, TDelim& d, const TBasicStringBuf str, int opts) { if (opts & KEEP_EMPTY_TOKENS) { DoSplit2(cc, d, str, opts); } else { TSkipEmptyTokens sc(&cc); DoSplit2(sc, d, str, opts); } } template static inline void DoSplit0(C* res, const TBasicStringBuf str, TDelim& d, size_t maxFields, int options) { using TStringType = std::conditional_t::value, TUtf16String, TString>; res->clear(); if (!str.data()) { return; } using TConsumer = TContainerConsumer; TConsumer cc(res); if (maxFields) { TLimitingConsumer lc(maxFields, &cc); DoSplit1(lc, d, str, options); if (lc.Last) { res->push_back(TStringType(lc.Last, str.data() + str.size() - lc.Last)); } } else { DoSplit1(cc, d, str, options); } } template static void SplitStringImplT(TVector::value, TUtf16String, TString>>* res, const TBasicStringBuf str, const TChr* delim, size_t maxFields, int options) { if (!*delim) { return; } if (*(delim + 1)) { TStringDelimiter d(delim, std::char_traits::length(delim)); DoSplit0(res, str, d, maxFields, options); } else { TCharDelimiter d(*delim); DoSplit0(res, str, d, maxFields, options); } } void ::NPrivate::SplitStringImpl(TVector* res, const char* ptr, const char* delim, size_t maxFields, int options) { return SplitStringImplT(res, TStringBuf(ptr), delim, maxFields, options); } void ::NPrivate::SplitStringImpl(TVector* res, const char* ptr, size_t len, const char* delim, size_t maxFields, int options) { return SplitStringImplT(res, TStringBuf(ptr, len), delim, maxFields, options); } void ::NPrivate::SplitStringImpl(TVector* res, const wchar16* ptr, const wchar16* delimiter, size_t maxFields, int options) { return SplitStringImplT(res, TWtringBuf(ptr), delimiter, maxFields, options); } void ::NPrivate::SplitStringImpl(TVector* res, const wchar16* ptr, size_t len, const wchar16* delimiter, size_t maxFields, int options) { return SplitStringImplT(res, TWtringBuf(ptr, len), delimiter, maxFields, options); } TUtf16String JoinStrings(const TVector& v, const TWtringBuf delim) { return JoinStrings(v.begin(), v.end(), delim); } TUtf16String JoinStrings(const TVector& v, size_t index, size_t count, const TWtringBuf delim) { const size_t f = Min(index, v.size()); const size_t l = f + Min(count, v.size() - f); return JoinStrings(v.begin() + f, v.begin() + l, delim); }