Use string_view as input type for internal string utilities

Bug: None
Change-Id: I2bfdaf4e7fac109842cc9fde8dfa28ab4961c3fd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/232127
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35022}
diff --git a/rtc_base/string_encode.cc b/rtc_base/string_encode.cc
index 3b41076..364eaa0 100644
--- a/rtc_base/string_encode.cc
+++ b/rtc_base/string_encode.cc
@@ -152,7 +152,7 @@
                                    source.length(), delimiter);
 }
 
-size_t tokenize(const std::string& source,
+size_t tokenize(absl::string_view source,
                 char delimiter,
                 std::vector<std::string>* fields) {
   fields->clear();
@@ -160,18 +160,18 @@
   for (size_t i = 0; i < source.length(); ++i) {
     if (source[i] == delimiter) {
       if (i != last) {
-        fields->push_back(source.substr(last, i - last));
+        fields->emplace_back(source.substr(last, i - last));
       }
       last = i + 1;
     }
   }
   if (last != source.length()) {
-    fields->push_back(source.substr(last, source.length() - last));
+    fields->emplace_back(source.substr(last, source.length() - last));
   }
   return fields->size();
 }
 
-bool tokenize_first(const std::string& source,
+bool tokenize_first(absl::string_view source,
                     const char delimiter,
                     std::string* token,
                     std::string* rest) {
@@ -183,12 +183,12 @@
 
   // Look for additional occurrances of delimiter.
   size_t right_pos = left_pos + 1;
-  while (source[right_pos] == delimiter) {
+  while (right_pos < source.size() && source[right_pos] == delimiter) {
     right_pos++;
   }
 
-  *token = source.substr(0, left_pos);
-  *rest = source.substr(right_pos);
+  *token = std::string(source.substr(0, left_pos));
+  *rest = std::string(source.substr(right_pos));
   return true;
 }
 
@@ -214,7 +214,7 @@
   return joined_string;
 }
 
-size_t split(const std::string& source,
+size_t split(absl::string_view source,
              char delimiter,
              std::vector<std::string>* fields) {
   RTC_DCHECK(fields);
@@ -222,11 +222,11 @@
   size_t last = 0;
   for (size_t i = 0; i < source.length(); ++i) {
     if (source[i] == delimiter) {
-      fields->push_back(source.substr(last, i - last));
+      fields->emplace_back(source.substr(last, i - last));
       last = i + 1;
     }
   }
-  fields->push_back(source.substr(last, source.length() - last));
+  fields->emplace_back(source.substr(last));
   return fields->size();
 }
 
diff --git a/rtc_base/string_encode.h b/rtc_base/string_encode.h
index 577c45f..356fdfa 100644
--- a/rtc_base/string_encode.h
+++ b/rtc_base/string_encode.h
@@ -17,6 +17,7 @@
 #include <type_traits>
 #include <vector>
 
+#include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/string_to_number.h"
@@ -62,20 +63,20 @@
 
 // Splits the source string into multiple fields separated by delimiter,
 // with duplicates of delimiter creating empty fields.
-size_t split(const std::string& source,
+size_t split(absl::string_view source,
              char delimiter,
              std::vector<std::string>* fields);
 
 // Splits the source string into multiple fields separated by delimiter,
 // with duplicates of delimiter ignored.  Trailing delimiter ignored.
-size_t tokenize(const std::string& source,
+size_t tokenize(absl::string_view source,
                 char delimiter,
                 std::vector<std::string>* fields);
 
 // Extract the first token from source as separated by delimiter, with
 // duplicates of delimiter ignored. Return false if the delimiter could not be
 // found, otherwise return true.
-bool tokenize_first(const std::string& source,
+bool tokenize_first(absl::string_view source,
                     const char delimiter,
                     std::string* token,
                     std::string* rest);