- /*
-
- 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 <prokhorov dot max at outlook dot com>
-
- */
-
- #include <Arduino.h>
- #include <core_version.h>
-
- #include <memory>
-
- #pragma once
-
- template <typename T>
- struct StreamAdapter final : public Stream {
- StreamAdapter(Print& writer, T&& begin, T&& end) :
- _writer(writer),
- _current(std::forward<T>(begin)),
- _begin(std::forward<T>(begin)),
- _end(std::forward<T>(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;
- };
-
|