3#include "valkyrie/util/eigenunit/UnitVector.h"
17template <
typename... UnitTags>
21 static constexpr std::size_t
Size =
sizeof...(UnitTags);
39 explicit UnitMap(
double* ptr) : map(ptr) {}
59 template <std::
size_t N>
61 constexpr auto Get()
const {
62 using T = std::tuple_element_t<N, UnitTuple>;
63 return units::unit_t<T>(map[N]);
81 template <std::
size_t N>
83 void Set(units::unit_t<std::tuple_element_t<N, UnitTuple>> val) {
91 template <
typename... OtherTags>
119 constexpr auto X() const
126 void X(units::unit_t<std::tuple_element_t<Size >= 1 ? 0 : 0,
UnitTuple>> val)
133 constexpr auto Y() const
140 void Y(units::unit_t<std::tuple_element_t<Size >= 2 ? 1 : 0,
UnitTuple>> val)
147 constexpr auto Z() const
154 void Z(units::unit_t<std::tuple_element_t<Size >= 3 ? 2 : 0,
UnitTuple>> val)
161 constexpr auto W() const
168 void W(units::unit_t<std::tuple_element_t<Size >= 4 ? 3 : 0,
UnitTuple>> val)
183 m.print_impl(os, std::make_index_sequence<Size>{});
189 template <std::size_t... Is>
190 void print_impl(std::ostream& os, std::index_sequence<Is...>)
const {
191 ((os << units::unit_t<std::tuple_element_t<Is, UnitTuple>>(map[Is]).value() << (Is ==
Size - 1 ?
"" :
", ")), ...);
201template <
typename... UnitTags>
205 static constexpr std::size_t
Size =
sizeof...(UnitTags);
236 template <std::
size_t N>
238 constexpr auto Get()
const {
239 using T = std::tuple_element_t<N, UnitTuple>;
240 return units::unit_t<T>(map[N]);
258 constexpr auto X() const
265 constexpr auto Y() const
272 constexpr auto Z() const
279 constexpr auto W() const
290 m.print_impl(os, std::make_index_sequence<Size>{});
296 template <std::size_t... Is>
297 void print_impl(std::ostream& os, std::index_sequence<Is...>)
const {
298 ((os << units::unit_t<std::tuple_element_t<Is, UnitTuple>>(map[Is]).value() << (Is ==
Size - 1 ?
"" :
", ")), ...);
A non-owning, read-only unit-safe view over a const double* buffer.
Definition UnitMap.h:202
constexpr auto W() const
Access the fourth element (w).
Definition UnitMap.h:279
ConstUnitMap & operator=(ConstUnitMap &&)=default
Move assignment.
constexpr auto X() const
Access the first element (x).
Definition UnitMap.h:258
static constexpr std::size_t Size
Definition UnitMap.h:205
UnitVector< UnitTags... > ToVector() const
Produce an owned UnitVector copy of the mapped data.
Definition UnitMap.h:250
ConstUnitMap(const double *ptr)
Construct a read-only view over a raw buffer.
Definition UnitMap.h:217
constexpr auto Z() const
Access the third element (z).
Definition UnitMap.h:272
ConstUnitMap(ConstUnitMap &&)=default
Move constructor.
Eigen::Map< const StorageType > ConstMapType
Definition UnitMap.h:209
constexpr auto Y() const
Access the second element (y).
Definition UnitMap.h:265
ConstMapType Raw() const
Definition UnitMap.h:244
std::tuple< UnitTags... > UnitTuple
Definition UnitMap.h:211
friend std::ostream & operator<<(std::ostream &os, const ConstUnitMap &m)
Debug printing support.
Definition UnitMap.h:288
constexpr auto Get() const
Get the N-th element with its unit.
Definition UnitMap.h:238
ConstUnitMap(const UnitMap< UnitTags... > &m)
Construct from a mutable UnitMap (const widening).
Definition UnitMap.h:223
Eigen::Matrix< double, Size, 1 > StorageType
Definition UnitMap.h:207
A non-owning, unit-safe view over a raw double* buffer.
Definition UnitMap.h:18
constexpr auto Get() const
Get the N-th element with its unit.
Definition UnitMap.h:61
void Z(units::unit_t< std::tuple_element_t< Size >=3 ? 2 :0, UnitTuple > > val)
Set the third element (z).
Definition UnitMap.h:154
Eigen::Matrix< double, Size, 1 > StorageType
Definition UnitMap.h:23
MapType Raw()
Mutable access to the underlying Eigen map.
Definition UnitMap.h:70
std::tuple< UnitTags... > UnitTuple
Definition UnitMap.h:29
void Set(units::unit_t< std::tuple_element_t< N, UnitTuple > > val)
Set the N-th element, writing through to the buffer.
Definition UnitMap.h:83
constexpr auto W() const
Access the fourth element (w).
Definition UnitMap.h:161
void X(units::unit_t< std::tuple_element_t< Size >=1 ? 0 :0, UnitTuple > > val)
Set the first element (x).
Definition UnitMap.h:126
constexpr auto X() const
Access the first element (x).
Definition UnitMap.h:119
UnitVector< UnitTags... > ToVector() const
Produce an owned UnitVector copy of the mapped data.
Definition UnitMap.h:107
constexpr auto Y() const
Access the second element (y).
Definition UnitMap.h:133
ConstMapType Raw() const
Read-only access to the underlying Eigen map.
Definition UnitMap.h:67
Eigen::Map< StorageType > MapType
Definition UnitMap.h:25
UnitMap & operator=(UnitMap &&)=default
Move assignment.
void W(units::unit_t< std::tuple_element_t< Size >=4 ? 3 :0, UnitTuple > > val)
Set the fourth element (w).
Definition UnitMap.h:168
static constexpr std::size_t Size
Definition UnitMap.h:21
friend std::ostream & operator<<(std::ostream &os, const UnitMap &m)
Debug printing support.
Definition UnitMap.h:181
Eigen::Map< const StorageType > ConstMapType
Definition UnitMap.h:27
constexpr auto Z() const
Access the third element (z).
Definition UnitMap.h:147
void Y(units::unit_t< std::tuple_element_t< Size >=2 ? 1 :0, UnitTuple > > val)
Set the second element (y).
Definition UnitMap.h:140
UnitMap(double *ptr)
Construct a mutable view over a raw buffer.
Definition UnitMap.h:39
UnitMap & operator=(const UnitVector< OtherTags... > &vec)
Assign all values from a compatible UnitVector, writing through.
Definition UnitMap.h:92
UnitMap(UnitMap &&)=default
Move constructor.
A vector wrapper that enforces units for each element.
Definition UnitVector.h:22
Concept verifying that two tuple-based unit types match exactly.
Definition Common.h:216
Concept verifying that index N is within the bounds of a pack.
Definition Common.h:192