opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
output_extractor.h
Go to the documentation of this file.
1#pragma once
2
5
9
10#include <concepts>
11#include <cstddef>
12#include <functional>
13#include <ranges>
14#include <string>
15#include <vector>
16
17namespace OpenSim { class Component; }
18namespace opyn { class StateViewWithMetadata; }
19namespace osc { class IOutputValueExtractorVisitor; }
20
21namespace opyn
22{
23 // an interface for something that can produce an output value extractor
24 // for a particular model against multiple states
25 //
26 // implementors of this interface are assumed to be immutable (important,
27 // because output extractors might be shared between simulations, threads,
28 // etc.)
30 protected:
31 OutputExtractor() = default;
33 OutputExtractor(OutputExtractor&&) noexcept = default;
34 OutputExtractor& operator=(const OutputExtractor&) = default;
35 OutputExtractor& operator=(OutputExtractor&&) noexcept = default;
36 public:
37 virtual ~OutputExtractor() noexcept = default;
38
39 osc::CStringView getName() const { return implGetName(); }
41
43 OutputValueExtractor getOutputValueExtractor(const OpenSim::Component& component) const
44 {
45 return implGetOutputValueExtractor(component);
46 }
47
48 template<typename T>
49 requires std::constructible_from<T, osc::Variant&&>
50 T getValue(const OpenSim::Component& component, const opyn::StateViewWithMetadata& state) const
51 {
52 return to<T>(getOutputValueExtractor(component)(state));
53 }
54
55 template<typename T, std::ranges::forward_range R, std::invocable<T> Consumer>
56 requires (
57 std::constructible_from<T, osc::Variant&&> and
58 std::convertible_to<std::ranges::range_value_t<R>, const opyn::StateViewWithMetadata&>
59 )
61 const OpenSim::Component& component,
62 const R& states,
63 Consumer&& consumer) const
64 {
65 const opyn::OutputValueExtractor extractor = getOutputValueExtractor(component);
66 for (const opyn::StateViewWithMetadata& state : states) {
67 consumer(to<T>(extractor(state)));
68 }
69 }
70
71 template<typename T, std::ranges::forward_range R>
72 requires (
73 std::constructible_from<T, osc::Variant&&> and
74 std::convertible_to<std::ranges::range_value_t<R>, const opyn::StateViewWithMetadata&>
75 )
76 std::vector<T> slurpValues(const OpenSim::Component& component, const R& states) const
77 {
78 std::vector<T> rv;
79 if constexpr (std::ranges::sized_range<R>) {
80 rv.reserve(std::ranges::size(states));
81 }
82 getValues<T>(component, states, [&rv](T value) { rv.push_back(std::move(value)); });
83 return rv;
84 }
85
86 size_t getHash() const { return implGetHash(); }
87 bool equals(const OutputExtractor& other) const { return implEquals(other); }
88
89 friend bool operator==(const OutputExtractor& lhs, const OutputExtractor& rhs)
90 {
91 return lhs.equals(rhs);
92 }
93 private:
94 virtual osc::CStringView implGetName() const = 0;
97 virtual OutputValueExtractor implGetOutputValueExtractor(const OpenSim::Component&) const = 0;
98 virtual size_t implGetHash() const = 0;
99 virtual bool implEquals(const OutputExtractor&) const = 0;
100 };
101}
Definition output_extractor.h:29
virtual bool implEquals(const OutputExtractor &) const =0
virtual osc::CStringView implGetDescription() const =0
virtual OutputExtractorDataType implGetOutputType() const =0
virtual osc::CStringView implGetName() const =0
virtual OutputValueExtractor implGetOutputValueExtractor(const OpenSim::Component &) const =0
void getValues(const OpenSim::Component &component, const R &states, Consumer &&consumer) const
Definition output_extractor.h:60
OutputExtractorDataType getOutputType() const
Definition output_extractor.h:42
bool equals(const OutputExtractor &other) const
Definition output_extractor.h:87
osc::CStringView getName() const
Definition output_extractor.h:39
T getValue(const OpenSim::Component &component, const opyn::StateViewWithMetadata &state) const
Definition output_extractor.h:50
OutputExtractor(OutputExtractor &&) noexcept=default
virtual size_t implGetHash() const =0
std::vector< T > slurpValues(const OpenSim::Component &component, const R &states) const
Definition output_extractor.h:76
OutputValueExtractor getOutputValueExtractor(const OpenSim::Component &component) const
Definition output_extractor.h:43
osc::CStringView getDescription() const
Definition output_extractor.h:40
friend bool operator==(const OutputExtractor &lhs, const OutputExtractor &rhs)
Definition output_extractor.h:89
size_t getHash() const
Definition output_extractor.h:86
OutputExtractor(const OutputExtractor &)=default
Definition output_value_extractor.h:18
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
Definition custom_decoration_generator.h:5
constexpr U to(T &&value)
Definition conversion.h:56