36namespace strings_internal {
51 size_t start = text.find(c_, pos);
52 if (start == StringView::npos) {
53 return StringView(text.data() + text.size(), 0);
56 while (end < text.size() && text[end] == c_) {
59 return text.substr(start, end - start);
70 while (pos < text.size()) {
71 if(std::isspace(
static_cast<unsigned char>(text[pos])))
75 while (pos < text.size() && std::isspace(
static_cast<unsigned char>(text[pos]))) {
78 return text.substr(start, pos - start);
83 return StringView(text.data() + text.size(), 0);
92 while(pos < text.size() && std::isspace(
static_cast<unsigned char>(text[pos]))) {
95 return text.substr(pos, 1);
106 if(delimiter_.empty())
108 return text.substr(pos + 1, 0);
110 else if(delimiter_.size() == 1)
112 auto found = text.find(delimiter_[0], pos);
113 if (found == StringView::npos) {
114 return text.substr(text.size());
116 return text.substr(found, 1);
119 auto found = text.find(delimiter_, pos);
120 if (found == StringView::npos) {
121 return text.substr(text.size());
123 return text.substr(found, delimiter_.size());
133 explicit ByChar(
char c) : c_(c) {}
136 auto found = text.find(c_, pos);
137 if (found == StringView::npos) {
138 return StringView(text.data() + text.size(), 0);
140 return text.substr(found, 1);
153 auto found = text.find_first_of(delimiters_, pos);
154 if (found == StringView::npos) {
155 return StringView(text.data() + text.size(), 0);
157 return text.substr(found, 1);
167 explicit ByLength(std::ptrdiff_t length) : length_(length) {}
170 if (pos >= text.size()) {
171 return text.substr(text.size());
173 size_t end = pos + length_;
174 if (end > text.size()) {
177 return text.substr(end, 0);
181 const std::ptrdiff_t length_;
185template <
typename Delimiter>
189 : delimiter_(std::move(delimiter)), limit_(limit), count_(0) {}
192 if (count_++ == limit_) {
193 return StringView(text.data() + text.size(), 0);
195 return delimiter_.Find(text, pos);
199 Delimiter delimiter_;
206 bool operator()(
StringView)
const {
return true; }
210 bool operator()(
StringView sp)
const {
return !sp.empty(); }
217 while (start < sp.size()) {
219 if (c !=
' ' && c !=
'\t' && c !=
'\n' && c !=
'\r' && c !=
'\f' && c !=
'\v') {
224 return start < sp.size();
229template <
typename Delimiter>
231 using type = Delimiter;
260template <
typename Delimiter,
typename Predicate,
typename StringType=StringView>
264 : text_(std::move(text))
265 , delimiter_(std::move(delimiter))
266 , predicate_(std::move(predicate))
272 using value_type = StringType;
273 using difference_type = std::ptrdiff_t;
274 using pointer =
const StringType*;
275 using reference =
const StringType&;
276 using iterator_category = std::forward_iterator_tag;
279 : splitter_(splitter)
280 , delimiter_(splitter_->delimiter_)
281 , predicate_(splitter_->predicate_)
282 , current_{
nullptr, StringType::npos}
289 : splitter_(splitter)
290 , delimiter_(splitter_->delimiter_)
291 , predicate_(splitter_->predicate_)
298 reference operator*()
const {
302 pointer operator->()
const {
317 bool operator==(
const Iterator& other)
const {
318 return current_.data() == other.current_.data();
321 bool operator!=(
const Iterator& other)
const {
322 return !(*
this == other);
324 bool at_end()
const {
325 return current_.size() == StringType::npos;
334 if(current_.end() == splitter_->text_.end()) {
335 current_ = {
nullptr, StringType::npos};
338 auto delimiter_view = delimiter_.Find(splitter_->text_, pos_);
343 size_t current_end = delimiter_view.data() - splitter_->text_.data();
344 current_ = splitter_->text_.substr(pos_, current_end - pos_);
345 pos_ = current_end + delimiter_view.size();
347 }
while(!predicate_(current_));
351 Delimiter delimiter_;
352 Predicate predicate_;
369 template <
typename Container>
370 operator Container()
const {
372 using ValueType =
typename Container::value_type;
373 auto it = std::inserter(result, result.end());
374 for (
const auto& part : *
this) {
375 *it++ = ValueType(part);
380 operator std::vector<std::string>()
const{
381 const std::vector<StringView> v = this->
operator std::vector<StringView>();
382 return std::vector<std::string>(v.begin(), v.end());
385 operator std::vector<StringView>()
const {
393 std::vector<StringView> v;
394 std::array<raw_view, 16> ar;
395 for (
auto it = this->begin(); !it.at_end();) {
398 ar[index].data = it->data();
399 ar[index].size = it->size();
401 }
while (++index != ar.size() && !it.at_end());
402 v.insert(v.end(), ar.begin(),
403 ar.begin() +
static_cast<ptrdiff_t
>(index));
410 Delimiter delimiter_;
411 Predicate predicate_;
419using ByString = strings_internal::ByString;
420using ByChar = strings_internal::ByChar;
421using ByAnyChar = strings_internal::ByAnyChar;
422using ByLength = strings_internal::ByLength;
423using ByRepeatedWhitespace = strings_internal::ByRepeatedWhitespace;
424using ByRepeatedChar = strings_internal::ByRepeatedChar;
427using AllowEmpty = strings_internal::AllowEmpty;
428using SkipEmpty = strings_internal::SkipEmpty;
429using SkipWhitespace = strings_internal::SkipWhitespace;
432using strings_internal::Splitter;
435template <
typename Delimiter>
436inline strings_internal::MaxSplitsImpl<typename strings_internal::SelectDelimiter<Delimiter>::type>
438 using DelimiterType =
typename strings_internal::SelectDelimiter<Delimiter>::type;
任意字符分隔符
定义 StringSplitter.hpp:148
ASCII空白字符分隔符
定义 StringSplitter.hpp:89
字符分隔符
定义 StringSplitter.hpp:131
固定长度分隔符
定义 StringSplitter.hpp:165
重复字符分隔符
定义 StringSplitter.hpp:46
重复空白字符分隔符
定义 StringSplitter.hpp:66
字符串分隔符
定义 StringSplitter.hpp:100
最大分割次数分隔符
定义 StringSplitter.hpp:186
字符串分割迭代器
定义 StringSplitter.hpp:270
字符串分隔器
定义 StringSplitter.hpp:261
Iterator end() const
结束迭代器
定义 StringSplitter.hpp:364
Iterator begin() const
开始迭代器
定义 StringSplitter.hpp:359
strings_internal::MaxSplitsImpl< typename strings_internal::SelectDelimiter< Delimiter >::type > MaxSplits(Delimiter delimiter, int limit)
最大分割次数条件
定义 StringSplitter.hpp:437
定义 StringSplitter.hpp:205
定义 StringSplitter.hpp:230
定义 StringSplitter.hpp:209
定义 StringSplitter.hpp:213