14#include "./InternalHeaderCheck.h"
20template <
typename Xpr>
21struct eigen_fill_helper : std::false_type {};
23template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
24struct eigen_fill_helper<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>> : std::true_type {};
26template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
27struct eigen_fill_helper<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>> : std::true_type {};
29template <
typename Xpr,
int BlockRows,
int BlockCols>
30struct eigen_fill_helper<Block<Xpr, BlockRows, BlockCols, true>> : eigen_fill_helper<Xpr> {};
32template <
typename Xpr,
int BlockRows,
int BlockCols>
33struct eigen_fill_helper<Block<Xpr, BlockRows, BlockCols, false>>
34 : std::integral_constant<bool, eigen_fill_helper<Xpr>::value &&
35 (Xpr::IsRowMajor ? (BlockRows == 1) : (BlockCols == 1))> {};
37template <
typename Xpr,
int Options>
38struct eigen_fill_helper<Map<Xpr, Options, Stride<0, 0>>> : eigen_fill_helper<Xpr> {};
40template <
typename Xpr,
int Options,
int OuterStr
ide_>
41struct eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 0>>>
42 : std::integral_constant<bool, eigen_fill_helper<Xpr>::value &&
43 enum_eq_not_dynamic(OuterStride_, Xpr::InnerSizeAtCompileTime)> {};
45template <
typename Xpr,
int Options,
int OuterStr
ide_>
46struct eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 1>>>
47 : eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 0>>> {};
49template <
typename Xpr,
int Options,
int InnerStr
ide_>
50struct eigen_fill_helper<Map<Xpr, Options, InnerStride<InnerStride_>>>
51 : eigen_fill_helper<Map<Xpr, Options, Stride<0, InnerStride_>>> {};
53template <
typename Xpr,
int Options,
int OuterStr
ide_>
54struct eigen_fill_helper<Map<Xpr, Options, OuterStride<OuterStride_>>>
55 : eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 0>>> {};
57template <
typename Xpr>
58struct eigen_fill_impl<Xpr, false> {
59 using Scalar =
typename Xpr::Scalar;
60 using Func = scalar_constant_op<Scalar>;
61 using PlainObject =
typename Xpr::PlainObject;
62 using Constant =
typename PlainObject::ConstantReturnType;
63 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
constexpr void run(Xpr& dst,
const Scalar& val) {
64 const Constant src(dst.rows(), dst.cols(), val);
67 template <
typename SrcXpr>
68 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
constexpr void run(Xpr& dst,
const SrcXpr& src) {
69 call_dense_assignment_loop(dst, src, assign_op<Scalar, Scalar>());
73#if EIGEN_COMP_MSVC || defined(EIGEN_GPU_COMPILE_PHASE)
74template <
typename Xpr>
75struct eigen_fill_impl<Xpr, true> : eigen_fill_impl<Xpr, false> {};
77template <
typename Xpr>
78struct eigen_fill_impl<Xpr, true> {
79 using Scalar =
typename Xpr::Scalar;
80 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst,
const Scalar& val) {
81 const Scalar val_copy = val;
83 fill_n(dst.data(), dst.size(), val_copy);
85 template <
typename SrcXpr>
86 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst,
const SrcXpr& src) {
87 resize_if_allowed(dst, src, assign_op<Scalar, Scalar>());
88 const Scalar& val = src.functor()();
94template <
typename Xpr>
95struct eigen_memset_helper {
96 static constexpr bool value =
97 std::is_trivially_copyable<typename Xpr::Scalar>::value && eigen_fill_helper<Xpr>::value;
100template <
typename Xpr>
101struct eigen_zero_impl<Xpr, false> {
102 using Scalar =
typename Xpr::Scalar;
103 using PlainObject =
typename Xpr::PlainObject;
104 using Zero =
typename PlainObject::ZeroReturnType;
105 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
constexpr void run(Xpr& dst) {
106 const Zero src(dst.rows(), dst.cols());
109 template <
typename SrcXpr>
110 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
constexpr void run(Xpr& dst,
const SrcXpr& src) {
111 call_dense_assignment_loop(dst, src, assign_op<Scalar, Scalar>());
115template <
typename Xpr>
116struct eigen_zero_impl<Xpr, true> {
117 using Scalar =
typename Xpr::Scalar;
118 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst) {
119 const std::ptrdiff_t num_bytes = dst.size() *
static_cast<std::ptrdiff_t
>(
sizeof(Scalar));
120 if (num_bytes <= 0)
return;
121 void* dst_ptr =
static_cast<void*
>(dst.data());
122#ifndef EIGEN_NO_DEBUG
123 eigen_assert((dst_ptr !=
nullptr) &&
"null pointer dereference error!");
125 EIGEN_USING_STD(memset);
126 memset(dst_ptr, 0,
static_cast<std::size_t
>(num_bytes));
128 template <
typename SrcXpr>
129 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst,
const SrcXpr& src) {
130 resize_if_allowed(dst, src, assign_op<Scalar, Scalar>());
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1