helics 3.7.0
Loading...
Searching...
No Matches
Publications.hpp
1/*
2Copyright (c) 2017-2026,
3Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Energy
4Innovation LLC. See the top-level NOTICE for additional details. All rights reserved.
5SPDX-License-Identifier: BSD-3-Clause
6*/
7#pragma once
8
9#include "../core/core-exceptions.hpp"
10#include "Federate.hpp"
12
13#include <memory>
14#include <string>
15#include <string_view>
16#include <vector>
17
18namespace units {
19class precise_unit;
20} // namespace units
21
22namespace helics {
23class ValueFederate;
25class HELICS_CXX_EXPORT Publication: public Interface {
26 protected:
27 ValueFederate* fed{nullptr};
28 private:
29 int referenceIndex{-1};
30 void* dataReference{nullptr};
31 double delta{-1.0};
32 protected:
33 DataType pubType{DataType::HELICS_ANY};
34 bool changeDetectionEnabled{false};
35 bool disableAssign{false};
36 private:
37 size_t customTypeHash{
38 0};
39 mutable defV prevValue;
40 std::string pubUnits;
41 std::shared_ptr<units::precise_unit>
42 pubUnitType;
43 public:
44 Publication() = default;
51 Publication(ValueFederate* valueFed,
52 InterfaceHandle id,
53 std::string_view key,
54 std::string_view type,
55 std::string_view units);
56
62 Publication(ValueFederate* valueFed,
63 std::string_view key,
64 std::string_view type,
65 std::string_view units = std::string_view{});
66
73 template<class FedPtr>
74 Publication(FedPtr valueFed,
75 std::string_view key,
76 std::string_view type = std::string_view(),
77 std::string_view units = std::string_view()):
78 Publication(std::addressof(*valueFed), key, type, units)
79 {
80 static_assert(
81 std::is_base_of<ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
82 "first argument must be a pointer to a ValueFederate");
83 }
92 ValueFederate* valueFed,
93 std::string_view key,
94 std::string_view type,
95 std::string_view units = std::string_view());
104 template<class FedPtr>
106 FedPtr& valueFed,
107 std::string_view key,
108 std::string_view type,
109 std::string_view units = std::string_view()):
110 Publication(locality, std::addressof(*valueFed), key, type, units)
111 {
112 static_assert(
113 std::is_base_of<ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
114 "first argument must be a pointer to a ValueFederate");
115 }
116
124 std::string_view key,
125 DataType type,
126 std::string_view units = std::string_view()):
127 Publication(valueFed, key, typeNameStringRef(type), units)
128 {
129 }
136 template<class FedPtr>
137 Publication(FedPtr& valueFed,
138 std::string_view key,
139 DataType type,
140 std::string_view units = std::string_view()):
141 Publication(valueFed, key, typeNameStringRef(type), units)
142 {
143 }
152 ValueFederate* valueFed,
153 std::string_view key,
154 DataType type,
155 std::string_view units = std::string_view()):
156 Publication(locality, valueFed, key, typeNameStringRef(type), units)
157 {
158 }
159
167 template<class FedPtr>
169 FedPtr& valueFed,
170 std::string_view key,
171 DataType type,
172 std::string_view units = std::string_view()):
173 Publication(locality, valueFed, key, typeNameStringRef(type), units)
174 {
175 }
176
178 const std::string& getType() const { return getExtractionType(); }
180 const std::string& getUnits() const { return pubUnits; }
182 void addTarget(std::string_view target) { addDestinationTarget(target); }
184 void addInputTarget(std::string_view target) { addDestinationTarget(target); }
191 void publish(double val);
192 void publish(const std::vector<std::string>& val);
193 void publish(const std::vector<double>& val);
194 void publish(const double* vals, int size);
195 void publish(const std::vector<std::complex<double>>& val);
197 void publishComplex(const double* vals, int size);
198 void publish(std::complex<double> val);
199
200 void publish(bool val);
201 void publish(Time val);
202 void publish(char val);
203 void publish(const NamedPoint& np);
204 void publish(std::string_view field, double val);
210 void publish(double val, const std::string& units);
211 void publish(double val, const units::precise_unit& units);
212
214 template<class X>
215 std::enable_if_t<(std::is_constructible_v<std::string_view, X>), void> publish(const X& val)
216 {
217 publishString(val);
218 }
219
221 template<class X>
222 std::enable_if_t<(std::is_same_v<defV, remove_cv_ref<X>>), void> publish(const X& val)
223 {
224 publishDefV(val);
225 }
226
228 template<class X>
229 std::enable_if_t<(std::is_integral_v<X> && !std::is_same_v<remove_cv_ref<X>, char>), void>
230 publish(X val)
231 {
232 publishInt(static_cast<int64_t>(val));
233 }
234
237 void setMinimumChange(double deltaV) noexcept
238 {
239 if (delta < 0.0) {
240 changeDetectionEnabled = true;
241 }
242 delta = deltaV;
243 if (delta < 0.0) {
244 changeDetectionEnabled = false;
245 }
246 }
251 void enableChangeDetection(bool enabled = true) noexcept { changeDetectionEnabled = enabled; }
252
253 virtual const std::string& getDisplayName() const override { return getName(); }
254
255 private:
261 void publishInt(int64_t val);
262 void publishString(std::string_view val);
263 void publishDefV(const defV& val);
264 friend class ValueFederateManager;
265};
266
267} // namespace helics
naming a set of types that are interchangeable and recognizable inside the HELICS application API and...
Definition application_api/Federate.hpp:880
Definition helicsTypes.hpp:110
Definition Publications.hpp:25
std::enable_if_t<(std::is_integral_v< X > &&!std::is_same_v< remove_cv_ref< X >, char >), void > publish(X val)
Definition Publications.hpp:230
Publication(FedPtr &valueFed, std::string_view key, DataType type, std::string_view units=std::string_view())
Definition Publications.hpp:137
Publication(ValueFederate *valueFed, std::string_view key, DataType type, std::string_view units=std::string_view())
Definition Publications.hpp:123
const std::string & getType() const
Definition Publications.hpp:178
std::enable_if_t<(std::is_constructible_v< std::string_view, X >), void > publish(const X &val)
Definition Publications.hpp:215
void addInputTarget(std::string_view target)
Definition Publications.hpp:184
std::enable_if_t<(std::is_same_v< defV, remove_cv_ref< X > >), void > publish(const X &val)
Definition Publications.hpp:222
Publication(InterfaceVisibility locality, ValueFederate *valueFed, std::string_view key, DataType type, std::string_view units=std::string_view())
Definition Publications.hpp:151
virtual const std::string & getDisplayName() const override
Definition Publications.hpp:253
void setMinimumChange(double deltaV) noexcept
Definition Publications.hpp:237
const std::string & getUnits() const
Definition Publications.hpp:180
void addTarget(std::string_view target)
Definition Publications.hpp:182
Publication(FedPtr valueFed, std::string_view key, std::string_view type=std::string_view(), std::string_view units=std::string_view())
Definition Publications.hpp:74
Publication(InterfaceVisibility locality, FedPtr &valueFed, std::string_view key, std::string_view type, std::string_view units=std::string_view())
Definition Publications.hpp:105
Publication(InterfaceVisibility locality, FedPtr &valueFed, std::string_view key, DataType type, std::string_view units=std::string_view())
Definition Publications.hpp:168
void enableChangeDetection(bool enabled=true) noexcept
Definition Publications.hpp:251
Definition ValueFederateManager.hpp:64
Definition application_api/ValueFederate.hpp:28
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition AsyncFedCallInfo.hpp:14
DataType
Definition helicsTypes.hpp:273
const std::string & typeNameStringRef(DataType type)
Definition helicsTypes.cpp:64
InterfaceVisibility
Definition helicsTypes.hpp:40
TimeRepresentation< count_time< 9 > > Time
Definition helicsTime.hpp:27
std::variant< double, int64_t, std::string, std::complex< double >, std::vector< double >, std::vector< std::complex< double > >, NamedPoint > defV
Definition HelicsPrimaryTypes.hpp:37
void publish(ValueFederate &fed, std::string_view pubName, Us... pargs)
Definition application_api/ValueFederate.hpp:571
STL namespace.