StringView.cpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <AK/AKString.h>
  2. #include <AK/StringView.h>
  3. namespace AK {
  4. StringView::StringView(const String& string)
  5. : m_impl(string.impl())
  6. , m_characters(string.characters())
  7. , m_length(string.length())
  8. {
  9. }
  10. Vector<StringView> StringView::split_view(const char separator) const
  11. {
  12. if (is_empty())
  13. return {};
  14. Vector<StringView> v;
  15. ssize_t substart = 0;
  16. for (ssize_t i = 0; i < length(); ++i) {
  17. char ch = characters()[i];
  18. if (ch == separator) {
  19. ssize_t sublen = i - substart;
  20. if (sublen != 0)
  21. v.append(substring_view(substart, sublen));
  22. substart = i + 1;
  23. }
  24. }
  25. ssize_t taillen = length() - substart;
  26. if (taillen != 0)
  27. v.append(substring_view(substart, taillen));
  28. if (characters()[length() - 1] == separator)
  29. v.append(String::empty());
  30. return v;
  31. }
  32. StringView StringView::substring_view(int start, int length) const
  33. {
  34. if (!length)
  35. return {};
  36. ASSERT(start + length <= m_length);
  37. return { m_characters + start, length };
  38. }
  39. StringView StringView::substring_view_starting_from_substring(const StringView& substring) const
  40. {
  41. const char* remaining_characters = substring.characters();
  42. ASSERT(remaining_characters >= m_characters);
  43. ASSERT(remaining_characters <= m_characters + m_length);
  44. int remaining_length = m_length - (remaining_characters - m_characters);
  45. return { remaining_characters, remaining_length };
  46. }
  47. StringView StringView::substring_view_starting_after_substring(const StringView& substring) const
  48. {
  49. const char* remaining_characters = substring.characters() + substring.length();
  50. ASSERT(remaining_characters >= m_characters);
  51. ASSERT(remaining_characters <= m_characters + m_length);
  52. int remaining_length = m_length - (remaining_characters - m_characters);
  53. return { remaining_characters, remaining_length };
  54. }
  55. unsigned StringView::to_uint(bool& ok) const
  56. {
  57. unsigned value = 0;
  58. for (ssize_t i = 0; i < length(); ++i) {
  59. if (characters()[i] < '0' || characters()[i] > '9') {
  60. ok = false;
  61. return 0;
  62. }
  63. value = value * 10;
  64. value += characters()[i] - '0';
  65. }
  66. ok = true;
  67. return value;
  68. }
  69. }