diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-01-17 17:31:45 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-01-17 17:31:45 +1100 |
| commit | ea8a7b0f93aa3b391e92d7b930f667d1ff439d04 (patch) | |
| tree | 194f0be54ed67935378211364608507a9f9f8030 /src | |
| parent | c0ec19c496591efe970da26c819c2a0dc86c363d (diff) | |
| download | tangara-fw-ea8a7b0f93aa3b391e92d7b930f667d1ff439d04.tar.gz | |
allocate lua properties in spi ram
Diffstat (limited to 'src')
| -rw-r--r-- | src/lua/include/property.hpp | 4 | ||||
| -rw-r--r-- | src/lua/property.cpp | 13 | ||||
| -rw-r--r-- | src/memory/include/memory_resource.hpp | 5 |
3 files changed, 16 insertions, 6 deletions
diff --git a/src/lua/include/property.hpp b/src/lua/include/property.hpp index 425cc15c..03229bc1 100644 --- a/src/lua/include/property.hpp +++ b/src/lua/include/property.hpp @@ -35,7 +35,7 @@ class Property { Property(const LuaValue&); Property(const LuaValue&, std::function<bool(const LuaValue&)>); - auto Get() -> const LuaValue& { return value_; } + auto Get() -> const LuaValue& { return *value_; } auto IsTwoWay() -> bool { return cb_.has_value(); } @@ -46,7 +46,7 @@ class Property { auto AddLuaBinding(lua_State*, int ref) -> void; private: - LuaValue value_; + std::unique_ptr<LuaValue> value_; std::optional<std::function<bool(const LuaValue&)>> cb_; std::pmr::vector<std::pair<lua_State*, int>> bindings_; }; diff --git a/src/lua/property.cpp b/src/lua/property.cpp index 0c2e041b..c16434fa 100644 --- a/src/lua/property.cpp +++ b/src/lua/property.cpp @@ -9,6 +9,7 @@ #include <cmath> #include <memory> +#include <memory_resource> #include <string> #include <variant> @@ -160,11 +161,15 @@ template <class... Ts> inline constexpr bool always_false_v = false; Property::Property(const LuaValue& val) - : value_(val), cb_(), bindings_(&memory::kSpiRamResource) {} + : value_(memory::SpiRamAllocator<LuaValue>().new_object<LuaValue>(val)), + cb_(), + bindings_(&memory::kSpiRamResource) {} Property::Property(const LuaValue& val, std::function<bool(const LuaValue& val)> cb) - : value_(val), cb_(cb), bindings_(&memory::kSpiRamResource) {} + : value_(memory::SpiRamAllocator<LuaValue>().new_object<LuaValue>(val)), + cb_(cb), + bindings_(&memory::kSpiRamResource) {} static auto pushTagValue(lua_State* L, const database::TagValue& val) -> void { std::visit( @@ -273,7 +278,7 @@ auto Property::PushValue(lua_State& s) -> int { static_assert(always_false_v<T>, "PushValue missing type"); } }, - value_); + *value_); return 1; } @@ -343,7 +348,7 @@ auto Property::PopValue(lua_State& s) -> bool { } auto Property::Update(const LuaValue& v) -> void { - value_ = v; + *value_ = v; for (int i = bindings_.size() - 1; i >= 0; i--) { auto& b = bindings_[i]; diff --git a/src/memory/include/memory_resource.hpp b/src/memory/include/memory_resource.hpp index ed4b1a1c..e41a1caf 100644 --- a/src/memory/include/memory_resource.hpp +++ b/src/memory/include/memory_resource.hpp @@ -40,4 +40,9 @@ class Resource : public std::pmr::memory_resource { extern Resource kSpiRamResource; +template <typename T> +auto SpiRamAllocator() { + return std::pmr::polymorphic_allocator<T>{&kSpiRamResource}; +} + } // namespace memory |
