29 inline _3dArray<T>::_3dArray()
35 inline _3dArray<T>::_3dArray(
size_t extent0,
size_t extent1,
size_t extent2)
37 init_memory(extent0, extent1, extent2);
41 inline _3dArray<T>::_3dArray(
size_t extent0,
size_t extent1,
size_t extent2, T* data,
bool strict)
43 #ifdef FIBER_CHECK_ARRAY_BOUNDS
44 check_extents(extent0, extent1, extent2);
46 m_extents[0] = extent0;
47 m_extents[1] = extent1;
48 m_extents[2] = extent2;
55 inline _3dArray<T>::_3dArray(
const _3dArray& other)
57 if (!other.is_empty()) {
58 init_memory(other.m_extents[0], other.m_extents[1], other.m_extents[2]);
59 std::copy(other.begin(), other.end(), m_storage);
65 inline _3dArray<T>& _3dArray<T>::operator=(
const _3dArray& rhs)
68 set_size(rhs.m_extents[0], rhs.m_extents[1], rhs.m_extents[2]);
69 std::copy(rhs.begin(), rhs.end(), m_storage);
75 inline _3dArray<T>::~_3dArray()
81 inline void _3dArray<T>::init_memory(
size_t extent0,
size_t extent1,
size_t extent2)
83 #ifdef FIBER_CHECK_ARRAY_BOUNDS
84 check_extents(extent0, extent1, extent2);
86 m_storage =
new T[extent0 * extent1 * extent2];
89 m_extents[0] = extent0;
90 m_extents[1] = extent1;
91 m_extents[2] = extent2;
95 inline void _3dArray<T>::init_empty()
105 template <
typename T>
106 inline void _3dArray<T>::free_memory()
108 if (m_owns && m_storage)
114 template <
typename T>
115 inline T& _3dArray<T>::operator()(
size_t index0,
size_t index1,
size_t index2)
117 #ifdef FIBER_CHECK_ARRAY_BOUNDS
118 check_indices(index0, index1, index2);
122 m_extents[0] * index1 +
123 m_extents[0] * m_extents[1] * index2];
126 template <
typename T>
127 inline const T& _3dArray<T>::operator()(
size_t index0,
size_t index1,
size_t index2)
const
129 #ifdef FIBER_CHECK_ARRAY_BOUNDS
130 check_indices(index0, index1, index2);
134 m_extents[0] * index1 +
135 m_extents[0] * m_extents[1] * index2];
138 template <
typename T>
139 inline size_t _3dArray<T>::extent(
size_t dimension)
const
141 #ifdef FIBER_CHECK_ARRAY_BOUNDS
142 check_dimension(dimension);
144 return m_extents[dimension];
147 template <
typename T>
148 inline _3dArray<T>& _3dArray<T>::operator+=(
const _3dArray<T>& other){
149 if ((this->extent(0)!= other.extent(0))||
150 (this->extent(1)!= other.extent(1))||
151 (this->extent(2)!= other.extent(2)))
152 std::runtime_error(
"_3dArray<T> operator+=: Array sizes don't agree.");
153 for (
size_t i=0;i<this->extent(2);++i)
154 for (
size_t j=0;j<this->extent(1);++j)
155 for (
size_t k=0;k<this->extent(0);++k)
156 (*
this)(k,j,i)+=other(k,j,i);
161 template <
typename T>
162 inline _3dArray<T>& _3dArray<T>::operator*=(
const T& other) {
163 for (
size_t i=0;i<this->extent(2);++i)
164 for (
size_t j=0;j<this->extent(1);++j)
165 for (
size_t k=0;k<this->extent(0);++k)
166 (*
this)(k,j,i)*=other;
172 template <
typename T>
173 inline void _3dArray<T>::set_size(
size_t extent0,
size_t extent1,
size_t extent2)
175 if (extent0 * extent1 * extent2 ==
176 m_extents[0] * m_extents[1] * m_extents[2]) {
177 m_extents[0] = extent0;
178 m_extents[1] = extent1;
179 m_extents[2] = extent2;
183 throw std::runtime_error(
"_3dArray::set_size(): Changing the total "
184 "number of elements stored in an array "
185 "created in the strict mode is not allowed");
190 if (extent0 * extent1 * extent2 != 0)
191 init_memory(extent0, extent1, extent2);
197 template <
typename T>
198 inline bool _3dArray<T>::is_empty()
const
200 return m_extents[0] * m_extents[1] * m_extents[2] == 0;
203 template <
typename T>
204 inline typename _3dArray<T>::iterator _3dArray<T>::begin()
209 template <
typename T>
210 inline typename _3dArray<T>::const_iterator _3dArray<T>::begin()
const
215 template <
typename T>
216 inline typename _3dArray<T>::iterator _3dArray<T>::end()
218 return m_storage + m_extents[0] * m_extents[1] * m_extents[2];
221 template <
typename T>
222 inline typename _3dArray<T>::const_iterator _3dArray<T>::end()
const
224 return m_storage + m_extents[0] * m_extents[1] * m_extents[2];
227 #ifdef FIBER_CHECK_ARRAY_BOUNDS
228 template <
typename T>
229 inline void _3dArray<T>::check_dimension(
size_t dimension)
const
232 throw std::invalid_argument(
"Invalid dimension");
235 template <
typename T>
236 inline void _3dArray<T>::check_extents(
size_t extent0,
size_t extent1,
size_t extent2)
const
240 template <
typename T>
241 inline void _3dArray<T>::check_indices(
size_t index0,
size_t index1,
size_t index2)
const
243 if (m_extents[0] <= index0 ||
244 m_extents[1] <= index1 ||
245 m_extents[2] <= index2)
246 throw std::out_of_range(
"Invalid index");
248 #endif // FIBER_CHECK_ARRAY_BOUNDS
252 template <
typename T>
253 inline _2dSliceOf3dArray<T>::_2dSliceOf3dArray(_3dArray<T>& array,
size_t index2) :
254 m_array(array), m_index2(index2)
257 template <
typename T>
262 template <
typename T>
264 return m_array(index0, index1, m_index2);
267 template <
typename T>
268 inline T& _2dSliceOf3dArray<T>::operator()(
size_t index0,
size_t index1) {
269 return m_array(index0, index1, m_index2);
272 template <
typename T>
273 inline size_t _2dSliceOf3dArray<T>::extent(
size_t dimension)
const {
274 check_dimension(dimension);
275 return m_array.extent(dimension);
278 template <
typename T>
279 inline void _2dSliceOf3dArray<T>::check_dimension(
size_t dimension)
const {
280 #ifdef FIBER_CHECK_ARRAY_BOUNDS
282 throw std::invalid_argument(
"Invalid dimension");
288 template <
typename T>
289 inline _2dSliceOfConst3dArray<T>::_2dSliceOfConst3dArray(
290 const _3dArray<T>& array,
size_t index2) :
291 m_array(array), m_index2(index2)
294 template <
typename T>
295 inline const T& _2dSliceOfConst3dArray<T>::operator()(
size_t index0,
size_t index1)
const {
296 return m_array(index0, index1, m_index2);
299 template <
typename T>
300 inline size_t _2dSliceOfConst3dArray<T>::extent(
size_t dimension)
const {
301 check_dimension(dimension);
302 return m_array.extent(dimension);
305 template <
typename T>
306 inline void _2dSliceOfConst3dArray<T>::check_dimension(
size_t dimension)
const {
307 #ifdef FIBER_CHECK_ARRAY_BOUNDS
309 throw std::invalid_argument(
"Invalid dimension");
315 template <
typename T>
317 _3dArray<T>& array,
size_t index1,
size_t index2) :
318 m_array(array), m_index1(index1), m_index2(index2)
321 template <
typename T>
326 template <
typename T>
328 return m_array(index0, m_index1, m_index2);
331 template <
typename T>
332 inline T& _1dSliceOf3dArray<T>::operator()(
size_t index0) {
333 return m_array(index0, m_index1, m_index2);
336 template <
typename T>
337 inline size_t _1dSliceOf3dArray<T>::extent(
size_t dimension)
const {
338 check_dimension(dimension);
339 return m_array.extent(dimension);
342 template <
typename T>
343 inline void _1dSliceOf3dArray<T>::check_dimension(
size_t dimension)
const {
344 #ifdef FIBER_CHECK_ARRAY_BOUNDS
346 throw std::invalid_argument(
"Invalid dimension");
352 template <
typename T>
353 inline _1dSliceOfConst3dArray<T>::_1dSliceOfConst3dArray(
354 const _3dArray<T>& array,
size_t index1,
size_t index2) :
355 m_array(array), m_index1(index1), m_index2(index2)
358 template <
typename T>
359 inline const T& _1dSliceOfConst3dArray<T>::operator()(
size_t index0)
const {
360 return m_array(index0, m_index1, m_index2);
363 template <
typename T>
364 inline size_t _1dSliceOfConst3dArray<T>::extent(
size_t dimension)
const {
365 check_dimension(dimension);
366 return m_array.extent(dimension);
369 template <
typename T>
370 inline void _1dSliceOfConst3dArray<T>::check_dimension(
size_t dimension)
const {
371 #ifdef FIBER_CHECK_ARRAY_BOUNDS
373 throw std::invalid_argument(
"Invalid dimension");
_1dSliceOf3dArray(_3dArray< T > &array, size_t index1, size_t index2)
Construct a slice consisting of the elements array(:,index1,index2)
Definition: _3d_array_imp.hpp:316
Lightweight encapsulation of a 2D slice of a 3D array.
Definition: _3d_array.hpp:107
_1dSliceOf3dArray & self()
Returns a reference to self.
Definition: _3d_array_imp.hpp:322
Lightweight encapsulation of a 1D slice of a 3D array.
Definition: _3d_array.hpp:155
_2dSliceOf3dArray & self()
Returns a reference to self.
Definition: _3d_array_imp.hpp:258
Simple implementation of a 3D Fortran-ordered array.
Definition: _3d_array.hpp:48