14template <Eigen::Index R>
16 R == Eigen::Dynamic ? std::dynamic_extent :
static_cast<size_t>(R);
19 E == std::dynamic_extent ? Eigen::Dynamic :
static_cast<Eigen::Index
>(E);
26template <
class Derived>
27 requires(Derived::ColsAtCompileTime == 1 &&
28 Derived::InnerStrideAtCompileTime == 1)
29auto as_span(Eigen::DenseBase<Derived> &v) {
31 using T = std::remove_pointer_t<
decltype(v.derived().data())>;
32 return std::span<T, E>{v.derived().data(),
static_cast<size_t>(v.size())};
36template <
class Derived>
37 requires(Derived::ColsAtCompileTime == 1 &&
38 Derived::InnerStrideAtCompileTime == 1)
39auto as_span(Eigen::DenseBase<Derived> &&v) {
40 using PlainObjectBase = Eigen::PlainObjectBase<std::decay_t<Derived>>;
41 static_assert(!std::is_base_of_v<PlainObjectBase, std::decay_t<Derived>>,
42 "Refusing to return a span to a temporary Eigen vector with "
45 using T = std::remove_pointer_t<
decltype(v.derived().data())>;
46 return std::span<T, E>{v.derived().data(),
static_cast<size_t>(v.size())};
50template <
class Derived>
51 requires(Derived::ColsAtCompileTime == 1 &&
52 Derived::InnerStrideAtCompileTime == 1)
53auto as_span(
const Eigen::DenseBase<Derived> &v) {
55 using T = std::remove_pointer_t<
decltype(v.derived().data())>;
56 return std::span<T, E>{v.derived().data(),
static_cast<size_t>(v.size())};
61template <
class T,
size_t E>
64 using S = std::remove_const_t<T>;
65 using V = Eigen::Vector<S, R>;
66 using Map = Eigen::Map<std::conditional_t<std::is_const_v<T>,
const V, V>>;
67 if constexpr (R == Eigen::Dynamic)
68 return Map{s.data(),
static_cast<Eigen::Index
>(s.size())};
73template <
class T,
size_t E>
74[[deprecated(
"use as_eigen instead")]]
auto as_vec(std::span<T, E> s) {
auto as_span(Eigen::DenseBase< Derived > &v)
Convert an Eigen vector view to a std::span.
auto as_vec(std::span< T, E > s)
auto as_eigen(std::span< T, E > s)
Convert a std::span to an Eigen::Vector view.
constexpr auto to_eigen_extent
constexpr auto to_std_extent