PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
Eigen.h
Go to the documentation of this file.
1
9
10#ifndef PBAT_COMMON_EIGEN_H
11#define PBAT_COMMON_EIGEN_H
12
13#include "Concepts.h"
14
15#include <pbat/Aliases.h>
16#include <ranges>
17
18namespace pbat {
19namespace common {
20
27template <CContiguousArithmeticRange R>
28auto ToEigen(R&& r)
29 -> Eigen::Map<Eigen::Vector<std::ranges::range_value_t<R>, Eigen::Dynamic> const>
30{
31 namespace rng = std::ranges;
32 return Eigen::Map<Eigen::Vector<std::ranges::range_value_t<R>, Eigen::Dynamic> const>(
33 rng::data(r),
34 static_cast<Eigen::Index>(rng::size(r)));
35}
36
43template <CContiguousArithmeticMatrixRange R>
44auto ToEigen(R&& r) -> Eigen::Map<Eigen::Matrix<
45 typename std::ranges::range_value_t<R>::Scalar,
46 Eigen::Dynamic,
47 Eigen::Dynamic> const>
48{
49 namespace rng = std::ranges;
50 using ValueType = rng::range_value_t<R>;
51 using ScalarType = typename ValueType::Scalar;
52 auto rows = ValueType::RowsAtCompileTime;
53 auto cols = ValueType::ColsAtCompileTime;
54 if constexpr (ValueType::Flags & Eigen::RowMajorBit)
55 std::swap(rows, cols);
56
57 return Eigen::Map<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic> const>(
58 static_cast<ScalarType const*>(std::addressof(rng::data(r)[0][0])),
59 rows,
60 static_cast<Eigen::Index>(rng::size(r)) * static_cast<int>(cols));
61}
62
63namespace detail {
64
65template <std::ranges::random_access_range R>
66struct Slice
67{
68 Slice(R&& _r) : r(std::forward<R>(_r)) {}
69
70 Index size() const { return static_cast<Index>(std::ranges::size(r)); }
71 Index operator[](Index i) const { return static_cast<Index>(r[i]); }
72
73 std::remove_cvref_t<R> r;
74};
75
76} // namespace detail
77
85template <std::ranges::random_access_range R>
86auto Slice(R&& r)
87{
88 return detail::Slice<R>(std::forward<R>(r));
89}
90
91} // namespace common
92} // namespace pbat
93
94#endif // PBAT_COMMON_EIGEN_H
Concepts for common types.
Common functionality.
Definition ArgSort.h:20
auto Slice(R &&r)
Slice view over a range for Eigen advanced indexing.
Definition Eigen.h:86
auto ToEigen(R &&r) -> Eigen::Map< Eigen::Vector< std::ranges::range_value_t< R >, Eigen::Dynamic > const >
Map a range of scalars to an eigen vector of such scalars.
Definition Eigen.h:28
The main namespace of the library.
Definition Aliases.h:15
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17