/* Arduino Stream from a generic generic byte range Implementation of the Print is taken by reference and will be proxied Copyright (C) 2020 by Maxim Prokhorov */ #include #include #include #pragma once template struct StreamAdapter final : public Stream { StreamAdapter(Print& writer, T&& begin, T&& end) : _writer(writer), _current(std::forward(begin)), _begin(std::forward(begin)), _end(std::forward(end)) {} int available() override { return (_end - _current); } int peek() override { if (available() && (_end != (1 + _current))) { return *(1 + _current); } return -1; } int read() override { if (_end != _current) { return *(_current++); } return -1; } void flush() override { // 2.3.0 - Stream::flush() // latest - Print::flush() #if not defined(ARDUINO_ESP8266_RELEASE_2_3_0) _writer.flush(); #endif } size_t write(const uint8_t* buffer, size_t size) override { return _writer.write(buffer, size); } size_t write(uint8_t ch) override { return _writer.write(ch); } private: Print& _writer; T _current; T const _begin; T const _end; };