StringView.split() should use an iterator design pattern instead of allocating a...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Jan 2017 17:44:50 +0000 (17:44 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 24 Jan 2017 17:44:50 +0000 (17:44 +0000)
commit3f99945cd8f5998d2bf58de14943b21dc59f6983
tree8cabef40c259253e015ad6368a5c3891f99fa3f6
parent890f8d25cea5966e6b7699ccf8d8b2db75a9cbed
StringView.split() should use an iterator design pattern instead of allocating a Vector
https://bugs.webkit.org/show_bug.cgi?id=163225

Reviewed by Darin Adler.

Source/WebCore:

Update code to use the new iterator-style StringView.split().

* platform/URLParser.cpp:

Source/WTF:

Implement StringView.split() using an iterator design.

Using an iterator design avoids the need to allocate a Vector of StringView objects,
which is space-inefficient and error prone as the returned Vector may outlive the
lifetime of the underlying string associated with the split (as StringView is a non-
owning reference to a string).

StringView.split() now returns a StringView::SplitResult object that implements begin()/end()
to support iterating over StringView substrings delimited by the specified separator
character. For example, to iterate over the 'c'-separated substrings of a StringView v,
you can write:

for (StringView substring : v.split('c'))
    // Do something with substring.

* wtf/text/StringView.cpp:
(WTF::StringView::SplitResult::Iterator::findNextSubstring): Advances the iterator to point to the
next substring.
(WTF::StringView::split): Modified to return a SplitResult::Iterator object instead of a Vector<StringView>.
* wtf/text/StringView.h:
(WTF::StringView::SplitResult::SplitResult):
(WTF::StringView::SplitResult::Iterator::Iterator):
(WTF::StringView::SplitResult::Iterator::operator*):
(WTF::StringView::SplitResult::Iterator::operator==):
(WTF::StringView::SplitResult::Iterator::operator!=):
Implements the iterator interface.

Tools:

Add unit tests for StringView.split().

* TestWebKitAPI/Tests/WTF/StringView.cpp:
(TestWebKitAPI::stringViewFromLiteral): Moved to the top of the file so that it can be
used in the StringView.split() unit tests.
(TestWebKitAPI::stringViewFromUTF8): Ditto.
(TestWebKitAPI::vectorFromSplitResult): Convenience function to convert a StringView::SplitResult
object to a Vector of String objects.
(TestWebKitAPI::TEST): Added the following tests:
    - WTF.StringViewSplitEmptyAndNullStrings
    - WTF.StringViewSplitBasic
    - WTF.StringViewSplitWithConsecutiveSeparators

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@211087 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/WTF/ChangeLog
Source/WTF/wtf/text/StringView.cpp
Source/WTF/wtf/text/StringView.h
Source/WebCore/ChangeLog
Source/WebCore/platform/URLParser.cpp
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WTF/StringView.cpp