11#ifndef EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
12#define EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
14#ifdef EIGEN_TENSOR_STORAGE_CTOR_PLUGIN
15#define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN EIGEN_TENSOR_STORAGE_CTOR_PLUGIN;
17#define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
21#include "./InternalHeaderCheck.h"
36template <
typename T,
typename Dimensions,
int Options>
40template <
typename T,
typename FixedDimensions,
int Options_>
43 static constexpr std::size_t Size = FixedDimensions::total_size;
46 static constexpr std::size_t MinSize = max_n_1<Size>::size;
47 EIGEN_ALIGN_MAX T m_data[MinSize];
50 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorStorage() {}
52 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* data() {
return m_data; }
53 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T* data()
const {
return m_data; }
55 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const FixedDimensions dimensions()
const {
return FixedDimensions(); }
57 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE DenseIndex size()
const {
return Size; }
61template <
typename T,
typename IndexType,
int NumIndices_,
int Options_>
62class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> {
64 typedef IndexType
Index;
65 typedef DSizes<IndexType, NumIndices_> Dimensions;
66 typedef TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> Self;
68 EIGEN_DEVICE_FUNC TensorStorage() : m_data(0), m_dimensions() {
69 if (NumIndices_ == 0) {
70 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(1);
73 EIGEN_DEVICE_FUNC TensorStorage(
Index size,
const array<Index, NumIndices_>& dimensions)
74 : m_data(internal::conditional_aligned_new_auto<T, (Options_ &
DontAlign) == 0>(size)), m_dimensions(dimensions) {
75 EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
78 template <
typename... DenseIndex>
79 EIGEN_DEVICE_FUNC TensorStorage(DenseIndex... indices) : m_dimensions(indices...) {
80 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(internal::array_prod(m_dimensions));
83 EIGEN_DEVICE_FUNC TensorStorage(
const Self& other)
84 : m_data(internal::conditional_aligned_new_auto<T, (Options_ &
DontAlign) == 0>(
85 internal::array_prod(other.m_dimensions))),
86 m_dimensions(other.m_dimensions) {
87 internal::smart_copy(other.m_data, other.m_data + internal::array_prod(other.m_dimensions), m_data);
89 EIGEN_DEVICE_FUNC Self& operator=(
const Self& other) {
97 EIGEN_DEVICE_FUNC TensorStorage(Self&& other) : TensorStorage() { *
this = std::move(other); }
99 EIGEN_DEVICE_FUNC Self& operator=(Self&& other) {
100 numext::swap(m_data, other.m_data);
101 numext::swap(m_dimensions, other.m_dimensions);
105 EIGEN_DEVICE_FUNC ~TensorStorage() {
106 internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data,
107 internal::array_prod(m_dimensions));
109 EIGEN_DEVICE_FUNC
void swap(Self& other) {
110 numext::swap(m_data, other.m_data);
111 numext::swap(m_dimensions, other.m_dimensions);
114 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const Dimensions& dimensions()
const {
return m_dimensions; }
116 EIGEN_DEVICE_FUNC
void resize(
Index size,
const array<Index, NumIndices_>& nbDimensions) {
117 const Index currentSz = internal::array_prod(m_dimensions);
118 if (size != currentSz) {
119 internal::conditional_aligned_delete_auto<T, (Options_ & DontAlign) == 0>(m_data, currentSz);
121 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(size);
122 else if (NumIndices_ == 0) {
123 m_data = internal::conditional_aligned_new_auto<T, (Options_ & DontAlign) == 0>(1);
126 EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
128 m_dimensions = nbDimensions;
131 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T* data() {
return m_data; }
132 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
const T* data()
const {
return m_data; }
134 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
Index size()
const {
return m_dimensions.TotalSize(); }
138 Dimensions m_dimensions;
Namespace containing all symbols from the Eigen library.
std::enable_if_t< std::is_base_of< DenseBase< std::decay_t< DerivedA > >, std::decay_t< DerivedA > >::value &&std::is_base_of< DenseBase< std::decay_t< DerivedB > >, std::decay_t< DerivedB > >::value, void > swap(DerivedA &&a, DerivedB &&b)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index