From 127d168def2a8f74399784d05fa7f13773939665 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Sat, 21 Sep 2019 00:43:37 +0300 Subject: [PATCH] AK: Add a keep_empty argument to String[View]::substring{_view} --- AK/String.cpp | 8 ++++---- AK/String.h | 2 +- AK/StringView.cpp | 8 ++++---- AK/StringView.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/AK/String.cpp b/AK/String.cpp index df8005bd85..076271f3ac 100644 --- a/AK/String.cpp +++ b/AK/String.cpp @@ -110,7 +110,7 @@ Vector String::split_limit(const char separator, int limit) const return v; } -Vector String::split_view(const char separator) const +Vector String::split_view(const char separator, bool keep_empty) const { if (is_empty()) return {}; @@ -121,15 +121,15 @@ Vector String::split_view(const char separator) const char ch = characters()[i]; if (ch == separator) { int sublen = i - substart; - if (sublen != 0) + if (sublen != 0 || keep_empty) v.append(substring_view(substart, sublen)); substart = i + 1; } } int taillen = length() - substart; - if (taillen != 0) + if (taillen != 0 || keep_empty) v.append(substring_view(substart, taillen)); - if (characters()[length() - 1] == separator) + if (characters()[length() - 1] == separator && keep_empty) v.append(empty()); return v; } diff --git a/AK/String.h b/AK/String.h index 2b299841b9..0838d9b40e 100755 --- a/AK/String.h +++ b/AK/String.h @@ -114,7 +114,7 @@ public: Vector split(char separator) const; String substring(int start, int length) const; - Vector split_view(char separator) const; + Vector split_view(char separator, bool keep_empty = false) const; StringView substring_view(int start, int length) const; bool is_null() const { return !m_impl; } diff --git a/AK/StringView.cpp b/AK/StringView.cpp index 798fd50e3c..6db1b8f144 100644 --- a/AK/StringView.cpp +++ b/AK/StringView.cpp @@ -16,7 +16,7 @@ StringView::StringView(const ByteBuffer& buffer) { } -Vector StringView::split_view(const char separator) const +Vector StringView::split_view(const char separator, bool keep_empty) const { if (is_empty()) return {}; @@ -27,15 +27,15 @@ Vector StringView::split_view(const char separator) const char ch = characters_without_null_termination()[i]; if (ch == separator) { ssize_t sublen = i - substart; - if (sublen != 0) + if (sublen != 0 || keep_empty) v.append(substring_view(substart, sublen)); substart = i + 1; } } ssize_t taillen = length() - substart; - if (taillen != 0) + if (taillen != 0 || keep_empty) v.append(substring_view(substart, taillen)); - if (characters_without_null_termination()[length() - 1] == separator) + if (characters_without_null_termination()[length() - 1] == separator && keep_empty) v.append(String::empty()); return v; } diff --git a/AK/StringView.h b/AK/StringView.h index 181e26607f..00c9aaafa3 100644 --- a/AK/StringView.h +++ b/AK/StringView.h @@ -44,7 +44,7 @@ public: bool starts_with(const StringView&) const; StringView substring_view(int start, int length) const; - Vector split_view(char) const; + Vector split_view(char, bool keep_empty = false) const; // FIXME: These should be shared between String and StringView somehow! unsigned to_uint(bool& ok) const;