Eigen-unsupported  3.4.1 (git rev 28ded8800c26864e537852658428ab44c8399e87)
 
Loading...
Searching...
No Matches
TensorStorage.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2013 Christian Seiler <christian@iwakd.de>
5// Copyright (C) 2014-2015 Benoit Steiner <benoit.steiner.goog@gmail.com>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#ifndef EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
12#define EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
13
14#ifdef EIGEN_TENSOR_STORAGE_CTOR_PLUGIN
15 #define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN EIGEN_TENSOR_STORAGE_CTOR_PLUGIN;
16#else
17 #define EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN
18#endif
19
20namespace Eigen {
21
33template <typename T, typename Dimensions, int Options>
34class TensorStorage;
35
36// Pure fixed-size storage
37template<typename T, typename FixedDimensions, int Options_>
38class TensorStorage
39{
40 private:
41 static const std::size_t Size = FixedDimensions::total_size;
42
43 // Allocate an array of size at least one to prevent compiler warnings.
44 static const std::size_t MinSize = max_n_1<Size>::size;
45 EIGEN_ALIGN_MAX T m_data[MinSize];
46
47 public:
48 EIGEN_DEVICE_FUNC
49 EIGEN_STRONG_INLINE TensorStorage() {
50 }
51
52 EIGEN_DEVICE_FUNC
53 EIGEN_STRONG_INLINE T *data() { return m_data; }
54 EIGEN_DEVICE_FUNC
55 EIGEN_STRONG_INLINE const T *data() const { return m_data; }
56
57 EIGEN_DEVICE_FUNC
58 EIGEN_STRONG_INLINE const FixedDimensions dimensions() const { return FixedDimensions(); }
59
60 EIGEN_DEVICE_FUNC
61 EIGEN_STRONG_INLINE DenseIndex size() const { return Size; }
62};
63
64
65// pure dynamic
66template<typename T, typename IndexType, int NumIndices_, int Options_>
67class TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_>
68{
69 public:
70 typedef IndexType Index;
71 typedef DSizes<IndexType, NumIndices_> Dimensions;
72 typedef TensorStorage<T, DSizes<IndexType, NumIndices_>, Options_> Self;
73
74 EIGEN_DEVICE_FUNC TensorStorage() : m_data(0), m_dimensions() {
75 if (NumIndices_ == 0) {
76 m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(1);
77 }
78 }
79 EIGEN_DEVICE_FUNC TensorStorage(internal::constructor_without_unaligned_array_assert)
80 : m_data(0), m_dimensions(internal::template repeat<NumIndices_, Index>(0)) {}
81 EIGEN_DEVICE_FUNC TensorStorage(Index size, const array<Index, NumIndices_>& dimensions)
82 : m_data(internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(size)), m_dimensions(dimensions)
83 { EIGEN_INTERNAL_TENSOR_STORAGE_CTOR_PLUGIN }
84
85#if EIGEN_HAS_VARIADIC_TEMPLATES
86 template <typename... DenseIndex>
87 EIGEN_DEVICE_FUNC TensorStorage(DenseIndex... indices) : m_dimensions(indices...) {
88 m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(internal::array_prod(m_dimensions));
89 }
90#endif
91
92 EIGEN_DEVICE_FUNC TensorStorage(const Self& other)
93 : m_data(internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(internal::array_prod(other.m_dimensions)))
94 , m_dimensions(other.m_dimensions)
95 {
96 internal::smart_copy(other.m_data, other.m_data+internal::array_prod(other.m_dimensions), m_data);
97 }
98 EIGEN_DEVICE_FUNC Self& operator=(const Self& other)
99 {
100 if (this != &other) {
101 Self tmp(other);
102 this->swap(tmp);
103 }
104 return *this;
105 }
106
107#if EIGEN_HAS_RVALUE_REFERENCES
108 EIGEN_DEVICE_FUNC TensorStorage(Self&& other) : TensorStorage()
109 {
110 *this = std::move(other);
111 }
112
113 EIGEN_DEVICE_FUNC Self& operator=(Self&& other)
114 {
115 numext::swap(m_data, other.m_data);
116 numext::swap(m_dimensions, other.m_dimensions);
117 return *this;
118 }
119#endif
120
121 EIGEN_DEVICE_FUNC ~TensorStorage() { internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, internal::array_prod(m_dimensions)); }
122 EIGEN_DEVICE_FUNC void swap(Self& other)
123 { numext::swap(m_data,other.m_data); numext::swap(m_dimensions,other.m_dimensions); }
124
125 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Dimensions& dimensions() const {return m_dimensions;}
126
127 EIGEN_DEVICE_FUNC void resize(Index size, const array<Index, NumIndices_>& nbDimensions)
128 {
129 const Index currentSz = internal::array_prod(m_dimensions);
130 if(size != currentSz)
131 {
132 internal::conditional_aligned_delete_auto<T,(Options_&DontAlign)==0>(m_data, currentSz);
133 if (size)
134 m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(size);
135 else if (NumIndices_ == 0) {
136 m_data = internal::conditional_aligned_new_auto<T,(Options_&DontAlign)==0>(1);
137 }
138 else
139 m_data = 0;
140 EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN({})
141 }
142 m_dimensions = nbDimensions;
143 }
144
145 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE T *data() { return m_data; }
146 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const T *data() const { return m_data; }
147
148 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index size() const { return m_dimensions.TotalSize(); }
149
150 private:
151 T *m_data;
152 Dimensions m_dimensions;
153};
154
155} // end namespace Eigen
156
157#endif // EIGEN_CXX11_TENSOR_TENSORSTORAGE_H
Namespace containing all symbols from the Eigen library.
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index