PrintBuffer.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * PrintBuffer.h
8  *
9  ****/
10 
11 #pragma once
12 
14 #include <memory>
15 
22 class BasePrintBuffer : public Print
23 {
24 public:
31  BasePrintBuffer(Print& output, uint8_t buffer[], size_t bufferSize)
32  : output(output), buffer(buffer), bufferSize(bufferSize)
33  {
34  }
35 
37  {
38  flush();
39  }
40 
41  size_t write(uint8_t c) override;
42 
43  size_t write(const uint8_t* data, size_t size) override;
44 
48  void flush();
49 
50 private:
51  Print& output;
52  uint8_t* buffer;
53  size_t bufferSize;
54  size_t writeOffset{};
55 };
56 
69 template <size_t size> class StaticPrintBuffer : public BasePrintBuffer
70 {
71 public:
76  StaticPrintBuffer(Print& output) : BasePrintBuffer(output, buffer, size)
77  {
78  }
79 
80 private:
81  uint8_t buffer[size];
82 };
83 
96 {
97 public:
103  HeapPrintBuffer(Print& output, size_t size) : HeapPrintBuffer(output, new uint8_t[size], size)
104  {
105  }
106 
107 private:
108  HeapPrintBuffer(Print& output, uint8_t* buffer, size_t size) : BasePrintBuffer(output, buffer, size), buffer(buffer)
109  {
110  }
111 
112  std::unique_ptr<uint8_t[]> buffer;
113 };
114 
130 {
131 public:
137  DynamicPrintBuffer(std::unique_ptr<Print>&& output, size_t size)
138  : DynamicPrintBuffer(output.release(), new uint8_t[size], size)
139  {
140  }
141 
143  {
144  flush();
145  }
146 
147 private:
148  DynamicPrintBuffer(Print* output, uint8_t* buffer, size_t size)
149  : BasePrintBuffer(*output, buffer, size), output(output), buffer(buffer)
150  {
151  }
152 
153  std::unique_ptr<Print> output;
154  std::unique_ptr<uint8_t[]> buffer;
155 };
Generic write-through buffer class.
Definition: PrintBuffer.h:23
BasePrintBuffer(Print &output, uint8_t buffer[], size_t bufferSize)
Create buffer.
Definition: PrintBuffer.h:31
~BasePrintBuffer()
Definition: PrintBuffer.h:36
size_t write(uint8_t c) override
Writes a single character to output stream.
void flush()
Write any buffered content to output.
size_t write(const uint8_t *data, size_t size) override
Writes characters from a buffer to output stream.
Write-through buffer using heap storage and owned stream pointer.
Definition: PrintBuffer.h:130
DynamicPrintBuffer(std::unique_ptr< Print > &&output, size_t size)
Construct a stack-based buffer.
Definition: PrintBuffer.h:137
~DynamicPrintBuffer()
Definition: PrintBuffer.h:142
Write-through buffer using heap storage.
Definition: PrintBuffer.h:96
HeapPrintBuffer(Print &output, size_t size)
Construct a stack-based buffer.
Definition: PrintBuffer.h:103
Provides formatted output to stream.
Definition: Print.h:37
Write-through buffer using stack only.
Definition: PrintBuffer.h:70
StaticPrintBuffer(Print &output)
Construct a stack-based buffer.
Definition: PrintBuffer.h:76