From e07f50c39860ec006a7110dc13ea7001a6a54fc9 Mon Sep 17 00:00:00 2001 From: howar6hill Date: Tue, 10 Mar 2020 16:13:29 +0800 Subject: [PATCH] AK: Add begin() and end() to String and StringView Now it's possible to use range-based for loops with String and StringView. --- AK/String.h | 10 +++++++--- AK/StringImpl.h | 4 ++-- AK/StringView.h | 7 ++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/AK/String.h b/AK/String.h index c01c771219a..a77799c0c16 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 1e8d1082f66..1698d639847 100644 --- a/AK/StringImpl.h +++ b/AK/StringImpl.h @@ -26,8 +26,8 @@ #pragma once -#include #include +#include #include #include @@ -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 41e7e7e652d..a5c1bab2b01 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;