Explorar o código

Merge all RAM string adapters

Benoit Blanchon hai 1 ano
pai
achega
bee1095042

+ 2 - 2
src/ArduinoJson/Strings/Adapters/FlashString.hpp

@@ -34,7 +34,7 @@ class FlashString {
     return size_;
   }
 
-  friend bool stringEquals(FlashString a, SizedRamString b) {
+  friend bool stringEquals(FlashString a, RamString b) {
     ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey);
     ARDUINOJSON_ASSERT(!a.isNull());
     ARDUINOJSON_ASSERT(!b.isNull());
@@ -43,7 +43,7 @@ class FlashString {
     return ::memcmp_P(b.data(), a.str_, a.size_) == 0;
   }
 
-  friend int stringCompare(FlashString a, SizedRamString b) {
+  friend int stringCompare(FlashString a, RamString b) {
     ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey);
     ARDUINOJSON_ASSERT(!a.isNull());
     ARDUINOJSON_ASSERT(!b.isNull());

+ 2 - 15
src/ArduinoJson/Strings/Adapters/JsonString.hpp

@@ -10,25 +10,12 @@
 
 ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
 
-class JsonStringAdapter : public SizedRamString {
- public:
-  JsonStringAdapter(const JsonString& s)
-      : SizedRamString(s.c_str(), s.size()), linked_(s.isLinked()) {}
-
-  bool isLinked() const {
-    return linked_;
-  }
-
- private:
-  bool linked_;
-};
-
 template <>
 struct StringAdapter<JsonString> {
-  using AdaptedString = JsonStringAdapter;
+  using AdaptedString = RamString;
 
   static AdaptedString adapt(const JsonString& s) {
-    return AdaptedString(s);
+    return AdaptedString(s.c_str(), s.size(), s.isLinked());
   }
 };
 

+ 18 - 55
src/ArduinoJson/Strings/Adapters/RamString.hpp

@@ -17,18 +17,19 @@ template <typename T>
 struct IsChar
     : integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
 
-class ZeroTerminatedRamString {
+class RamString {
  public:
-  static const size_t typeSortKey = 3;
+  static const size_t typeSortKey = 2;
 
-  ZeroTerminatedRamString(const char* str) : str_(str) {}
+  RamString(const char* str, size_t sz, bool linked = false)
+      : str_(str), size_(sz), linked_(linked) {}
 
   bool isNull() const {
     return !str_;
   }
 
-  FORCE_INLINE size_t size() const {
-    return str_ ? ::strlen(str_) : 0;
+  size_t size() const {
+    return size_;
   }
 
   char operator[](size_t i) const {
@@ -42,85 +43,47 @@ class ZeroTerminatedRamString {
   }
 
   bool isLinked() const {
-    return false;
+    return linked_;
   }
 
  protected:
   const char* str_;
+  size_t size_;
+  bool linked_;  // TODO: merge with size_
 };
 
 template <typename TChar>
 struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
-  using AdaptedString = ZeroTerminatedRamString;
+  using AdaptedString = RamString;
 
   static AdaptedString adapt(const TChar* p) {
-    return AdaptedString(reinterpret_cast<const char*>(p));
+    auto str = reinterpret_cast<const char*>(p);
+    return AdaptedString(str, str ? ::strlen(str) : 0);
   }
 };
 
 template <typename TChar, size_t N>
 struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
-  using AdaptedString = ZeroTerminatedRamString;
+  using AdaptedString = RamString;
 
   static AdaptedString adapt(const TChar* p) {
-    return AdaptedString(reinterpret_cast<const char*>(p));
-  }
-};
-
-class StaticStringAdapter : public ZeroTerminatedRamString {
- public:
-  StaticStringAdapter(const char* str) : ZeroTerminatedRamString(str) {}
-
-  bool isLinked() const {
-    return true;
+    auto str = reinterpret_cast<const char*>(p);
+    return AdaptedString(str, str ? ::strlen(str) : 0);
   }
 };
 
 template <>
 struct StringAdapter<const char*, void> {
-  using AdaptedString = StaticStringAdapter;
+  using AdaptedString = RamString;
 
   static AdaptedString adapt(const char* p) {
-    return AdaptedString(p);
-  }
-};
-
-class SizedRamString {
- public:
-  static const size_t typeSortKey = 2;
-
-  SizedRamString(const char* str, size_t sz) : str_(str), size_(sz) {}
-
-  bool isNull() const {
-    return !str_;
-  }
-
-  size_t size() const {
-    return size_;
-  }
-
-  char operator[](size_t i) const {
-    ARDUINOJSON_ASSERT(str_ != 0);
-    ARDUINOJSON_ASSERT(i <= size());
-    return str_[i];
-  }
-
-  const char* data() const {
-    return str_;
-  }
-
-  bool isLinked() const {
-    return false;
+    return AdaptedString(p, p ? ::strlen(p) : 0, true);
   }
-
- protected:
-  const char* str_;
-  size_t size_;
 };
 
 template <typename TChar>
 struct SizedStringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
-  using AdaptedString = SizedRamString;
+  using AdaptedString = RamString;
 
   static AdaptedString adapt(const TChar* p, size_t n) {
     return AdaptedString(reinterpret_cast<const char*>(p), n);

+ 1 - 1
src/ArduinoJson/Strings/Adapters/StringObject.hpp

@@ -15,7 +15,7 @@ struct StringAdapter<
     T,
     enable_if_t<(string_traits<T>::has_cstr || string_traits<T>::has_data) &&
                 (string_traits<T>::has_length || string_traits<T>::has_size)>> {
-  using AdaptedString = SizedRamString;
+  using AdaptedString = RamString;
 
   static AdaptedString adapt(const T& s) {
     return AdaptedString(get_data(s), get_size(s));