rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
buffered_writer.h
Go to the documentation of this file.
1/**
2 * @file buffered_writer.h
3 */
4
5#pragma once
6
7#include <cstring>
8
9#include "writer.h"
10
11template <int TBufferSize>
12class BufferedWriter : public Writer {
13public:
14 size_t write(const char* buffer, size_t count) override {
15 size_t bytesFlushed = 0;
16
17 while (count) {
18 if (m_bytesUsed == 0 && count >= TBufferSize) {
19 // special case: write-thru, skip the copy
20 bytesFlushed += writeInternal(buffer, count);
21 count = 0;
22 } else if (m_bytesUsed + count < TBufferSize) {
23 // Write that will fit in the buffer, just copy to intermediate buffer
24 memcpy(m_buffer + m_bytesUsed, buffer, count);
26 count = 0;
27 } else {
28 // Need to write partial, then flush buffer
29 size_t bytesToWrite = TBufferSize - m_bytesUsed;
30 // Copy this block in to place
31 memcpy(m_buffer + m_bytesUsed, buffer, bytesToWrite);
32 m_bytesUsed += bytesToWrite;
33
34 // Flush to underlying
35 bytesFlushed += flush();
36 // Step the read pointer ahead
37 buffer += bytesToWrite;
38 // Decrement remaining bytes
39 count -= bytesToWrite;
40 }
41 }
42
43 return bytesFlushed;
44 }
45
46 // Flush the internal buffer to the underlying interface.
47 size_t flush() override {
48 size_t bytesToWrite = m_bytesUsed;
49
50 if (bytesToWrite > 0) {
51 m_bytesUsed = 0;
52 return writeInternal(m_buffer, bytesToWrite);
53 } else {
54 return 0;
55 }
56 }
57
58protected:
59 virtual size_t writeInternal(const char* buffer, size_t count) = 0;
60
61private:
62 char m_buffer[TBufferSize];
63 size_t m_bytesUsed = 0;
64};
char m_buffer[TBufferSize]
size_t flush() override
virtual size_t writeInternal(const char *buffer, size_t count)=0
size_t write(const char *buffer, size_t count) override
Definition writer.h:9
static BigBufferHandle buffer
uint16_t count
Definition tunerstudio.h:1