// ArduinoJson - arduinojson.org // Copyright Benoit Blanchon 2014-2019 // MIT License #pragma once #include #include namespace ARDUINOJSON_NAMESPACE { template struct IsCharOrVoid { static const bool value = is_same::value || is_same::value || is_same::value || is_same::value; }; template struct IsCharOrVoid : IsCharOrVoid {}; class UnsafeCharPointerReader { const char* _ptr; public: explicit UnsafeCharPointerReader(const char* ptr) : _ptr(ptr ? ptr : reinterpret_cast("")) {} int read() { return static_cast(*_ptr++); } size_t readBytes(char* buffer, size_t length) { for (size_t i = 0; i < length; i++) buffer[i] = *_ptr++; return length; } }; class SafeCharPointerReader : public IteratorReader { public: explicit SafeCharPointerReader(const char* ptr, size_t len) : IteratorReader(ptr, ptr + len) {} }; template inline typename enable_if::value, UnsafeCharPointerReader>::type makeReader(TChar* input) { return UnsafeCharPointerReader(reinterpret_cast(input)); } template inline typename enable_if::value, SafeCharPointerReader>::type makeReader(TChar* input, size_t n) { return SafeCharPointerReader(reinterpret_cast(input), n); } #if ARDUINOJSON_ENABLE_ARDUINO_STRING inline SafeCharPointerReader makeReader(const ::String& input) { return SafeCharPointerReader(input.c_str(), input.length()); } #endif } // namespace ARDUINOJSON_NAMESPACE