#pragma once #include #include #include #include #include #include #include "secsgem/secs2/item.hpp" namespace secsgem::gem { namespace s2 = secsgem::secs2; struct StatusVariable { uint32_t id; std::string name; std::string units; s2::Item value; }; class StatusVariableStore { public: void add(StatusVariable sv) { const uint32_t id = sv.id; by_id_.insert_or_assign(id, std::move(sv)); } bool has(uint32_t id) const { return by_id_.count(id) > 0; } std::optional get(uint32_t id) const { auto it = by_id_.find(id); if (it == by_id_.end()) return std::nullopt; return it->second; } std::vector all() const { std::vector out; out.reserve(by_id_.size()); for (const auto& [_, sv] : by_id_) out.push_back(sv); return out; } void set_value(uint32_t id, s2::Item value) { auto it = by_id_.find(id); if (it != by_id_.end()) it->second.value = std::move(value); } std::optional value(uint32_t id) const { auto it = by_id_.find(id); if (it == by_id_.end()) return std::nullopt; return it->second.value; } std::size_t size() const { return by_id_.size(); } private: std::map by_id_; }; // DVIDs (data variables) share storage shape with SVIDs; reuse the same class // under a clearer alias so call sites read correctly. struct DataVariable { uint32_t id; std::string name; std::string units; s2::Item value; }; class DataVariableStore { public: void add(DataVariable dv) { by_id_.insert_or_assign(dv.id, std::move(dv)); } std::optional get(uint32_t id) const { auto it = by_id_.find(id); if (it == by_id_.end()) return std::nullopt; return it->second; } std::vector all() const { std::vector out; out.reserve(by_id_.size()); for (const auto& [_, dv] : by_id_) out.push_back(dv); return out; } void set_value(uint32_t id, s2::Item value) { auto it = by_id_.find(id); if (it != by_id_.end()) it->second.value = std::move(value); } std::optional value(uint32_t id) const { auto it = by_id_.find(id); if (it == by_id_.end()) return std::nullopt; return it->second.value; } bool has(uint32_t id) const { return by_id_.count(id) > 0; } private: std::map by_id_; }; } // namespace secsgem::gem