Memory management improv.

This commit is contained in:
Totoo
2026-04-30 15:00:19 +02:00
committed by GitHub
parent ab986a0378
commit 2bacbc80a8
26 changed files with 365 additions and 410 deletions
@@ -27,30 +27,44 @@
#include "ui_navigation.hpp"
#include "external_app.hpp"
#include "standalone_app.hpp"
#include <cstring>
#include "file.hpp"
#define EXT_APP_EXPECTED_CHECKSUM 0x00000000
namespace ui {
template <size_t Width, size_t Height>
class DynamicBitmap {
public:
static constexpr size_t buffer_size = Width * Height / (sizeof(uint8_t) * 8); // one bit per pixel
static constexpr size_t buffer_size = Width * Height / (sizeof(uint8_t) * 8);
// Main constructor
DynamicBitmap(const uint8_t data[buffer_size])
: _buffer(buffer_size, 0),
_bitmap{new Bitmap{{Width, Height}, &_buffer[0]}} {
memcpy(&_buffer[0], data, buffer_size);
: _bitmap{{Width, Height}, _buffer.data()} {
std::memcpy(_buffer.data(), data, buffer_size);
}
const Bitmap* bitmap() { return _bitmap.get(); }
DynamicBitmap(const DynamicBitmap& other)
: _buffer(other._buffer),
_bitmap{{Width, Height}, _buffer.data()} {}
DynamicBitmap(DynamicBitmap&& other) noexcept
: _buffer(std::move(other._buffer)),
_bitmap{{Width, Height}, _buffer.data()} {}
DynamicBitmap& operator=(const DynamicBitmap& other) = delete;
DynamicBitmap& operator=(DynamicBitmap&& other) noexcept = delete;
// Destructor (Default is fine, no heap memory to free manually)
~DynamicBitmap() = default;
const Bitmap* bitmap() const { return &_bitmap; }
private:
// Allocating both members so the class is movable without invalidation.
std::vector<uint8_t> _buffer;
std::unique_ptr<Bitmap> _bitmap;
// Order matters: _buffer must be declared before _bitmap
// so it is initialized first and its .data() pointer is valid.
std::array<uint8_t, buffer_size> _buffer{};
Bitmap _bitmap{};
};
class ExternalItemsMenuLoader {
@@ -65,9 +79,10 @@ class ExternalItemsMenuLoader {
static bool run_standalone_app(ui::NavigationView&, std::filesystem::path);
static bool run_module_app(ui::NavigationView&, uint8_t*, size_t);
static void load_all_external_items_callback(std::function<void(AppInfoConsole&)> callback, bool module_included = false);
static void unload_external_items();
private:
static std::vector<DynamicBitmap<16, 16>> bitmaps;
static std::vector<std::unique_ptr<DynamicBitmap<16, 16>>> bitmaps;
};
} // namespace ui