🛰️航天仿真算法库 SpaceAST 0.0.1
载入中...
搜索中...
未找到
DataElements.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "DataElement.hpp"
25#include "AstUtil/Dimension.hpp"
26#include "AstUtil/VariantVector.hpp"
27#include <map>
28#include <vector>
29#include <string>
30
31AST_NAMESPACE_BEGIN
32
40class DataElements;
41
42namespace detail
43{
48 template<typename T, typename MemberType, MemberType T::*Member>
50 {
51 return [](const VariantVector& data, VariantVector& element) -> errc_t
52 {
53 auto span = data.asSpan<const T>();
54 if (!span.data()) return -1;
55 using ElementType = typename std::remove_cv<typename std::remove_reference<MemberType>::type>::type;
56 element.reset<ElementType>(span.size());
57 auto* out = element.as<ElementType>();
58 if (!out) return -1;
59 for (size_t i = 0; i < span.size(); ++i)
60 out[i] = span[i].*Member;
61 return 0;
62 };
63 }
64
69 template<typename T, typename Ret, Ret (T::*Getter)() const>
70 ElementExtractFunc makeExtractFunc()
71 {
72 return [](const VariantVector& data, VariantVector& element) -> errc_t
73 {
74 auto span = data.asSpan<const T>();
75 if (!span.data()) return -1;
76 using ElementType = typename std::remove_cv<typename std::remove_reference<Ret>::type>::type;
77 element.reset<ElementType>(span.size());
78 auto* out = element.as<ElementType>();
79 if (!out) return -1;
80 for (size_t i = 0; i < span.size(); ++i)
81 out[i] = (span[i].*Getter)();
82 return 0;
83 };
84 }
85} // namespace detail
86
87
90{
91public:
92 DataElements() = default;
93 ~DataElements() = default;
94
96 const DataElement* getElement(StringView name) const;
97 const DataElement* find(StringView name) const{return getElement(name);}
98
100 const std::vector<DataElement>& getElements() const { return elements_; }
101
103 void addElement(const DataElement& element);
104
108 void addAlias(const char* alias, const char* name);
109
114 template<typename T, typename MemberType, MemberType T::*Member>
115 void addElement(const char* name, Dimension dimension = Dimension::Unit())
116 {
117 DataElement element;
118 element.setName(name);
119 element.setDimension(dimension);
120 element.setExtractFunc(detail::makeExtractFunc<T, MemberType, Member>());
121 addElement(element);
122 }
123
128 template<typename T, typename Ret, Ret (T::*Getter)() const>
129 void addElement(const char* name, Dimension dimension = Dimension::Unit())
130 {
131 DataElement element;
132 element.setName(name);
133 element.setDimension(dimension);
134 element.setExtractFunc(detail::makeExtractFunc<T, Ret, Getter>());
135 addElement(element);
136 }
137
138private:
139 std::vector<DataElement> elements_{};
140 std::vector<std::pair<std::string, std::string>> aliasMap_{};
141};
142
143const int i = sizeof(DataElements);
144
147AST_NAMESPACE_END
数据元素 — 从数据向量中提取子数据的可配置单元
ElementExtractFunc makeExtractFunc()
生成成员变量提取函数
定义 DataElements.hpp:49
数据元素 — 封装数据提取逻辑的可配置单元
定义 DataElement.hpp:53
void setExtractFunc(ElementExtractFunc extractFunc)
注册数据提取函数
定义 DataElement.cpp:32
void setName(const char *name)
设置数据元素名称
定义 DataElement.hpp:69
void setDimension(Dimension dimension)
设置数据元素的量纲
定义 DataElement.hpp:77
数据元素容器
定义 DataElements.hpp:90
void addElement(const char *name, Dimension dimension=Dimension::Unit())
添加数据元素(成员变量版本)
定义 DataElements.hpp:115
const std::vector< DataElement > & getElements() const
获取所有数据元素
定义 DataElements.hpp:100
量纲
定义 Dimension.hpp:362
变类型向量容器
定义 VariantVector.hpp:59
Span< T > asSpan()
获取类型化 Span 视图(非拥有)
定义 VariantVector.hpp:556
Unit T
特斯拉
定义 Unit.cpp:492
errc_t(* ElementExtractFunc)(const VariantVector &data, VariantVector &element)
数据提取函数指针类型
定义 DataElement.hpp:40