🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
StringSplitter.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "StringView.hpp"
25#include <vector>
26#include <cctype>
27
28AST_NAMESPACE_BEGIN
29
36namespace strings_internal {
37
38// 基础分隔符概念
40 StringView Find(StringView text, size_t pos) const {
41 return StringView();
42 }
43};
44
47public:
48 explicit ByRepeatedChar(char c) : c_(c) {}
49
50 StringView Find(StringView text, size_t pos) const {
51 size_t start = text.find(c_, pos);
52 if (start == StringView::npos) {
53 return StringView(text.data() + text.size(), 0); // 未找到
54 }
55 size_t end = start;
56 while (end < text.size() && text[end] == c_) {
57 ++end;
58 }
59 return text.substr(start, end - start);
60 }
61private:
62 char c_;
63};
64
67public:
68 StringView Find(StringView text, size_t pos) const {
69 // 查找第一个空白字符
70 while (pos < text.size()) {
71 if(std::isspace(static_cast<unsigned char>(text[pos])))
72 {
73 size_t start = pos;
74 // 连续跳过所有空白字符
75 while (pos < text.size() && std::isspace(static_cast<unsigned char>(text[pos]))) {
76 ++pos;
77 }
78 return text.substr(start, pos - start);
79 }
80 ++pos;
81 }
82 // 未找到分隔符,返回文本末尾的空视图
83 return StringView(text.data() + text.size(), 0);
84 }
85};
86
89 {
90public:
91 StringView Find(StringView text, size_t pos) const {
92 while(pos < text.size() && std::isspace(static_cast<unsigned char>(text[pos]))) {
93 pos++;
94 }
95 return text.substr(pos, 1);
96 }
97};
98
100class ByString {
101public:
102 explicit ByString(StringView sp)
103 : delimiter_(sp) {}
104
105 StringView Find(StringView text, size_t pos) const {
106 if(delimiter_.empty())
107 {
108 return text.substr(pos + 1, 0);
109 }
110 else if(delimiter_.size() == 1)
111 {
112 auto found = text.find(delimiter_[0], pos);
113 if (found == StringView::npos) {
114 return text.substr(text.size());
115 }
116 return text.substr(found, 1);
117 }
118 else{
119 auto found = text.find(delimiter_, pos);
120 if (found == StringView::npos) {
121 return text.substr(text.size());
122 }
123 return text.substr(found, delimiter_.size());
124 }
125 }
126private:
127 StringView delimiter_;
128};
129
131class ByChar {
132public:
133 explicit ByChar(char c) : c_(c) {}
134
135 StringView Find(StringView text, size_t pos) const {
136 auto found = text.find(c_, pos);
137 if (found == StringView::npos) {
138 return StringView(text.data() + text.size(), 0);
139 }
140 return text.substr(found, 1);
141 }
142
143private:
144 char c_;
145};
146
149public:
150 explicit ByAnyChar(StringView sp) : delimiters_(sp) {}
151
152 StringView Find(StringView text, size_t pos) const {
153 auto found = text.find_first_of(delimiters_, pos);
154 if (found == StringView::npos) {
155 return StringView(text.data() + text.size(), 0);
156 }
157 return text.substr(found, 1);
158 }
159
160private:
161 StringView delimiters_;
162};
163
165class ByLength {
166public:
167 explicit ByLength(std::ptrdiff_t length) : length_(length) {}
168
169 StringView Find(StringView text, size_t pos) const {
170 if (pos >= text.size()) {
171 return text.substr(text.size());
172 }
173 size_t end = pos + length_;
174 if (end > text.size()) {
175 end = text.size();
176 }
177 return text.substr(end, 0);
178 }
179
180private:
181 const std::ptrdiff_t length_;
182};
183
185template <typename Delimiter>
187public:
188 MaxSplitsImpl(Delimiter delimiter, int limit)
189 : delimiter_(std::move(delimiter)), limit_(limit), count_(0) {}
190
191 StringView Find(StringView text, size_t pos) {
192 if (count_++ == limit_) {
193 return StringView(text.data() + text.size(), 0);
194 }
195 return delimiter_.Find(text, pos);
196 }
197
198private:
199 Delimiter delimiter_;
200 const int limit_;
201 int count_;
202};
203
204// 谓词概念
206 bool operator()(StringView) const { return true; }
207};
208
209struct SkipEmpty {
210 bool operator()(StringView sp) const { return !sp.empty(); }
211};
212
214 bool operator()(StringView sp) const {
215 // 手动实现跳过空白字符的逻辑
216 size_t start = 0;
217 while (start < sp.size()) {
218 char c = sp[start];
219 if (c != ' ' && c != '\t' && c != '\n' && c != '\r' && c != '\f' && c != '\v') {
220 break;
221 }
222 start++;
223 }
224 return start < sp.size();
225 }
226};
227
228// 选择分隔符类型的元函数
229template <typename Delimiter>
231 using type = Delimiter;
232};
233
234template <>
235struct SelectDelimiter<char> {
236 using type = ByChar;
237};
238
239template <>
240struct SelectDelimiter<const char*> {
241 using type = ByString;
242};
243
244template <>
246 using type = ByString;
247};
248
249template <>
250struct SelectDelimiter<std::string> {
251 using type = ByString;
252};
253
260template <typename Delimiter, typename Predicate, typename StringType=StringView>
261class Splitter {
262public:
263 Splitter(StringView text, Delimiter delimiter, Predicate predicate)
264 : text_(std::move(text))
265 , delimiter_(std::move(delimiter))
266 , predicate_(std::move(predicate))
267 {}
268
270 class Iterator {
271 public:
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;
277
278 Iterator(const Splitter* splitter, std::nullptr_t)
279 : splitter_(splitter)
280 , delimiter_(splitter_->delimiter_)
281 , predicate_(splitter_->predicate_)
282 , current_{nullptr, StringType::npos}
283 , pos_(0)
284 {
285
286 }
287
288 Iterator(const Splitter* splitter)
289 : splitter_(splitter)
290 , delimiter_(splitter_->delimiter_)
291 , predicate_(splitter_->predicate_)
292 , current_{}
293 , pos_(0)
294 {
295 advance();
296 }
297
298 reference operator*() const {
299 return current_;
300 }
301
302 pointer operator->() const {
303 return &current_;
304 }
305
306 Iterator& operator++() {
307 advance();
308 return *this;
309 }
310
311 Iterator operator++(int) {
312 Iterator tmp = *this;
313 ++(*this);
314 return tmp;
315 }
316
317 bool operator==(const Iterator& other) const {
318 return current_.data() == other.current_.data();
319 }
320
321 bool operator!=(const Iterator& other) const {
322 return !(*this == other);
323 }
324 bool at_end() const {
325 return current_.size() == StringType::npos;
326 }
327
328 private:
329 void advance() {
330 do{
331 if(at_end()) {
332 return;
333 }
334 if(current_.end() == splitter_->text_.end()) {
335 current_ = {nullptr, StringType::npos};
336 return;
337 }else{
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();
346 }
347 }while(!predicate_(current_));
348 }
349
350 const Splitter* splitter_;
351 Delimiter delimiter_;
352 Predicate predicate_;
353 StringType current_;
354 size_t pos_;
355 };
356 // end of iterator
357
359 Iterator begin() const {
360 return Iterator(this);
361 }
362
364 Iterator end() const {
365 return Iterator(this, nullptr);
366 }
367
369 template <typename Container>
370 operator Container() const {
371 Container result;
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);
376 }
377 return result;
378 }
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());
383 }
385 operator std::vector<StringView>() const {
386 struct raw_view {
387 const char* data;
388 size_t size;
389 operator StringView() const {
390 return {data, size};
391 }
392 };
393 std::vector<StringView> v;
394 std::array<raw_view, 16> ar;
395 for (auto it = this->begin(); !it.at_end();) {
396 size_t index = 0;
397 do {
398 ar[index].data = it->data();
399 ar[index].size = it->size();
400 ++it;
401 } while (++index != ar.size() && !it.at_end());
402 v.insert(v.end(), ar.begin(),
403 ar.begin() + static_cast<ptrdiff_t>(index));
404 }
405 return v;
406 }
407
408private:
409 StringType text_;
410 Delimiter delimiter_;
411 Predicate predicate_;
412};
413
414} // namespace strings_internal
415
416
417
418// 分隔符类型
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;
425
426// 谓词类型
427using AllowEmpty = strings_internal::AllowEmpty;
428using SkipEmpty = strings_internal::SkipEmpty;
429using SkipWhitespace = strings_internal::SkipWhitespace;
430
431// 字符串分割器
432using strings_internal::Splitter;
433
435template <typename Delimiter>
436inline strings_internal::MaxSplitsImpl<typename strings_internal::SelectDelimiter<Delimiter>::type>
437MaxSplits(Delimiter delimiter, int limit) {
438 using DelimiterType = typename strings_internal::SelectDelimiter<Delimiter>::type;
439 return strings_internal::MaxSplitsImpl<DelimiterType>(DelimiterType(delimiter), limit);
440}
441
442
443
446AST_NAMESPACE_END
任意字符分隔符
定义 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:39
定义 StringSplitter.hpp:230
定义 StringSplitter.hpp:209
定义 StringSplitter.hpp:213