123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #include <AK/String.h>
- #include <AK/StringView.h>
- namespace AK {
- StringView::StringView(const String& string)
- : m_impl(string.impl())
- , m_characters(string.characters())
- , m_length(string.length())
- {
- }
- StringView::StringView(const ByteBuffer& buffer)
- : m_characters((const char*)buffer.data())
- , m_length(buffer.size())
- {
- }
- Vector<StringView> StringView::split_view(const char separator) const
- {
- if (is_empty())
- return {};
- Vector<StringView> v;
- ssize_t substart = 0;
- for (ssize_t i = 0; i < length(); ++i) {
- char ch = characters_without_null_termination()[i];
- if (ch == separator) {
- ssize_t sublen = i - substart;
- if (sublen != 0)
- v.append(substring_view(substart, sublen));
- substart = i + 1;
- }
- }
- ssize_t taillen = length() - substart;
- if (taillen != 0)
- v.append(substring_view(substart, taillen));
- if (characters_without_null_termination()[length() - 1] == separator)
- v.append(String::empty());
- return v;
- }
- bool StringView::starts_with(const StringView& str) const
- {
- if (str.is_empty())
- return true;
- if (is_empty())
- return false;
- if (str.length() > length())
- return false;
- if (characters_without_null_termination() == str.characters_without_null_termination())
- return true;
- return !memcmp(characters_without_null_termination(), str.characters_without_null_termination(), str.length());
- }
- StringView StringView::substring_view(int start, int length) const
- {
- if (!length)
- return {};
- ASSERT(start + length <= m_length);
- return { m_characters + start, length };
- }
- StringView StringView::substring_view_starting_from_substring(const StringView& substring) const
- {
- const char* remaining_characters = substring.characters_without_null_termination();
- ASSERT(remaining_characters >= m_characters);
- ASSERT(remaining_characters <= m_characters + m_length);
- int remaining_length = m_length - (remaining_characters - m_characters);
- return { remaining_characters, remaining_length };
- }
- StringView StringView::substring_view_starting_after_substring(const StringView& substring) const
- {
- const char* remaining_characters = substring.characters_without_null_termination() + substring.length();
- ASSERT(remaining_characters >= m_characters);
- ASSERT(remaining_characters <= m_characters + m_length);
- int remaining_length = m_length - (remaining_characters - m_characters);
- return { remaining_characters, remaining_length };
- }
- int StringView::to_int(bool& ok) const
- {
- bool negative = false;
- int value = 0;
- int i = 0;
- if (is_empty()) {
- ok = false;
- return 0;
- }
- if (characters_without_null_termination()[0] == '-') {
- i++;
- negative = true;
- }
- for (; i < length(); i++) {
- if (characters_without_null_termination()[i] < '0' || characters_without_null_termination()[i] > '9') {
- ok = false;
- return 0;
- }
- value = value * 10;
- value += characters_without_null_termination()[i] - '0';
- }
- ok = true;
- return negative ? -value : value;
- }
- unsigned StringView::to_uint(bool& ok) const
- {
- unsigned value = 0;
- for (ssize_t i = 0; i < length(); ++i) {
- if (characters_without_null_termination()[i] < '0' || characters_without_null_termination()[i] > '9') {
- ok = false;
- return 0;
- }
- value = value * 10;
- value += characters_without_null_termination()[i] - '0';
- }
- ok = true;
- return value;
- }
- unsigned StringView::hash() const
- {
- if (is_empty())
- return 0;
- if (m_impl)
- return m_impl->hash();
- return string_hash(characters_without_null_termination(), length());
- }
- }
|