27 inline _4dArray<T>::_4dArray()
38 inline _4dArray<T>::_4dArray(
size_t extent0,
size_t extent1,
size_t extent2,
size_t extent3)
40 init_memory(extent0, extent1, extent2, extent3);
44 inline _4dArray<T>::_4dArray(
size_t extent0,
size_t extent1,
size_t extent2,
size_t extent3, T* data)
46 #ifdef FIBER_CHECK_ARRAY_BOUNDS
47 check_extents(extent0, extent1, extent2, extent3);
49 m_extents[0] = extent0;
50 m_extents[1] = extent1;
51 m_extents[2] = extent2;
52 m_extents[3] = extent3;
58 inline _4dArray<T>::_4dArray(
const _4dArray& other)
60 init_memory(other.m_extents[0], other.m_extents[1],
61 other.m_extents[2], other.m_extents[3]);
62 std::copy(other.begin(), other.end(), m_storage);
66 inline _4dArray<T>& _4dArray<T>::operator=(
const _4dArray& rhs)
69 set_size(rhs.m_extents[0], rhs.m_extents[1],
70 rhs.m_extents[2], rhs.m_extents[3]);
71 std::copy(rhs.begin(), rhs.end(), m_storage);
77 inline _4dArray<T>::~_4dArray()
83 inline void _4dArray<T>::init_memory(
size_t extent0,
size_t extent1,
84 size_t extent2,
size_t extent3)
86 #ifdef FIBER_CHECK_ARRAY_BOUNDS
87 check_extents(extent0, extent1, extent2, extent3);
89 m_storage =
new T[extent0 * extent1 * extent2 * extent3];
91 m_extents[0] = extent0;
92 m_extents[1] = extent1;
93 m_extents[2] = extent2;
94 m_extents[3] = extent3;
98 inline void _4dArray<T>::free_memory()
100 if (m_owns && m_storage)
107 template <
typename T>
108 inline _4dArray<T>& _4dArray<T>::operator+=(
const _4dArray<T>& other){
109 if ((this->extent(0)!= other.extent(0))||
110 (this->extent(1)!= other.extent(1))||
111 (this->extent(2)!= other.extent(2))||
112 (this->extent(3)!= other.extent(3)))
113 std::runtime_error(
"_4dArray<T> operator+=: Array sizes don't agree.");
114 for (
size_t i=0;i<this->extent(3);++i)
115 for (
size_t j=0;j<this->extent(2);++j)
116 for (
size_t k=0;k<this->extent(1);++k)
117 for (
size_t l=0;l<this->extent(0);++l)
118 (*
this)(l,k,j,i)+=other(l,k,j,i);
123 template <
typename T>
124 inline _4dArray<T>& _4dArray<T>::operator*=(
const T& other) {
125 for (
size_t i=0;i<this->extent(3);++i)
126 for (
size_t j=0;j<this->extent(2);++j)
127 for (
size_t k=0;k<this->extent(1);++k)
128 for (
size_t l=0;l<this->extent(0);++l)
129 (*
this)(l,k,j,i)*=other;
134 template <
typename T>
135 inline T& _4dArray<T>::operator()(
size_t index0,
size_t index1,
size_t index2,
size_t index3)
137 #ifdef FIBER_CHECK_ARRAY_BOUNDS
138 check_indices(index0, index1, index2, index3);
142 m_extents[0] * index1 +
143 m_extents[0] * m_extents[1] * index2 +
144 m_extents[0] * m_extents[1] * m_extents[2] * index3];
147 template <
typename T>
148 inline const T& _4dArray<T>::operator()(
size_t index0,
size_t index1,
size_t index2,
size_t index3)
const
150 #ifdef FIBER_CHECK_ARRAY_BOUNDS
151 check_indices(index0, index1, index2, index3);
155 m_extents[0] * index1 +
156 m_extents[0] * m_extents[1] * index2 +
157 m_extents[0] * m_extents[1] * m_extents[2] * index3];
160 template <
typename T>
161 inline size_t _4dArray<T>::extent(
size_t dimension)
const
163 #ifdef FIBER_CHECK_ARRAY_BOUNDS
164 check_dimension(dimension);
166 return m_extents[dimension];
169 template <
typename T>
170 inline void _4dArray<T>::set_size(
size_t extent0,
size_t extent1,
size_t extent2,
size_t extent3)
172 #ifdef FIBER_CHECK_ARRAY_BOUNDS
173 check_extents(extent0, extent1, extent2, extent3);
175 if (extent0 * extent1 * extent2 * extent3 ==
176 m_extents[0] * m_extents[1] * m_extents[2] * m_extents[3]) {
177 m_extents[0] = extent0;
178 m_extents[1] = extent1;
179 m_extents[2] = extent2;
180 m_extents[3] = extent3;
183 if (m_owns && m_storage) {
187 m_extents[0] = extent0;
188 m_extents[1] = extent1;
189 m_extents[2] = extent2;
190 m_extents[3] = extent3;
191 m_storage =
new T[extent0 * extent1 * extent2 * extent3];
196 template <
typename T>
197 inline typename _4dArray<T>::iterator _4dArray<T>::begin()
202 template <
typename T>
203 inline typename _4dArray<T>::const_iterator _4dArray<T>::begin()
const
208 template <
typename T>
209 inline typename _4dArray<T>::iterator _4dArray<T>::end()
211 return m_storage + m_extents[0] * m_extents[1] * m_extents[2] * m_extents[3];
214 template <
typename T>
215 inline typename _4dArray<T>::const_iterator _4dArray<T>::end()
const
217 return m_storage + m_extents[0] * m_extents[1] * m_extents[2] * m_extents[3];
220 #ifdef FIBER_CHECK_ARRAY_BOUNDS
221 template <
typename T>
222 inline void _4dArray<T>::check_dimension(
size_t dimension)
const
225 throw std::invalid_argument(
"Invalid dimension");
228 template <
typename T>
229 inline void _4dArray<T>::check_extents(
size_t extent0,
size_t extent1,
size_t extent2,
size_t extent3)
const
233 template <
typename T>
234 inline void _4dArray<T>::check_indices(
size_t index0,
size_t index1,
size_t index2,
size_t index3)
const
236 if (m_extents[0] <= index0 ||
237 m_extents[1] <= index1 ||
238 m_extents[2] <= index2 ||
239 m_extents[3] <= index3)
240 throw std::out_of_range(
"Invalid index");
242 #endif // FIBER_CHECK_ARRAY_BOUNDS
246 template <
typename T>
247 inline _3dSliceOf4dArray<T>::_3dSliceOf4dArray(_4dArray<T>& array,
size_t index3) :
248 m_array(array), m_index3(index3)
251 template <
typename T>
256 template <
typename T>
258 return m_array(index0, index1, index2, m_index3);
261 template <
typename T>
262 inline T& _3dSliceOf4dArray<T>::operator()(
size_t index0,
size_t index1,
size_t index2) {
263 return m_array(index0, index1, index2, m_index3);
266 template <
typename T>
267 inline size_t _3dSliceOf4dArray<T>::extent(
size_t dimension)
const {
268 check_dimension(dimension);
269 return m_array.extent(dimension);
272 template <
typename T>
273 inline void _3dSliceOf4dArray<T>::check_dimension(
size_t dimension)
const {
274 #ifdef FIBER_CHECK_ARRAY_BOUNDS
276 throw std::invalid_argument(
"Invalid dimension");
282 template <
typename T>
283 inline _3dSliceOfConst4dArray<T>::_3dSliceOfConst4dArray(
284 const _4dArray<T>& array,
size_t index3) :
285 m_array(array), m_index3(index3)
288 template <
typename T>
289 inline const T& _3dSliceOfConst4dArray<T>::operator()(
size_t index0,
size_t index1,
size_t index2)
const {
290 return m_array(index0, index1, index2, m_index3);
293 template <
typename T>
294 inline size_t _3dSliceOfConst4dArray<T>::extent(
size_t dimension)
const {
295 check_dimension(dimension);
296 return m_array.extent(dimension);
299 template <
typename T>
300 inline void _3dSliceOfConst4dArray<T>::check_dimension(
size_t dimension)
const {
301 #ifdef FIBER_CHECK_ARRAY_BOUNDS
303 throw std::invalid_argument(
"Invalid dimension");
309 template <
typename T>
310 inline _2dSliceOf4dArray<T>::_2dSliceOf4dArray(_4dArray<T>& array,
size_t index2,
size_t index3) :
311 m_array(array), m_index2(index2), m_index3(index3)
314 template <
typename T>
319 template <
typename T>
321 return m_array(index0, index1, m_index2, m_index3);
324 template <
typename T>
325 inline T& _2dSliceOf4dArray<T>::operator()(
size_t index0,
size_t index1) {
326 return m_array(index0, index1, m_index2, m_index3);
329 template <
typename T>
330 inline size_t _2dSliceOf4dArray<T>::extent(
size_t dimension)
const {
331 check_dimension(dimension);
332 return m_array.extent(dimension);
335 template <
typename T>
336 inline void _2dSliceOf4dArray<T>::check_dimension(
size_t dimension)
const {
337 #ifdef FIBER_CHECK_ARRAY_BOUNDS
339 throw std::invalid_argument(
"Invalid dimension");
345 template <
typename T>
346 inline _2dSliceOfConst4dArray<T>::_2dSliceOfConst4dArray(
347 const _4dArray<T>& array,
size_t index2,
size_t index3) :
348 m_array(array), m_index2(index2), m_index3(index3)
351 template <
typename T>
352 inline const T& _2dSliceOfConst4dArray<T>::operator()(
size_t index0,
size_t index1)
const {
353 return m_array(index0, index1, m_index2, m_index3);
356 template <
typename T>
357 inline size_t _2dSliceOfConst4dArray<T>::extent(
size_t dimension)
const {
358 check_dimension(dimension);
359 return m_array.extent(dimension);
362 template <
typename T>
363 inline void _2dSliceOfConst4dArray<T>::check_dimension(
size_t dimension)
const {
364 #ifdef FIBER_CHECK_ARRAY_BOUNDS
366 throw std::invalid_argument(
"Invalid dimension");
372 template <
typename T>
374 _4dArray<T>& array,
size_t index1,
size_t index2,
size_t index3) :
375 m_array(array), m_index1(index1), m_index2(index2), m_index3(index3)
378 template <
typename T>
383 template <
typename T>
385 return m_array(index0, m_index1, m_index2, m_index3);
388 template <
typename T>
389 inline T& _1dSliceOf4dArray<T>::operator()(
size_t index0) {
390 return m_array(index0, m_index1, m_index2, m_index3);
393 template <
typename T>
394 inline size_t _1dSliceOf4dArray<T>::extent(
size_t dimension)
const {
395 check_dimension(dimension);
396 return m_array.extent(dimension);
399 template <
typename T>
400 inline void _1dSliceOf4dArray<T>::check_dimension(
size_t dimension)
const {
401 #ifdef FIBER_CHECK_ARRAY_BOUNDS
403 throw std::invalid_argument(
"Invalid dimension");
409 template <
typename T>
410 inline _1dSliceOfConst4dArray<T>::_1dSliceOfConst4dArray(
411 const _4dArray<T>& array,
size_t index1,
size_t index2,
size_t index3) :
412 m_array(array), m_index1(index1), m_index2(index2), m_index3(index3)
415 template <
typename T>
416 inline const T& _1dSliceOfConst4dArray<T>::operator()(
size_t index0)
const {
417 return m_array(index0, m_index1, m_index2, m_index3);
420 template <
typename T>
421 inline size_t _1dSliceOfConst4dArray<T>::extent(
size_t dimension)
const {
422 check_dimension(dimension);
423 return m_array.extent(dimension);
426 template <
typename T>
427 inline void _1dSliceOfConst4dArray<T>::check_dimension(
size_t dimension)
const {
428 #ifdef FIBER_CHECK_ARRAY_BOUNDS
430 throw std::invalid_argument(
"Invalid dimension");
_2dSliceOf4dArray & self()
Returns a reference to self.
Definition: _4d_array_imp.hpp:315
Simple implementation of a 4D Fortran-ordered array.
Definition: _4d_array.hpp:50
_1dSliceOf4dArray(_4dArray< T > &array, size_t index1, size_t index2, size_t index3)
Construct a slice consisting of the elements array(:,index1,index2,index3)
Definition: _4d_array_imp.hpp:373
_3dSliceOf4dArray & self()
Returns a reference to self.
Definition: _4d_array_imp.hpp:252
Lightweight encapsulation of a 3D slice of a 4D array.
Definition: _4d_array.hpp:99
Lightweight encapsulation of a 2D slice of a 4d array.
Definition: _4d_array.hpp:147
_1dSliceOf4dArray & self()
Returns a reference to self.
Definition: _4d_array_imp.hpp:379
Lightweight encapsulation of a 1D slice of a 4d array.
Definition: _4d_array.hpp:195