27 #ifndef EIGEN_MATRIXSTORAGE_H
28 #define EIGEN_MATRIXSTORAGE_H
30 #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
31 #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
33 #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
40 struct constructor_without_unaligned_array_assert {};
46 template <
typename T,
int Size,
int MatrixOrArrayOptions,
47 int Alignment = (MatrixOrArrayOptions&
DontAlign) ? 0
48 : (((Size*
sizeof(T))%16)==0) ? 16
54 plain_array(constructor_without_unaligned_array_assert) {}
57 #ifdef EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
58 #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
60 #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
61 eigen_assert((reinterpret_cast<size_t>(array) & sizemask) == 0 \
62 && "this assertion is explained here: " \
63 "http://eigen.tuxfamily.org/dox-devel/TopicUnalignedArrayAssert.html" \
64 " **** READ THIS WEB PAGE !!! ****");
67 template <
typename T,
int Size,
int MatrixOrArrayOptions>
68 struct plain_array<T, Size, MatrixOrArrayOptions, 16>
72 plain_array(constructor_without_unaligned_array_assert) {}
75 template <
typename T,
int MatrixOrArrayOptions,
int Alignment>
76 struct plain_array<T, 0, MatrixOrArrayOptions, Alignment>
80 plain_array(constructor_without_unaligned_array_assert) {}
97 template<
typename T,
int Size,
int _Rows,
int _Cols,
int _Options>
class DenseStorage;
100 template<
typename T,
int Size,
int _Rows,
int _Cols,
int _Options>
class DenseStorage
102 internal::plain_array<T,Size,_Options> m_data;
105 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
106 : m_data(internal::constructor_without_unaligned_array_assert()) {}
113 inline const T *
data()
const {
return m_data.array; }
114 inline T *
data() {
return m_data.array; }
118 template<
typename T,
int _Rows,
int _Cols,
int _Options>
class DenseStorage<T, 0, _Rows, _Cols, _Options>
121 inline explicit DenseStorage() {}
122 inline DenseStorage(internal::constructor_without_unaligned_array_assert) {}
124 inline void swap(DenseStorage& ) {}
125 static inline DenseIndex rows(
void) {
return _Rows;}
126 static inline DenseIndex cols(
void) {
return _Cols;}
129 inline const T *data()
const {
return 0; }
130 inline T *data() {
return 0; }
134 template<
typename T,
int _Options>
class DenseStorage<T, 0, Dynamic, Dynamic, _Options>
135 :
public DenseStorage<T, 0, 0, 0, _Options> { };
137 template<
typename T,
int _Rows,
int _Options>
class DenseStorage<T, 0, _Rows, Dynamic, _Options>
138 :
public DenseStorage<T, 0, 0, 0, _Options> { };
140 template<
typename T,
int _Cols,
int _Options>
class DenseStorage<T, 0, Dynamic, _Cols, _Options>
141 :
public DenseStorage<T, 0, 0, 0, _Options> { };
144 template<
typename T,
int Size,
int _Options>
class DenseStorage<T, Size, Dynamic, Dynamic, _Options>
146 internal::plain_array<T,Size,_Options> m_data;
150 inline explicit DenseStorage() : m_rows(0), m_cols(0) {}
151 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
152 : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {}
154 inline void swap(DenseStorage& other)
155 { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }
156 inline DenseIndex rows(
void)
const {
return m_rows;}
157 inline DenseIndex cols(
void)
const {
return m_cols;}
160 inline const T *data()
const {
return m_data.array; }
161 inline T *data() {
return m_data.array; }
165 template<
typename T,
int Size,
int _Cols,
int _Options>
class DenseStorage<T, Size, Dynamic, _Cols, _Options>
167 internal::plain_array<T,Size,_Options> m_data;
170 inline explicit DenseStorage() : m_rows(0) {}
171 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
172 : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {}
174 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }
175 inline DenseIndex rows(
void)
const {
return m_rows;}
176 inline DenseIndex cols(
void)
const {
return _Cols;}
179 inline const T *data()
const {
return m_data.array; }
180 inline T *data() {
return m_data.array; }
184 template<
typename T,
int Size,
int _Rows,
int _Options>
class DenseStorage<T, Size, _Rows, Dynamic, _Options>
186 internal::plain_array<T,Size,_Options> m_data;
189 inline explicit DenseStorage() : m_cols(0) {}
190 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
191 : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {}
193 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }
194 inline DenseIndex rows(
void)
const {
return _Rows;}
195 inline DenseIndex cols(
void)
const {
return m_cols;}
198 inline const T *data()
const {
return m_data.array; }
199 inline T *data() {
return m_data.array; }
203 template<
typename T,
int _Options>
class DenseStorage<T, Dynamic, Dynamic, Dynamic, _Options>
209 inline explicit DenseStorage() : m_data(0), m_rows(0), m_cols(0) {}
210 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
211 : m_data(0), m_rows(0), m_cols(0) {}
215 inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols); }
216 inline void swap(DenseStorage& other)
217 { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }
218 inline DenseIndex rows(
void)
const {
return m_rows;}
219 inline DenseIndex cols(
void)
const {
return m_cols;}
222 m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*m_cols);
228 if(size != m_rows*m_cols)
230 internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols);
232 m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
240 inline const T *data()
const {
return m_data; }
241 inline T *data() {
return m_data; }
245 template<
typename T,
int _Rows,
int _Options>
class DenseStorage<T, Dynamic, _Rows, Dynamic, _Options>
250 inline explicit DenseStorage() : m_data(0), m_cols(0) {}
251 inline DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}
254 inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols); }
255 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }
256 static inline DenseIndex rows(
void) {
return _Rows;}
257 inline DenseIndex cols(
void)
const {
return m_cols;}
260 m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, _Rows*m_cols);
265 if(size != _Rows*m_cols)
267 internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols);
269 m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
276 inline const T *data()
const {
return m_data; }
277 inline T *data() {
return m_data; }
281 template<
typename T,
int _Cols,
int _Options>
class DenseStorage<T, Dynamic, Dynamic, _Cols, _Options>
286 inline explicit DenseStorage() : m_data(0), m_rows(0) {}
287 inline DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}
290 inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows); }
291 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }
292 inline DenseIndex rows(
void)
const {
return m_rows;}
293 static inline DenseIndex cols(
void) {
return _Cols;}
296 m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*_Cols);
301 if(size != m_rows*_Cols)
303 internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows);
305 m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
312 inline const T *data()
const {
return m_data; }
313 inline T *data() {
return m_data; }
318 #endif // EIGEN_MATRIX_H