helics  3.0.1
Publications.hpp
1 /*
2 Copyright (c) 2017-2021,
3 Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Sustainable
4 Energy, LLC. See the top-level NOTICE for additional details. All rights reserved.
5 SPDX-License-Identifier: BSD-3-Clause
6 */
7 #pragma once
8 
9 #include "../core/core-exceptions.hpp"
10 #include "Federate.hpp"
11 #include "HelicsPrimaryTypes.hpp"
12 
13 #include <memory>
14 #include <string>
15 #include <vector>
16 
17 namespace units {
18 class precise_unit;
19 } // namespace units
20 
21 namespace helics {
22 class ValueFederate;
24 class HELICS_CXX_EXPORT Publication: public Interface {
25  protected:
26  ValueFederate* fed{nullptr};
27  private:
28  int referenceIndex{-1};
29  void* dataReference{nullptr};
30  double delta{-1.0};
31  protected:
32  DataType pubType{DataType::HELICS_ANY};
33  bool changeDetectionEnabled{false};
34  bool disableAssign{false};
35  private:
36  size_t customTypeHash{
37  0};
38  mutable defV prevValue;
39  std::string pubUnits;
40  std::shared_ptr<units::precise_unit>
41  pubUnitType;
42  public:
43  Publication() = default;
50  Publication(ValueFederate* valueFed,
51  InterfaceHandle id,
52  const std::string& key,
53  const std::string& type,
54  const std::string& units);
55 
61  Publication(ValueFederate* valueFed,
62  const std::string& key,
63  const std::string& type,
64  const std::string& units = std::string());
65 
72  template<class FedPtr>
73  Publication(FedPtr valueFed,
74  const std::string& key,
75  const std::string& type = std::string(),
76  const std::string& units = std::string()):
77  Publication(std::addressof(*valueFed), key, type, units)
78  {
79  static_assert(
80  std::is_base_of<ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
81  "first argument must be a pointer to a ValueFederate");
82  }
91  ValueFederate* valueFed,
92  const std::string& key,
93  const std::string& type,
94  const std::string& units = std::string());
103  template<class FedPtr>
105  FedPtr& valueFed,
106  const std::string& key,
107  const std::string& type,
108  const std::string& units = std::string()):
109  Publication(locality, std::addressof(*valueFed), key, type, units)
110  {
111  static_assert(
112  std::is_base_of<ValueFederate, std::remove_reference_t<decltype(*valueFed)>>::value,
113  "first argument must be a pointer to a ValueFederate");
114  }
115 
123  const std::string& key,
124  DataType type,
125  const std::string& units = std::string()):
126  Publication(valueFed, key, typeNameStringRef(type), units)
127  {
128  }
135  template<class FedPtr>
136  Publication(FedPtr& valueFed,
137  const std::string& key,
138  DataType type,
139  const std::string& units = std::string()):
140  Publication(valueFed, key, typeNameStringRef(type), units)
141  {
142  }
151  ValueFederate* valueFed,
152  const std::string& key,
153  DataType type,
154  const std::string& units = std::string()):
155  Publication(locality, valueFed, key, typeNameStringRef(type), units)
156  {
157  }
158 
166  template<class FedPtr>
168  FedPtr& valueFed,
169  const std::string& key,
170  DataType type,
171  const std::string& units = std::string()):
172  Publication(locality, valueFed, key, typeNameStringRef(type), units)
173  {
174  }
175 
177  const std::string& getType() const { return getExtractionType(); }
179  const std::string& getUnits() const { return pubUnits; }
180 
181  void addTarget(std::string_view target) { addDestinationTarget(target); }
188  void publish(double val);
189  void publish(const std::vector<std::string>& val);
190  void publish(const std::vector<double>& val);
191  void publish(const double* vals, int size);
192  void publish(const std::vector<std::complex<double>>& val);
194  void publishComplex(const double* vals, int size);
195  void publish(std::complex<double> val);
196 
197  void publish(bool val);
198  void publish(Time val);
199  void publish(char val);
200  void publish(const NamedPoint& np);
201  void publish(std::string_view field, double val);
207  void publish(double val, const std::string& units);
208  void publish(double val, const units::precise_unit& units);
209 
211  template<class X>
212  std::enable_if_t<(std::is_constructible_v<std::string_view, X>), void> publish(const X& val)
213  {
214  publishString(val);
215  }
216 
218  template<class X>
219  std::enable_if_t<(std::is_same_v<defV, remove_cv_ref<X>>), void> publish(const X& val)
220  {
221  publishDefV(val);
222  }
223 
225  template<class X>
226  std::enable_if_t<(std::is_integral_v<X> && !std::is_same_v<remove_cv_ref<X>, char>), void>
227  publish(X val)
228  {
229  publishInt(static_cast<int64_t>(val));
230  }
231 
234  void setMinimumChange(double deltaV) noexcept
235  {
236  if (delta < 0.0) {
237  changeDetectionEnabled = true;
238  }
239  delta = deltaV;
240  if (delta < 0.0) {
241  changeDetectionEnabled = false;
242  }
243  }
248  void enableChangeDetection(bool enabled = true) noexcept { changeDetectionEnabled = enabled; }
249 
250  virtual const std::string& getDisplayName() const override { return getName(); }
251 
252  private:
258  void publishInt(int64_t val);
259  void publishString(std::string_view val);
260  void publishDefV(const defV& val);
261  friend class ValueFederateManager;
262 };
263 
264 } // namespace helics
helics::defV
std::variant< double, int64_t, std::string, std::complex< double >, std::vector< double >, std::vector< std::complex< double > >, NamedPoint > defV
Definition: HelicsPrimaryTypes.hpp:34
helics::Publication::Publication
Publication(FedPtr valueFed, const std::string &key, const std::string &type=std::string(), const std::string &units=std::string())
Definition: Publications.hpp:73
helics::Publication::getUnits
const std::string & getUnits() const
Definition: Publications.hpp:179
helics::Publication::Publication
Publication(InterfaceVisibility locality, FedPtr &valueFed, const std::string &key, DataType type, const std::string &units=std::string())
Definition: Publications.hpp:167
helics::InterfaceVisibility
InterfaceVisibility
Definition: helicsTypes.hpp:39
helics::ValueFederate::getPublication
Publication & getPublication(const std::string &name)
Definition: ValueFederate.cpp:576
helics::Publication::pubType
DataType pubType
the type of publication
Definition: Publications.hpp:32
helics::ValueFederate
Definition: application_api/ValueFederate.hpp:25
helics::Publication::publishComplex
void publishComplex(const double *vals, int size)
Definition: Publications.cpp:232
helics::ValueConverter::interpret
static X interpret(const data_view &block)
Definition: ValueConverter.hpp:132
helics::Publication::Publication
Publication(FedPtr &valueFed, const std::string &key, DataType type, const std::string &units=std::string())
Definition: Publications.hpp:136
helics::InterfaceHandle
Definition: LocalFederateId.hpp:65
helics::Time
TimeRepresentation< count_time< 9 > > Time
Definition: helicsTime.hpp:27
helics::Publication::publish
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:227
helics::getTypeFromString
DataType getTypeFromString(std::string_view typeName)
Definition: helicsTypes.cpp:219
helics::ValueFederate::registerPublication
Publication & registerPublication(const std::string &name, const std::string &type, const std::string &units=std::string())
Definition: ValueFederate.cpp:99
helics::Publication::fed
ValueFederate * fed
the federate construct to interact with
Definition: Publications.hpp:26
helics::Publication::getType
const std::string & getType() const
Definition: Publications.hpp:177
helics::Publication::publish
std::enable_if_t<(std::is_constructible_v< std::string_view, X >), void > publish(const X &val)
Definition: Publications.hpp:212
helics::DataType
DataType
Definition: helicsTypes.hpp:272
helics::Interface
Definition: application_api/Federate.hpp:627
helics::InvalidConversion
Definition: core-exceptions.hpp:56
helics::RegistrationFailure
Definition: core-exceptions.hpp:84
helics::changeDetected
bool changeDetected(const defV &prevValue, const std::string &val, double)
Definition: helicsPrimaryTypes.cpp:16
helics::Publication::setMinimumChange
void setMinimumChange(double deltaV) noexcept
Definition: Publications.hpp:234
helics::Interface::isValid
bool isValid() const
Definition: application_api/Federate.hpp:646
helics::Publication::publish
std::enable_if_t<(std::is_same_v< defV, remove_cv_ref< X >>), void > publish(const X &val)
Definition: Publications.hpp:219
helics::Publication::Publication
Publication(ValueFederate *valueFed, const std::string &key, DataType type, const std::string &units=std::string())
Definition: Publications.hpp:122
helics::ValueFederate::publishBytes
void publishBytes(const Publication &pub, data_view block)
Definition: ValueFederate.cpp:404
helics::Publication::getDisplayName
virtual const std::string & getDisplayName() const override
Definition: Publications.hpp:250
helics::ValueFederateManager
Definition: ValueFederateManager.hpp:66
helics::Publication::changeDetectionEnabled
bool changeDetectionEnabled
the change detection is enabled
Definition: Publications.hpp:33
helics::Publication
Definition: Publications.hpp:24
helics::Publication::Publication
Publication(InterfaceVisibility locality, FedPtr &valueFed, const std::string &key, const std::string &type, const std::string &units=std::string())
Definition: Publications.hpp:104
HelicsPrimaryTypes.hpp
naming a set of types that are interchangeable and recognizable inside the HELICS application API and...
helics::typeConvert
SmallBuffer typeConvert(DataType type, double val)
Definition: helicsTypes.cpp:712
helics::publish
void publish(ValueFederate &fed, const std::string &pubName, Us... pargs)
Definition: application_api/ValueFederate.hpp:544
helics::Publication::publish
void publish(double val)
Definition: Publications.cpp:71
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::Publication::enableChangeDetection
void enableChangeDetection(bool enabled=true) noexcept
Definition: Publications.hpp:248
helics::typeNameStringRef
const std::string & typeNameStringRef(DataType type)
Definition: helicsTypes.cpp:46
helics::Publication::Publication
Publication(InterfaceVisibility locality, ValueFederate *valueFed, const std::string &key, DataType type, const std::string &units=std::string())
Definition: Publications.hpp:150
helics::ValueFederate::registerGlobalPublication
Publication & registerGlobalPublication(const std::string &name, const std::string &type, const std::string &units=std::string())
Definition: ValueFederate.cpp:107