1130 *(dst.data + dst.offset) = *(src.data + src.offset);
1138 int inner_dim =
IsColMajor ? 0 : NumDims - 1;
1140 eigen_assert(dst.strides[inner_dim] == 1 || dst.strides[inner_dim] == 0);
1141 eigen_assert(src.strides[inner_dim] == 1 || src.strides[inner_dim] == 0);
1160 int num_size_one_inner_dims = 0;
1161 for (
int i = 0;
i < num_squeezable_dims; ++
i) {
1163 if (dst.dims[dst_dim] != 1)
break;
1164 num_size_one_inner_dims++;
1168 if (num_size_one_inner_dims == NumDims) {
1169 *(dst.data + dst.offset) = *(src.data + src.offset);
1174 const int dst_stride1_dim =
IsColMajor ? num_size_one_inner_dims : NumDims - num_size_one_inner_dims - 1;
1177 const int src_dim_for_dst_stride1_dim = NumDims == 0 ? 1 : dim_map[dst_stride1_dim];
1180 IndexType dst_inner_dim_size = NumDims == 0 ? 1 : dst.dims[dst_stride1_dim];
1184 for (
int i = num_size_one_inner_dims + 1;
i < num_squeezable_dims; ++
i) {
1186 const IndexType dst_stride = dst.strides[dst_dim];
1187 const IndexType src_stride = src.strides[dim_map[dst_dim]];
1188 if (dst_inner_dim_size == dst_stride && dst_stride == src_stride) {
1189 dst_inner_dim_size *= dst.dims[dst_dim];
1190 ++num_size_one_inner_dims;
1197 IndexType input_offset = src.offset;
1198 IndexType output_offset = dst.offset;
1199 IndexType input_stride = NumDims == 0 ? 1 : src.strides[src_dim_for_dst_stride1_dim];
1200 IndexType output_stride = NumDims == 0 ? 1 : dst.strides[dst_stride1_dim];
1202 const int at_least_1_dim = NumDims <= 1 ? 1 : NumDims - 1;
1203 array<BlockIteratorState, at_least_1_dim> it;
1207 for (
int i = num_size_one_inner_dims;
i < NumDims - 1; ++
i) {
1208 const int dst_dim =
IsColMajor ?
i + 1 : NumDims -
i - 2;
1209 if (dst.dims[dst_dim] == 1)
continue;
1211 it[idx].size = dst.dims[dst_dim];
1212 it[idx].input_stride = src.strides[dim_map[dst_dim]];
1213 it[idx].output_stride = dst.strides[dst_dim];
1215 it[idx].input_span = it[idx].input_stride * (it[idx].size - 1);
1216 it[idx].output_span = it[idx].output_stride * (it[idx].size - 1);
1222 const IndexType block_total_size = NumDims == 0 ? 1 : dst.dims.TotalSize();
1224 #define COPY_INNER_DIM(KIND) \
1225 IndexType num_copied = 0; \
1226 for (num_copied = 0; num_copied < block_total_size; num_copied += dst_inner_dim_size) { \
1227 LinCopy::template Run<KIND>(typename LinCopy::Dst(output_offset, output_stride, dst.data), \
1228 typename LinCopy::Src(input_offset, input_stride, src.data), dst_inner_dim_size); \
1230 for (int j = 0; j < idx; ++j) { \
1231 if (++it[j].count < it[j].size) { \
1232 input_offset += it[j].input_stride; \
1233 output_offset += it[j].output_stride; \
1237 input_offset -= it[j].input_span; \
1238 output_offset -= it[j].output_span; \
1243 if (input_stride == 1 && output_stride == 1) {
1245 }
else if (input_stride == 1 && output_stride != 1) {
1247 }
else if (input_stride == 0 && output_stride == 1) {
1249 }
else if (input_stride == 0 && output_stride != 1) {
1251 }
else if (output_stride == 1) {
1257 #undef COPY_INNER_DIM
#define EIGEN_UNUSED_VARIABLE(var)
Definition: Macros.h:966
#define eigen_assert(x)
Definition: Macros.h:910
#define COPY_INNER_DIM(KIND)
static int NumSqueezableInnerDims(const DimensionsMap &dim_map)
Definition: TensorBlock.h:1283
static constexpr bool IsColMajor
Definition: TensorBlock.h:1094
References COPY_INNER_DIM, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Dst::data, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Src::data, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Dst::dims, eigen_assert, EIGEN_UNUSED_VARIABLE, Eigen::internal::StridedLinearBufferCopy< Scalar, IndexType >::FillLinear, Eigen::internal::StridedLinearBufferCopy< Scalar, IndexType >::FillScatter, Eigen::internal::StridedLinearBufferCopy< Scalar, IndexType >::Gather, i, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::IsColMajor, Eigen::internal::StridedLinearBufferCopy< Scalar, IndexType >::Linear, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::NumSqueezableInnerDims(), Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Dst::offset, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Src::offset, Eigen::internal::StridedLinearBufferCopy< Scalar, IndexType >::Random, Eigen::internal::StridedLinearBufferCopy< Scalar, IndexType >::Scatter, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Dst::strides, Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Src::strides, and Eigen::DSizes< DenseIndex, NumDims >::TotalSize().
Referenced by Eigen::internal::TensorBlockIO< Scalar, IndexType, NumDims, Layout >::Copy(), and Eigen::internal::TensorMaterializedBlock< Scalar, NumDims, Layout, IndexType >::materialize().