FastLED 3.10.8
Loading...
Searching...
No Matches
memory_file_handle.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/fs/file_handle.h"
5#include "fl/stl/span.h"
6#include "fl/math/math.h"
7#include "fl/stl/noexcept.h"
8
9namespace fl {
10namespace detail {
11
12// In-memory file buffer backed by a circular buffer.
13// Non-seekable (pipe/socket-like). Write pushes to buffer, read pops from buffer.
14// Analogous to std::stringbuf but for circular byte streams.
15class memorybuf : public fl::filebuf {
16public:
19
20 ~memorybuf() FL_NO_EXCEPT override = default;
21
22 bool is_open() const FL_NO_EXCEPT override { return true; }
23
24 void close() FL_NO_EXCEPT override { mBuffer.clear(); }
25
26 fl::size_t read(char* buffer, fl::size_t count) FL_NO_EXCEPT override {
27 if (!buffer || count == 0) return 0;
28 fl::size_t actual = FL_MIN(count, mBuffer.size());
29 for (fl::size_t i = 0; i < actual; ++i) {
30 fl::u8 b = 0;
31 mBuffer.pop_front(&b);
32 buffer[i] = static_cast<char>(b);
33 }
34 return actual;
35 }
36 using filebuf::read; // u8 overload
37
38 fl::size_t write(const char* data, fl::size_t count) FL_NO_EXCEPT override {
39 if (!data || count == 0 || mBuffer.capacity() == 0) return 0;
40 fl::size_t written = 0;
41 for (fl::size_t i = 0; i < count; ++i) {
42 if (mBuffer.full()) break;
43 mBuffer.push_back(static_cast<fl::u8>(data[i]));
44 ++written;
45 }
46 mTotalWritten += written;
47 return written;
48 }
49
50 // Convenience: write u8 data
52 return write(reinterpret_cast<const char*>(data.data()), data.size()); // ok reinterpret cast
53 }
54
55 // Convenience: write CRGB pixels
57 fl::size_t bytes_written = write(reinterpret_cast<const char*>(src), n * 3); // ok reinterpret cast
58 return bytes_written / 3;
59 }
60
61 fl::size_t tell() FL_NO_EXCEPT override { return 0; } // Not meaningful for circular buffer
62
63 bool seek(fl::size_t, seek_dir) FL_NO_EXCEPT override { return false; } // Non-seekable
64 using filebuf::seek;
65
66 fl::size_t size() const FL_NO_EXCEPT override { return mBuffer.size(); }
67
68 const char* path() const FL_NO_EXCEPT override { return "memorybuf"; }
69
70 bool is_eof() const FL_NO_EXCEPT override { return mBuffer.empty(); }
71
72 bool has_error() const FL_NO_EXCEPT override { return false; }
73 void clear_error() FL_NO_EXCEPT override {}
74 int error_code() const FL_NO_EXCEPT override { return 0; }
75 const char* error_message() const FL_NO_EXCEPT override { return "No error"; }
76
77 bool available() const FL_NO_EXCEPT override { return !mBuffer.empty(); }
78
79 fl::size_t bytes_left() const FL_NO_EXCEPT override { return mBuffer.size(); }
80
81 void clear() FL_NO_EXCEPT { mBuffer.clear(); }
82
83 fl::size_t capacity() const FL_NO_EXCEPT { return mBuffer.capacity(); }
84
85private:
88};
89
90} // namespace detail
91
92// Public alias
95
96} // namespace fl
void clear() FL_NO_EXCEPT
void clear_error() FL_NO_EXCEPT override
bool available() const FL_NO_EXCEPT override
bool is_open() const FL_NO_EXCEPT override
fl::size_t writeCRGB(const CRGB *src, fl::size_t n) FL_NO_EXCEPT
fl::size_t capacity() const FL_NO_EXCEPT
bool has_error() const FL_NO_EXCEPT override
fl::size_t tell() FL_NO_EXCEPT override
fl::size_t write(fl::span< const fl::u8 > data) FL_NO_EXCEPT
const char * error_message() const FL_NO_EXCEPT override
const char * path() const FL_NO_EXCEPT override
circular_buffer< fl::u8 > mBuffer
fl::size_t write(const char *data, fl::size_t count) FL_NO_EXCEPT override
bool is_eof() const FL_NO_EXCEPT override
fl::size_t read(char *buffer, fl::size_t count) FL_NO_EXCEPT override
memorybuf(fl::u32 capacity) FL_NO_EXCEPT
bool seek(fl::size_t, seek_dir) FL_NO_EXCEPT override
void close() FL_NO_EXCEPT override
fl::size_t bytes_left() const FL_NO_EXCEPT override
~memorybuf() FL_NO_EXCEPT override=default
int error_code() const FL_NO_EXCEPT override
fl::size_t size() const FL_NO_EXCEPT override
virtual bool seek(fl::size_t pos, seek_dir dir) FL_NO_EXCEPT=0
virtual fl::size_t read(char *buffer, fl::size_t count) FL_NO_EXCEPT=0
#define FL_MIN(a, b)
Definition math.h:117
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_info.h:57
__SIZE_TYPE__ size_t
Definition s16x16x4.h:16
unsigned char u8
Definition stdint.h:131
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
seek_dir
Definition file_handle.h:20
detail::memorybuf memorybuf
Base definition for an LED controller.
Definition crgb.hpp:179
#define FASTLED_SHARED_PTR_NO_FWD(type)
Definition shared_ptr.h:588
Representation of an 8-bit RGB pixel (Red, Green, Blue)
Definition crgb.h:38