summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorhowar6hill <f.eiwu@yahoo.com>2020-03-10 16:13:29 +0800
committerAndreas Kling <kling@serenityos.org>2020-03-10 10:25:21 +0100
commite07f50c39860ec006a7110dc13ea7001a6a54fc9 (patch)
treeebe170954e6b364adc6efbe5d80d821581ccfef5 /AK
parenta0e18f4450d788785d75633bb45279ed33f8ceaf (diff)
downloadserenity-e07f50c39860ec006a7110dc13ea7001a6a54fc9.zip
AK: Add begin() and end() to String and StringView
Now it's possible to use range-based for loops with String and StringView.
Diffstat (limited to 'AK')
-rw-r--r--AK/String.h10
-rw-r--r--AK/StringImpl.h4
-rw-r--r--AK/StringView.h7
3 files changed, 15 insertions, 6 deletions
diff --git a/AK/String.h b/AK/String.h
index c01c771219..a77799c0c1 100644
--- a/AK/String.h
+++ b/AK/String.h
@@ -57,6 +57,8 @@ namespace AK {
class String {
public:
+ using ConstIterator = const char*;
+
~String() {}
String() {}
@@ -144,12 +146,14 @@ public:
bool is_empty() const { return length() == 0; }
size_t length() const { return m_impl ? m_impl->length() : 0; }
const char* characters() const { return m_impl ? m_impl->characters() : nullptr; }
- char operator[](size_t i) const
+ const char& operator[](size_t i) const
{
- ASSERT(m_impl);
return (*m_impl)[i];
}
+ ConstIterator begin() const { return characters(); }
+ ConstIterator end() const { return begin() + length(); }
+
bool starts_with(const StringView&) const;
bool ends_with(const StringView&) const;
bool starts_with(char) const;
@@ -302,5 +306,5 @@ String escape_html_entities(const StringView& html);
}
using AK::CaseInsensitiveStringTraits;
-using AK::String;
using AK::escape_html_entities;
+using AK::String;
diff --git a/AK/StringImpl.h b/AK/StringImpl.h
index 1e8d1082f6..1698d63984 100644
--- a/AK/StringImpl.h
+++ b/AK/StringImpl.h
@@ -26,8 +26,8 @@
#pragma once
-#include <AK/RefPtr.h>
#include <AK/RefCounted.h>
+#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <AK/kmalloc.h>
@@ -57,7 +57,7 @@ public:
size_t length() const { return m_length; }
const char* characters() const { return &m_inline_buffer[0]; }
- char operator[](size_t i) const
+ const char& operator[](size_t i) const
{
ASSERT(i < m_length);
return characters()[i];
diff --git a/AK/StringView.h b/AK/StringView.h
index 41e7e7e652..a5c1bab2b0 100644
--- a/AK/StringView.h
+++ b/AK/StringView.h
@@ -34,6 +34,8 @@ namespace AK {
class StringView {
public:
+ using ConstIterator = const char*;
+
StringView() {}
StringView(const char* characters, size_t length)
: m_characters(characters)
@@ -58,7 +60,10 @@ public:
bool is_empty() const { return m_length == 0; }
const char* characters_without_null_termination() const { return m_characters; }
size_t length() const { return m_length; }
- char operator[](size_t index) const { return m_characters[index]; }
+ const char& operator[](size_t index) const { return m_characters[index]; }
+
+ ConstIterator begin() const { return characters_without_null_termination(); }
+ ConstIterator end() const { return begin() + length(); }
unsigned hash() const;