27 inline _2dArray<T>::_2dArray()
36 inline _2dArray<T>::_2dArray(
size_t extent0,
size_t extent1)
38 init_memory(extent0, extent1);
42 inline _2dArray<T>::_2dArray(
size_t extent0,
size_t extent1, T* data)
44 #ifdef FIBER_CHECK_ARRAY_BOUNDS
45 check_extents(extent0, extent1);
49 m_extents[0] = extent0;
50 m_extents[1] = extent1;
54 inline _2dArray<T>::_2dArray(
const _2dArray& other)
56 init_memory(other.m_extents[0], other.m_extents[1]);
57 std::copy(other.begin(), other.end(), m_storage);
61 inline _2dArray<T>& _2dArray<T>::operator=(
const _2dArray& rhs)
64 set_size(rhs.m_extents[0], rhs.m_extents[1]);
65 std::copy(rhs.begin(), rhs.end(), m_storage);
71 inline _2dArray<T>::~_2dArray()
77 inline void _2dArray<T>::init_memory(
size_t extent0,
size_t extent1)
79 #ifdef FIBER_CHECK_ARRAY_BOUNDS
80 check_extents(extent0, extent1);
82 m_storage =
new T[extent0 * extent1];
84 m_extents[0] = extent0;
85 m_extents[1] = extent1;
89 inline void _2dArray<T>::free_memory()
91 if (m_owns && m_storage)
98 inline T& _2dArray<T>::operator()(
size_t index0,
size_t index1)
100 #ifdef FIBER_CHECK_ARRAY_BOUNDS
101 check_indices(index0, index1);
103 return m_storage[index0 + m_extents[0] * index1];
106 template <
typename T>
107 inline const T& _2dArray<T>::operator()(
size_t index0,
size_t index1)
const
109 #ifdef FIBER_CHECK_ARRAY_BOUNDS
110 check_indices(index0, index1);
112 return m_storage[index0 + m_extents[0] * index1];
115 template <
typename T>
116 inline size_t _2dArray<T>::extent(
size_t dimension)
const
118 #ifdef FIBER_CHECK_ARRAY_BOUNDS
119 check_dimension(dimension);
121 return m_extents[dimension];
124 template <
typename T>
125 inline void _2dArray<T>::set_size(
size_t extent0,
size_t extent1)
127 #ifdef FIBER_CHECK_ARRAY_BOUNDS
128 check_extents(extent0, extent1);
130 if (extent0 * extent1 == m_extents[0] * m_extents[1]) {
131 m_extents[0] = extent0;
132 m_extents[1] = extent1;
136 init_memory(extent0, extent1);
140 template <
typename T>
141 inline _2dArray<T>& _2dArray<T>::operator+=(
const _2dArray<T>& other){
142 if ((this->extent(0)!= other.extent(0))||
143 (this->extent(1)!= other.extent(1)))
144 std::runtime_error(
"_2dArray<T> operator+=: Array sizes don't agree.");
145 for (
size_t i=0;i<this->extent(1);++i)
146 for (
size_t j=0;j<this->extent(0);++j)
147 (*
this)(j,i)+=other(j,i);
152 template <
typename T>
153 inline _2dArray<T>& _2dArray<T>::operator*=(
const T& other) {
154 for (
size_t i=0;i<this->extent(1);++i)
155 for (
size_t j=0;j<this->extent(0);++j)
161 template <
typename T>
162 inline typename _2dArray<T>::iterator _2dArray<T>::begin()
167 template <
typename T>
168 inline typename _2dArray<T>::const_iterator _2dArray<T>::begin()
const
173 template <
typename T>
174 inline typename _2dArray<T>::iterator _2dArray<T>::end()
176 return m_storage + m_extents[0] * m_extents[1];
179 template <
typename T>
180 inline typename _2dArray<T>::const_iterator _2dArray<T>::end()
const
182 return m_storage + m_extents[0] * m_extents[1];
185 #ifdef FIBER_CHECK_ARRAY_BOUNDS
186 template <
typename T>
187 inline void _2dArray<T>::check_dimension(
size_t dimension)
const
190 throw std::invalid_argument(
"Invalid dimension");
193 template <
typename T>
194 inline void _2dArray<T>::check_extents(
size_t extent0,
size_t extent1)
const
198 template <
typename T>
199 inline void _2dArray<T>::check_indices(
size_t index0,
size_t index1)
const
201 if (m_extents[0] <= index0 ||
202 m_extents[1] <= index1)
203 throw std::out_of_range(
"Invalid index");
205 #endif // FIBER_CHECK_ARRAY_BOUNDS
209 template <
typename T>
212 m_array(array), m_index1(index1)
215 template <
typename T>
220 template <
typename T>
222 return m_array(index0, m_index1);
225 template <
typename T>
226 inline T& _1dSliceOf2dArray<T>::operator()(
size_t index0) {
227 return m_array(index0, m_index1);
230 template <
typename T>
231 inline size_t _1dSliceOf2dArray<T>::extent(
size_t dimension)
const {
232 check_dimension(dimension);
233 return m_array.extent(dimension);
236 template <
typename T>
237 inline void _1dSliceOf2dArray<T>::check_dimension(
size_t dimension)
const {
238 #ifdef FIBER_CHECK_ARRAY_BOUNDS
240 throw std::invalid_argument(
"Invalid dimension");
246 template <
typename T>
247 inline _1dSliceOfConst2dArray<T>::_1dSliceOfConst2dArray(
248 const _2dArray<T>& array,
size_t index1) :
249 m_array(array), m_index1(index1)
252 template <
typename T>
253 inline const T& _1dSliceOfConst2dArray<T>::operator()(
size_t index0)
const {
254 return m_array(index0, m_index1);
257 template <
typename T>
258 inline size_t _1dSliceOfConst2dArray<T>::extent(
size_t dimension)
const {
259 check_dimension(dimension);
260 return m_array.extent(dimension);
263 template <
typename T>
264 inline void _1dSliceOfConst2dArray<T>::check_dimension(
size_t dimension)
const {
265 #ifdef FIBER_CHECK_ARRAY_BOUNDS
267 throw std::invalid_argument(
"Invalid dimension");
_1dSliceOf2dArray & self()
Returns a reference to self.
Definition: _2d_array_imp.hpp:216
Lightweight encapsulation of a 1D slice of a 2D array.
Definition: _2d_array.hpp:89
_1dSliceOf2dArray(_2dArray< T > &array, size_t index1)
Construct a slice consisting of the elements array(:,index1)
Definition: _2d_array_imp.hpp:210
Simple implementation of a 2D Fortran-ordered array.
Definition: _2d_array.hpp:41