9 #include "ValueFederate.hpp"
59 std::vector<Input> ids;
60 std::function<void(
int,
Time)>
78 std::string_view units = std::string_view{}):
80 m_key(key), m_units(units)
83 vals.resize(count, defValue);
85 for (
auto ind = startIndex; ind < startIndex + count; ++ind) {
90 for (
auto&
id : ids) {
92 handleCallback(inp, tm);
104 template<
class FedPtr>
106 std::string_view key,
110 std::string_view units = std::string_view{}):
111 VectorSubscription(std::addressof(*valueFed), key, startIndex, count, defValue, units)
114 std::is_base_of<
ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
115 "first argument must be a pointer to a ValueFederate");
120 fed(vs.fed), m_key(std::move(vs.m_key)), m_units(std::move(vs.m_units)),
121 ids(std::move(vs.ids)), update_callback(std::move(vs.update_callback)),
122 vals(std::move(vs.vals))
125 for (
auto&
id : ids) {
127 handleCallback(inp, tm);
135 m_key = std::move(vs.m_key);
136 m_units = std::move(vs.m_units);
137 ids = std::move(vs.ids);
138 update_callback = std::move(vs.update_callback);
139 vals = std::move(vs.vals);
141 for (
auto&
id : ids) {
143 handleCallback(inp, tm);
150 const std::vector<X>&
getVals()
const {
return vals; }
161 update_callback = std::move(callback);
165 void handleCallback(
Input& inp,
Time time)
167 auto res = std::lower_bound(ids.begin(), ids.end(), inp);
168 int index =
static_cast<int>(res - ids.begin());
170 if (update_callback) {
171 update_callback(index, time);
184 std::vector<Input> ids;
185 std::function<void(
int,
Time)>
188 std::array<int, 4> indices{{0, 0, 0, 0}};
202 template<
class FedPtr>
204 std::string_view key,
210 std::string_view units = std::string_view()):
211 fed(std::addressof(*valueFed)),
212 m_key(key), m_units(units)
215 std::is_base_of<
ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
216 "Second argument must be a pointer to a ValueFederate");
217 ids.reserve(count_x * count_y);
218 vals.resize(count_x * count_y, defValue);
220 for (
auto ind_x = startIndex_x; ind_x < startIndex_x + count_x; ++ind_x) {
221 for (
auto ind_y = startIndex_y; ind_y < startIndex_y + count_y; ++ind_y) {
227 indices[0] = startIndex_x;
228 indices[1] = count_x;
229 indices[2] = startIndex_y;
230 indices[3] = count_y;
231 for (
auto&
id : ids) {
233 handleCallback(inp, tm);
242 m_key = std::move(vs.m_key);
243 m_units = std::move(vs.m_units);
244 ids = std::move(vs.ids);
245 update_callback = std::move(vs.update_callback);
246 vals = std::move(vs.vals);
248 for (
auto&
id : ids) {
250 handleCallback(inp, tm);
253 indices = vs.indices;
258 const std::vector<X>&
getVals()
const {
return vals; }
266 const X&
at(
int index_x,
int index_y)
const
268 return vals[(index_x - indices[0]) * indices[3] + (index_y - indices[2])];
277 update_callback = std::move(callback);
281 void handleCallback(
const Input& inp,
Time time)
283 auto res = std::lower_bound(ids.begin(), ids.end(), inp);
284 int index =
static_cast<int>(res - ids.begin());
285 ids[index].getValue(vals[index]);
286 if (update_callback) {
287 update_callback(index, time);