00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef EIGEN_MATRIXSTORAGE_H
00028 #define EIGEN_MATRIXSTORAGE_H
00029
00030 #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
00031 #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
00032 #else
00033 #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
00034 #endif
00035
00036 namespace internal {
00037
00038 struct constructor_without_unaligned_array_assert {};
00039
00044 template <typename T, int Size, int MatrixOrArrayOptions,
00045 int Alignment = (MatrixOrArrayOptions&DontAlign) ? 0
00046 : (((Size*sizeof(T))%16)==0) ? 16
00047 : 0 >
00048 struct plain_array
00049 {
00050 T array[Size];
00051 plain_array() {}
00052 plain_array(constructor_without_unaligned_array_assert) {}
00053 };
00054
00055 #ifdef EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
00056 #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
00057 #else
00058 #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
00059 eigen_assert((reinterpret_cast<size_t>(array) & sizemask) == 0 \
00060 && "this assertion is explained here: " \
00061 "http://eigen.tuxfamily.org/dox-devel/TopicUnalignedArrayAssert.html" \
00062 " **** READ THIS WEB PAGE !!! ****");
00063 #endif
00064
00065 template <typename T, int Size, int MatrixOrArrayOptions>
00066 struct plain_array<T, Size, MatrixOrArrayOptions, 16>
00067 {
00068 EIGEN_USER_ALIGN16 T array[Size];
00069 plain_array() { EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(0xf) }
00070 plain_array(constructor_without_unaligned_array_assert) {}
00071 };
00072
00073 template <typename T, int MatrixOrArrayOptions, int Alignment>
00074 struct plain_array<T, 0, MatrixOrArrayOptions, Alignment>
00075 {
00076 EIGEN_USER_ALIGN16 T array[1];
00077 plain_array() {}
00078 plain_array(constructor_without_unaligned_array_assert) {}
00079 };
00080
00081 }
00082
00095 template<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseStorage;
00096
00097
00098 template<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseStorage
00099 {
00100 internal::plain_array<T,Size,_Options> m_data;
00101 public:
00102 inline explicit DenseStorage() {}
00103 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
00104 : m_data(internal::constructor_without_unaligned_array_assert()) {}
00105 inline DenseStorage(DenseIndex,DenseIndex,DenseIndex) {}
00106 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); }
00107 inline static DenseIndex rows(void) {return _Rows;}
00108 inline static DenseIndex cols(void) {return _Cols;}
00109 inline void conservativeResize(DenseIndex,DenseIndex,DenseIndex) {}
00110 inline void resize(DenseIndex,DenseIndex,DenseIndex) {}
00111 inline const T *data() const { return m_data.array; }
00112 inline T *data() { return m_data.array; }
00113 };
00114
00115
00116 template<typename T, int _Rows, int _Cols, int _Options> class DenseStorage<T, 0, _Rows, _Cols, _Options>
00117 {
00118 public:
00119 inline explicit DenseStorage() {}
00120 inline DenseStorage(internal::constructor_without_unaligned_array_assert) {}
00121 inline DenseStorage(DenseIndex,DenseIndex,DenseIndex) {}
00122 inline void swap(DenseStorage& ) {}
00123 inline static DenseIndex rows(void) {return _Rows;}
00124 inline static DenseIndex cols(void) {return _Cols;}
00125 inline void conservativeResize(DenseIndex,DenseIndex,DenseIndex) {}
00126 inline void resize(DenseIndex,DenseIndex,DenseIndex) {}
00127 inline const T *data() const { return 0; }
00128 inline T *data() { return 0; }
00129 };
00130
00131
00132 template<typename T, int Size, int _Options> class DenseStorage<T, Size, Dynamic, Dynamic, _Options>
00133 {
00134 internal::plain_array<T,Size,_Options> m_data;
00135 DenseIndex m_rows;
00136 DenseIndex m_cols;
00137 public:
00138 inline explicit DenseStorage() : m_rows(0), m_cols(0) {}
00139 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
00140 : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {}
00141 inline DenseStorage(DenseIndex, DenseIndex rows, DenseIndex cols) : m_rows(rows), m_cols(cols) {}
00142 inline void swap(DenseStorage& other)
00143 { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }
00144 inline DenseIndex rows(void) const {return m_rows;}
00145 inline DenseIndex cols(void) const {return m_cols;}
00146 inline void conservativeResize(DenseIndex, DenseIndex rows, DenseIndex cols) { m_rows = rows; m_cols = cols; }
00147 inline void resize(DenseIndex, DenseIndex rows, DenseIndex cols) { m_rows = rows; m_cols = cols; }
00148 inline const T *data() const { return m_data.array; }
00149 inline T *data() { return m_data.array; }
00150 };
00151
00152
00153 template<typename T, int Size, int _Cols, int _Options> class DenseStorage<T, Size, Dynamic, _Cols, _Options>
00154 {
00155 internal::plain_array<T,Size,_Options> m_data;
00156 DenseIndex m_rows;
00157 public:
00158 inline explicit DenseStorage() : m_rows(0) {}
00159 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
00160 : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {}
00161 inline DenseStorage(DenseIndex, DenseIndex rows, DenseIndex) : m_rows(rows) {}
00162 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }
00163 inline DenseIndex rows(void) const {return m_rows;}
00164 inline DenseIndex cols(void) const {return _Cols;}
00165 inline void conservativeResize(DenseIndex, DenseIndex rows, DenseIndex) { m_rows = rows; }
00166 inline void resize(DenseIndex, DenseIndex rows, DenseIndex) { m_rows = rows; }
00167 inline const T *data() const { return m_data.array; }
00168 inline T *data() { return m_data.array; }
00169 };
00170
00171
00172 template<typename T, int Size, int _Rows, int _Options> class DenseStorage<T, Size, _Rows, Dynamic, _Options>
00173 {
00174 internal::plain_array<T,Size,_Options> m_data;
00175 DenseIndex m_cols;
00176 public:
00177 inline explicit DenseStorage() : m_cols(0) {}
00178 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
00179 : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {}
00180 inline DenseStorage(DenseIndex, DenseIndex, DenseIndex cols) : m_cols(cols) {}
00181 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }
00182 inline DenseIndex rows(void) const {return _Rows;}
00183 inline DenseIndex cols(void) const {return m_cols;}
00184 inline void conservativeResize(DenseIndex, DenseIndex, DenseIndex cols) { m_cols = cols; }
00185 inline void resize(DenseIndex, DenseIndex, DenseIndex cols) { m_cols = cols; }
00186 inline const T *data() const { return m_data.array; }
00187 inline T *data() { return m_data.array; }
00188 };
00189
00190
00191 template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynamic, _Options>
00192 {
00193 T *m_data;
00194 DenseIndex m_rows;
00195 DenseIndex m_cols;
00196 public:
00197 inline explicit DenseStorage() : m_data(0), m_rows(0), m_cols(0) {}
00198 inline DenseStorage(internal::constructor_without_unaligned_array_assert)
00199 : m_data(0), m_rows(0), m_cols(0) {}
00200 inline DenseStorage(DenseIndex size, DenseIndex rows, DenseIndex cols)
00201 : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(rows), m_cols(cols)
00202 { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }
00203 inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols); }
00204 inline void swap(DenseStorage& other)
00205 { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }
00206 inline DenseIndex rows(void) const {return m_rows;}
00207 inline DenseIndex cols(void) const {return m_cols;}
00208 inline void conservativeResize(DenseIndex size, DenseIndex rows, DenseIndex cols)
00209 {
00210 m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*m_cols);
00211 m_rows = rows;
00212 m_cols = cols;
00213 }
00214 void resize(DenseIndex size, DenseIndex rows, DenseIndex cols)
00215 {
00216 if(size != m_rows*m_cols)
00217 {
00218 internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols);
00219 if (size)
00220 m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
00221 else
00222 m_data = 0;
00223 EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
00224 }
00225 m_rows = rows;
00226 m_cols = cols;
00227 }
00228 inline const T *data() const { return m_data; }
00229 inline T *data() { return m_data; }
00230 };
00231
00232
00233 template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Rows, Dynamic, _Options>
00234 {
00235 T *m_data;
00236 DenseIndex m_cols;
00237 public:
00238 inline explicit DenseStorage() : m_data(0), m_cols(0) {}
00239 inline DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}
00240 inline DenseStorage(DenseIndex size, DenseIndex, DenseIndex cols) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_cols(cols)
00241 { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }
00242 inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols); }
00243 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }
00244 inline static DenseIndex rows(void) {return _Rows;}
00245 inline DenseIndex cols(void) const {return m_cols;}
00246 inline void conservativeResize(DenseIndex size, DenseIndex, DenseIndex cols)
00247 {
00248 m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, _Rows*m_cols);
00249 m_cols = cols;
00250 }
00251 EIGEN_STRONG_INLINE void resize(DenseIndex size, DenseIndex, DenseIndex cols)
00252 {
00253 if(size != _Rows*m_cols)
00254 {
00255 internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols);
00256 if (size)
00257 m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
00258 else
00259 m_data = 0;
00260 EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
00261 }
00262 m_cols = cols;
00263 }
00264 inline const T *data() const { return m_data; }
00265 inline T *data() { return m_data; }
00266 };
00267
00268
00269 template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dynamic, _Cols, _Options>
00270 {
00271 T *m_data;
00272 DenseIndex m_rows;
00273 public:
00274 inline explicit DenseStorage() : m_data(0), m_rows(0) {}
00275 inline DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}
00276 inline DenseStorage(DenseIndex size, DenseIndex rows, DenseIndex) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(rows)
00277 { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }
00278 inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows); }
00279 inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }
00280 inline DenseIndex rows(void) const {return m_rows;}
00281 inline static DenseIndex cols(void) {return _Cols;}
00282 inline void conservativeResize(DenseIndex size, DenseIndex rows, DenseIndex)
00283 {
00284 m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*_Cols);
00285 m_rows = rows;
00286 }
00287 EIGEN_STRONG_INLINE void resize(DenseIndex size, DenseIndex rows, DenseIndex)
00288 {
00289 if(size != m_rows*_Cols)
00290 {
00291 internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows);
00292 if (size)
00293 m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
00294 else
00295 m_data = 0;
00296 EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
00297 }
00298 m_rows = rows;
00299 }
00300 inline const T *data() const { return m_data; }
00301 inline T *data() { return m_data; }
00302 };
00303
00304 #endif // EIGEN_MATRIX_H