10template <Eigen::Index R>
12 R == Eigen::Dynamic ? std::dynamic_extent :
static_cast<size_t>(R);
15 E == std::dynamic_extent ? Eigen::Dynamic :
static_cast<Eigen::Index
>(E);
19template <
class Derived>
20 requires(Derived::ColsAtCompileTime == 1)
21auto as_span(Eigen::DenseBase<Derived> &v) {
23 using T = std::remove_pointer_t<
decltype(v.derived().data())>;
24 return std::span<T, E>{v.derived().data(),
static_cast<size_t>(v.size())};
28template <
class Derived>
29 requires(Derived::ColsAtCompileTime == 1)
30auto as_span(Eigen::DenseBase<Derived> &&v) {
31 using PlainObjectBase = Eigen::PlainObjectBase<std::decay_t<Derived>>;
32 static_assert(!std::is_base_of_v<PlainObjectBase, std::decay_t<Derived>>,
33 "Refusing to return a span to a temporary Eigen vector with "
36 using T = std::remove_pointer_t<
decltype(v.derived().data())>;
37 return std::span<T, E>{v.derived().data(),
static_cast<size_t>(v.size())};
41template <
class Derived>
42 requires(Derived::ColsAtCompileTime == 1)
43auto as_span(
const Eigen::DenseBase<Derived> &v) {
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 T,
size_t E>
53 using S = std::remove_const_t<T>;
54 using V = Eigen::Vector<S, R>;
55 using Map = Eigen::Map<std::conditional_t<std::is_const_v<T>,
const V, V>>;
56 if constexpr (R == Eigen::Dynamic)
57 return Map{s.data(),
static_cast<Eigen::Index
>(s.size())};
constexpr auto to_std_extent
constexpr auto to_eigen_extent
auto as_span(Eigen::DenseBase< Derived > &v)
Convert an Eigen vector view to a std::span.
auto as_vec(std::span< T, E > s)
Convert a std::span to an Eigen::Vector view.