12#ifndef EIGEN_TENSOR_TENSORSTORAGE_H
13#define EIGEN_TENSOR_TENSORSTORAGE_H
15#ifdef EIGEN_TENSOR_STORAGE_CTOR_PLUGIN
16#define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN EIGEN_TENSOR_STORAGE_CTOR_PLUGIN;
18#define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
22#include "./InternalHeaderCheck.h"
37template <
typename T,
typename Dimensions,
int Options>
41template <
typename T,
typename FixedDimensions,
int Options_>
44 static constexpr std::size_t Size = FixedDimensions::total_size;
47 static constexpr std::size_t MinSize = max_n_1<Size>::size;
48 EIGEN_ALIGN_MAX T m_data[MinSize];
51 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStorage() {}
53 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* data() {
return m_data; }
54 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T* data()
const {
return m_data; }
56 constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const FixedDimensions dimensions()
const {
return FixedDimensions(); }
58 constexpr EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex size()
const {
return Size; }
62template <
typename T,
typename IndexType,
int NumIndices_,
int Options_>
63class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> {
65 typedef IndexType Index;
66 typedef DSizes<IndexType, NumIndices_> Dimensions;
67 typedef TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> Self;
69 EIGEN_DEVICE_FUNC TensorStorage() : m_data(0), m_dimensions() {
70 EIGEN_IF_CONSTEXPR (NumIndices_ == 0) {
71 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(1);
74 EIGEN_DEVICE_FUNC TensorStorage(Index size,
const array<Index, NumIndices_>& dimensions)
75 : m_data(internal::conditional_aligned_new_auto<T, (Options_ &
DontAlign) == 0>(size)), m_dimensions(dimensions) {
76 EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
79 template <
typename... DenseIndex>
80 EIGEN_DEVICE_FUNC TensorStorage(DenseIndex... indices) : m_dimensions(indices...) {
81 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(internal::array_prod(m_dimensions));
84 EIGEN_DEVICE_FUNC TensorStorage(
const Self& other)
85 : m_data(internal::conditional_aligned_new_auto<T, (Options_ &
DontAlign) == 0>(
86 internal::array_prod(other.m_dimensions))),
87 m_dimensions(other.m_dimensions) {
88 internal::smart_copy(other.m_data, other.m_data + internal::array_prod(other.m_dimensions), m_data);
90 EIGEN_DEVICE_FUNC Self& operator=(
const Self& other) {
98 EIGEN_DEVICE_FUNC TensorStorage(Self&& other) : TensorStorage() { *
this = std::move(other); }
100 EIGEN_DEVICE_FUNC Self& operator=(Self&& other) {
101 numext::swap(m_data, other.m_data);
102 numext::swap(m_dimensions, other.m_dimensions);
106 EIGEN_DEVICE_FUNC ~TensorStorage() {
107 internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data,
108 internal::array_prod(m_dimensions));
110 EIGEN_DEVICE_FUNC
void swap(Self& other) {
111 numext::swap(m_data, other.m_data);
112 numext::swap(m_dimensions, other.m_dimensions);
115 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Dimensions& dimensions()
const {
return m_dimensions; }
117 EIGEN_DEVICE_FUNC
void resize(Index size,
const array<Index, NumIndices_>& nbDimensions) {
118 const Index currentSz = internal::array_prod(m_dimensions);
119 if (size != currentSz) {
120 internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, currentSz);
122 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size);
123 else EIGEN_IF_CONSTEXPR (NumIndices_ == 0) {
124 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(1);
127 EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
129 m_dimensions = nbDimensions;
132 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* data() {
return m_data; }
133 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T* data()
const {
return m_data; }
135 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size()
const {
return m_dimensions.TotalSize(); }
139 Dimensions m_dimensions;
Namespace containing all symbols from the Eigen library.