15#include "./InternalHeaderCheck.h"
21template <
typename Xpr>
22struct eigen_fill_helper : std::false_type {};
27template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
28struct eigen_fill_helper<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>> : std::is_trivially_copyable<Scalar> {};
30template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
int MaxCols>
31struct eigen_fill_helper<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>> : std::is_trivially_copyable<Scalar> {};
33template <
typename Xpr,
int BlockRows,
int BlockCols>
34struct eigen_fill_helper<Block<Xpr, BlockRows, BlockCols, true>> : eigen_fill_helper<Xpr> {};
36template <
typename Xpr,
int BlockRows,
int BlockCols>
37struct eigen_fill_helper<Block<Xpr, BlockRows, BlockCols, false>>
38 : bool_constant<eigen_fill_helper<Xpr>::value && (Xpr::IsRowMajor ? (BlockRows == 1) : (BlockCols == 1))> {};
40template <
typename Xpr,
int Options>
41struct eigen_fill_helper<Map<Xpr, Options, Stride<0, 0>>> : eigen_fill_helper<Xpr> {};
43template <
typename Xpr,
int Options,
int OuterStr
ide_>
44struct eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 0>>>
45 : bool_constant<eigen_fill_helper<Xpr>::value && enum_eq_not_dynamic(OuterStride_, Xpr::InnerSizeAtCompileTime)> {};
47template <
typename Xpr,
int Options,
int OuterStr
ide_>
48struct eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 1>>>
49 : eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 0>>> {};
51template <
typename Xpr,
int Options,
int InnerStr
ide_>
52struct eigen_fill_helper<Map<Xpr, Options, InnerStride<InnerStride_>>>
53 : eigen_fill_helper<Map<Xpr, Options, Stride<0, InnerStride_>>> {};
55template <
typename Xpr,
int Options,
int OuterStr
ide_>
56struct eigen_fill_helper<Map<Xpr, Options, OuterStride<OuterStride_>>>
57 : eigen_fill_helper<Map<Xpr, Options, Stride<OuterStride_, 0>>> {};
59template <
typename Xpr>
60struct eigen_fill_impl<Xpr, false> {
61 using Scalar =
typename Xpr::Scalar;
62 using PlainObject =
typename Xpr::PlainObject;
63 using Constant =
typename PlainObject::ConstantReturnType;
64 static EIGEN_DEVICE_FUNC
constexpr void run(Xpr& dst,
const Scalar& val) {
65 const Constant src(dst.rows(), dst.cols(), val);
68 template <
typename SrcXpr>
69 static EIGEN_DEVICE_FUNC
constexpr void run(Xpr& dst,
const SrcXpr& src) {
70 call_dense_assignment_loop(dst, src, assign_op<Scalar, Scalar>());
74#if EIGEN_COMP_MSVC || defined(EIGEN_GPU_COMPILE_PHASE)
75template <
typename Xpr>
76struct eigen_fill_impl<Xpr, true> : eigen_fill_impl<Xpr, false> {};
78template <
typename Xpr>
79struct eigen_fill_impl<Xpr, true> {
80 using Scalar =
typename Xpr::Scalar;
81 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst,
const Scalar& val) {
82 const Scalar val_copy = val;
84 fill_n(dst.data(), dst.size(), val_copy);
86 template <
typename SrcXpr>
87 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst,
const SrcXpr& src) {
88 resize_if_allowed(dst, src, assign_op<Scalar, Scalar>());
89 const Scalar& val = src.functor()();
95template <
typename Xpr>
96struct eigen_memset_helper {
97 using Scalar =
typename Xpr::Scalar;
98 static constexpr bool value = std::is_trivially_copyable<Scalar>::value &&
99 !
static_cast<bool>(NumTraits<Scalar>::RequireInitialization) &&
100 eigen_fill_helper<Xpr>::value;
103template <
typename Xpr>
104struct eigen_zero_impl<Xpr, false> {
105 using Scalar =
typename Xpr::Scalar;
106 using PlainObject =
typename Xpr::PlainObject;
107 using Zero =
typename PlainObject::ZeroReturnType;
108 static EIGEN_DEVICE_FUNC
constexpr void run(Xpr& dst) {
109 const Zero src(dst.rows(), dst.cols());
112 template <
typename SrcXpr>
113 static EIGEN_DEVICE_FUNC
constexpr void run(Xpr& dst,
const SrcXpr& src) {
114 call_dense_assignment_loop(dst, src, assign_op<Scalar, Scalar>());
118template <
typename Xpr>
119struct eigen_zero_impl<Xpr, true> {
120 using Scalar =
typename Xpr::Scalar;
121 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst) {
122 Index size = dst.size();
123 EIGEN_IF_CONSTEXPR (Xpr::MaxSizeAtCompileTime != Dynamic) {
124 if (size > Xpr::MaxSizeAtCompileTime) {
125 eigen_internal_assert(
false &&
"invalid dense object size");
129 const std::ptrdiff_t num_bytes = size *
static_cast<std::ptrdiff_t
>(
sizeof(Scalar));
130 if (num_bytes <= 0)
return;
131 void* dst_ptr =
static_cast<void*
>(dst.data());
132#ifndef EIGEN_NO_DEBUG
133 eigen_assert((dst_ptr !=
nullptr) &&
"null pointer dereference error!");
135 EIGEN_USING_STD(memset);
136 memset(dst_ptr, 0,
static_cast<std::size_t
>(num_bytes));
138 template <
typename SrcXpr>
139 static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
void run(Xpr& dst,
const SrcXpr& src) {
140 resize_if_allowed(dst, src, assign_op<Scalar, Scalar>());