9 #include "ValueFederate.hpp"
58 std::vector<Input> ids;
59 std::function<void(
int,
Time)>
73 const std::string& key,
77 const std::string& units = std::string()):
79 m_key(key), m_units(units)
82 vals.resize(count, defValue);
84 for (
auto ind = startIndex; ind < startIndex + count; ++ind) {
89 for (
auto&
id : ids) {
91 handleCallback(inp, tm);
103 template<
class FedPtr>
105 const std::string& key,
109 const std::string& units = std::string()):
110 VectorSubscription(std::addressof(*valueFed), key, startIndex, count, defValue, units)
113 std::is_base_of<
ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
114 "first argument must be a pointer to a ValueFederate");
119 fed(vs.fed), m_key(std::move(vs.m_key)), m_units(std::move(vs.m_units)),
120 ids(std::move(vs.ids)), update_callback(std::move(vs.update_callback)),
121 vals(std::move(vs.vals))
124 for (
auto&
id : ids) {
126 handleCallback(inp, tm);
134 m_key = std::move(vs.m_key);
135 m_units = std::move(vs.m_units);
136 ids = std::move(vs.ids);
137 update_callback = std::move(vs.update_callback);
138 vals = std::move(vs.vals);
140 for (
auto&
id : ids) {
142 handleCallback(inp, tm);
149 const std::vector<X>&
getVals()
const {
return vals; }
160 update_callback = std::move(callback);
164 void handleCallback(
Input& inp,
Time time)
166 auto res = std::lower_bound(ids.begin(), ids.end(), inp);
167 int index =
static_cast<int>(res - ids.begin());
169 if (update_callback) {
170 update_callback(index, time);
183 std::vector<Input> ids;
184 std::function<void(
int,
Time)>
187 std::array<int, 4> indices{{0, 0, 0, 0}};
201 template<
class FedPtr>
203 const std::string& key,
209 const std::string& units = std::string()):
210 fed(std::addressof(*valueFed)),
211 m_key(key), m_units(units)
214 std::is_base_of<
ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
215 "Second argument must be a pointer to a ValueFederate");
216 ids.reserve(count_x * count_y);
217 vals.resize(count_x * count_y, defValue);
219 for (
auto ind_x = startIndex_x; ind_x < startIndex_x + count_x; ++ind_x) {
220 for (
auto ind_y = startIndex_y; ind_y < startIndex_y + count_y; ++ind_y) {
226 indices[0] = startIndex_x;
227 indices[1] = count_x;
228 indices[2] = startIndex_y;
229 indices[3] = count_y;
230 for (
auto&
id : ids) {
232 handleCallback(inp, tm);
241 m_key = std::move(vs.m_key);
242 m_units = std::move(vs.m_units);
243 ids = std::move(vs.ids);
244 update_callback = std::move(vs.update_callback);
245 vals = std::move(vs.vals);
247 for (
auto&
id : ids) {
249 handleCallback(inp, tm);
252 indices = vs.indices;
257 const std::vector<X>&
getVals()
const {
return vals; }
265 const X&
at(
int index_x,
int index_y)
const
267 return vals[(index_x - indices[0]) * indices[3] + (index_y - indices[2])];
276 update_callback = std::move(callback);
280 void handleCallback(
const Input& inp,
Time time)
282 auto res = std::lower_bound(ids.begin(), ids.end(), inp);
283 int index =
static_cast<int>(res - ids.begin());
284 ids[index].getValue(vals[index]);
285 if (update_callback) {
286 update_callback(index, time);