mirror of
				https://github.com/bblanchon/ArduinoJson.git
				synced 2025-11-04 00:21:36 +01:00 
			
		
		
		
	Merge all RAM string adapters
This commit is contained in:
		@@ -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());
 | 
			
		||||
 
 | 
			
		||||
@@ -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());
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -17,79 +17,12 @@ template <typename T>
 | 
			
		||||
struct IsChar
 | 
			
		||||
    : integral_constant<bool, is_integral<T>::value && sizeof(T) == 1> {};
 | 
			
		||||
 | 
			
		||||
class ZeroTerminatedRamString {
 | 
			
		||||
 public:
 | 
			
		||||
  static const size_t typeSortKey = 3;
 | 
			
		||||
 | 
			
		||||
  ZeroTerminatedRamString(const char* str) : str_(str) {}
 | 
			
		||||
 | 
			
		||||
  bool isNull() const {
 | 
			
		||||
    return !str_;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  FORCE_INLINE size_t size() const {
 | 
			
		||||
    return str_ ? ::strlen(str_) : 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 protected:
 | 
			
		||||
  const char* str_;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename TChar>
 | 
			
		||||
struct StringAdapter<TChar*, enable_if_t<IsChar<TChar>::value>> {
 | 
			
		||||
  using AdaptedString = ZeroTerminatedRamString;
 | 
			
		||||
 | 
			
		||||
  static AdaptedString adapt(const TChar* p) {
 | 
			
		||||
    return AdaptedString(reinterpret_cast<const char*>(p));
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename TChar, size_t N>
 | 
			
		||||
struct StringAdapter<TChar[N], enable_if_t<IsChar<TChar>::value>> {
 | 
			
		||||
  using AdaptedString = ZeroTerminatedRamString;
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
struct StringAdapter<const char*, void> {
 | 
			
		||||
  using AdaptedString = StaticStringAdapter;
 | 
			
		||||
 | 
			
		||||
  static AdaptedString adapt(const char* p) {
 | 
			
		||||
    return AdaptedString(p);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class SizedRamString {
 | 
			
		||||
class RamString {
 | 
			
		||||
 public:
 | 
			
		||||
  static const size_t typeSortKey = 2;
 | 
			
		||||
 | 
			
		||||
  SizedRamString(const char* str, size_t sz) : str_(str), size_(sz) {}
 | 
			
		||||
  RamString(const char* str, size_t sz, bool linked = false)
 | 
			
		||||
      : str_(str), size_(sz), linked_(linked) {}
 | 
			
		||||
 | 
			
		||||
  bool isNull() const {
 | 
			
		||||
    return !str_;
 | 
			
		||||
@@ -110,17 +43,47 @@ class SizedRamString {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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 = RamString;
 | 
			
		||||
 | 
			
		||||
  static AdaptedString adapt(const TChar* 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 = RamString;
 | 
			
		||||
 | 
			
		||||
  static AdaptedString adapt(const TChar* p) {
 | 
			
		||||
    auto str = reinterpret_cast<const char*>(p);
 | 
			
		||||
    return AdaptedString(str, str ? ::strlen(str) : 0);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <>
 | 
			
		||||
struct StringAdapter<const char*, void> {
 | 
			
		||||
  using AdaptedString = RamString;
 | 
			
		||||
 | 
			
		||||
  static AdaptedString adapt(const char* p) {
 | 
			
		||||
    return AdaptedString(p, p ? ::strlen(p) : 0, true);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user