// ArduinoJson - arduinojson.org // Copyright Benoit Blanchon 2014-2019 // MIT License #pragma once 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("")) {} char read() { return static_cast(*_ptr++); } bool ended() const { // we cannot know, that's why it's unsafe return false; } }; class SafeCharPointerReader { const char* _ptr; const char* _end; public: explicit SafeCharPointerReader(const char* ptr, size_t len) : _ptr(ptr ? ptr : reinterpret_cast("")), _end(_ptr + len) {} char read() { return static_cast(*_ptr++); } bool ended() const { return _ptr == _end; } }; 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