opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
shared_output_extractor.h
Go to the documentation of this file.
1#pragma once
2
6
8
9#include <concepts>
10#include <cstddef>
11#include <functional>
12#include <iosfwd>
13#include <memory>
14#include <ranges>
15#include <span>
16#include <string>
17#include <utility>
18#include <vector>
19
20namespace OpenSim { class Component; }
21
22namespace opyn
23{
24 // concrete reference-counted value-type wrapper for an `OutputExtractor`.
25 //
26 // This is a value-type that can be compared, hashed, etc. for easier usage
27 // by other parts of osc (e.g. aggregators, plotters)
29 public:
30 template<typename ConcreteOutputExtractor>
31 explicit SharedOutputExtractor(ConcreteOutputExtractor&& output) :
32 m_Output{std::make_shared<ConcreteOutputExtractor>(std::forward<ConcreteOutputExtractor>(output))}
33 {}
34
35 osc::CStringView getName() const { return m_Output->getName(); }
36 osc::CStringView getDescription() const { return m_Output->getDescription(); }
37 OutputExtractorDataType getOutputType() const { return m_Output->getOutputType(); }
38
39 OutputValueExtractor getOutputValueExtractor(const OpenSim::Component& component) const
40 {
41 return m_Output->getOutputValueExtractor(component);
42 }
43
44 template<typename T>
45 requires std::constructible_from<T, osc::Variant&&>
46 T getValue(const OpenSim::Component& component, const StateViewWithMetadata& state) const
47 {
48 return m_Output->getValue<T>(component, state);
49 }
50
51 template<typename T, std::ranges::forward_range R>
52 requires (
53 std::constructible_from<T, osc::Variant&&> and
54 std::convertible_to<std::ranges::range_value_t<R>, const StateViewWithMetadata&>
55 )
57 const OpenSim::Component& component,
58 const R& states,
59 const std::function<void(T)>& consumer) const
60 {
61 return m_Output->getValues<T>(component, states, consumer);
62 }
63
64 template<typename T, std::ranges::forward_range R>
65 requires (
66 std::constructible_from<T, osc::Variant&&> and
67 std::convertible_to<std::ranges::range_value_t<R>, const StateViewWithMetadata&>
68 )
69 std::vector<T> slurpValues(const OpenSim::Component& component, const R& states) const
70 {
71 return m_Output->slurpValues<T>(component, states);
72 }
73
74 size_t getHash() const { return m_Output->getHash(); }
75
76 bool equals(const OutputExtractor& other) const { return m_Output->equals(other); }
77 operator const OutputExtractor& () const { return *m_Output; }
78 const OutputExtractor& getInner() const { return *m_Output; }
79
80 friend bool operator==(const SharedOutputExtractor& lhs, const SharedOutputExtractor& rhs)
81 {
82 return *lhs.m_Output == *rhs.m_Output;
83 }
84 private:
85 friend std::string to_string(const SharedOutputExtractor&);
86 friend struct std::hash<SharedOutputExtractor>;
87
88 std::shared_ptr<const OutputExtractor> m_Output;
89 };
90
91 template<std::derived_from<OutputExtractor> ConcreteOutputExtractor, typename... Args>
92 requires std::constructible_from<ConcreteOutputExtractor, Args&&...>
94 {
95 return SharedOutputExtractor{ConcreteOutputExtractor{std::forward<Args>(args)...}};
96 }
97
98 std::ostream& operator<<(std::ostream&, const SharedOutputExtractor&);
99 std::string to_string(const SharedOutputExtractor&);
100}
101
102template<>
103struct std::hash<opyn::SharedOutputExtractor> final {
105 {
106 return o.m_Output->getHash();
107 }
108};
Definition output_extractor.h:29
Definition output_value_extractor.h:18
Definition shared_output_extractor.h:28
size_t getHash() const
Definition shared_output_extractor.h:74
T getValue(const OpenSim::Component &component, const StateViewWithMetadata &state) const
Definition shared_output_extractor.h:46
bool equals(const OutputExtractor &other) const
Definition shared_output_extractor.h:76
void getValues(const OpenSim::Component &component, const R &states, const std::function< void(T)> &consumer) const
Definition shared_output_extractor.h:56
friend std::string to_string(const SharedOutputExtractor &)
osc::CStringView getDescription() const
Definition shared_output_extractor.h:36
osc::CStringView getName() const
Definition shared_output_extractor.h:35
friend bool operator==(const SharedOutputExtractor &lhs, const SharedOutputExtractor &rhs)
Definition shared_output_extractor.h:80
OutputValueExtractor getOutputValueExtractor(const OpenSim::Component &component) const
Definition shared_output_extractor.h:39
std::vector< T > slurpValues(const OpenSim::Component &component, const R &states) const
Definition shared_output_extractor.h:69
SharedOutputExtractor(ConcreteOutputExtractor &&output)
Definition shared_output_extractor.h:31
OutputExtractorDataType getOutputType() const
Definition shared_output_extractor.h:37
const OutputExtractor & getInner() const
Definition shared_output_extractor.h:78
Definition state_view_with_metadata.h:12
Definition c_string_view.h:12
Definition static_component_registries.h:3
Definition component_registry.h:14
OutputExtractorDataType
Definition output_extractor_data_type.h:6
std::string to_string(const CSVParseWarning &)
SharedOutputExtractor make_output_extractor(Args &&... args)
Definition shared_output_extractor.h:93
std::ostream & operator<<(std::ostream &out, const DataFrame &data_frame)
Writes a pretty-printed representation of data_frame to out.
size_t operator()(const opyn::SharedOutputExtractor &o) const
Definition shared_output_extractor.h:104