From b1b661509e38a4328a6f3c1f4196d5c686b6efe3 Mon Sep 17 00:00:00 2001
From: Mathieu Carbou <mathieu.carbou@gmail.com>
Date: Wed, 9 Apr 2025 00:05:22 +0200
Subject: [PATCH] fix(core): StreamString performance improvements

---
 cores/esp32/StreamString.cpp | 15 +++------------
 cores/esp32/StreamString.h   |  4 ++++
 2 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/cores/esp32/StreamString.cpp b/cores/esp32/StreamString.cpp
index d0117c399eb..cad3ea6e522 100644
--- a/cores/esp32/StreamString.cpp
+++ b/cores/esp32/StreamString.cpp
@@ -41,24 +41,15 @@ size_t StreamString::write(uint8_t data) {
 }
 
 int StreamString::available() {
-  return length();
+  return length() - _start;
 }
 
 int StreamString::read() {
-  if (length()) {
-    char c = charAt(0);
-    remove(0, 1);
-    return c;
-  }
-  return -1;
+  return available() ? charAt(_start++) : -1;
 }
 
 int StreamString::peek() {
-  if (length()) {
-    char c = charAt(0);
-    return c;
-  }
-  return -1;
+  return available() ? charAt(_start) : -1;
 }
 
 void StreamString::flush() {}
diff --git a/cores/esp32/StreamString.h b/cores/esp32/StreamString.h
index b4f20147277..39df96afb2d 100644
--- a/cores/esp32/StreamString.h
+++ b/cores/esp32/StreamString.h
@@ -33,6 +33,10 @@ class StreamString : public Stream, public String {
   int read() override;
   int peek() override;
   void flush() override;
+
+private:
+  // read position
+  unsigned int _start = 0;
 };
 
 #endif /* STREAMSTRING_H_ */