BEM++  2.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
collection_of_4d_arrays_imp.hpp
1 // Copyright (C) 2011-2012 by the BEM++ Authors
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20 
21 #include "collection_of_4d_arrays.hpp"
22 
23 namespace Fiber
24 {
25 
26 // CollectionOf4dArrays
27 
28 template <typename T>
29 inline CollectionOf4dArrays<T>::CollectionOf4dArrays() :
30  m_size(0)
31 {
32 }
33 
34 template <typename T>
35 inline CollectionOf4dArrays<T>::CollectionOf4dArrays(size_t size) :
36  m_size(size), m_arrays(new _4dArray<T>[size])
37 {
38  // should we initialise to 0?
39 }
40 
41 template <typename T>
42 inline void CollectionOf4dArrays<T>::set_size(size_t new_size)
43 {
44  if (new_size == m_size)
45  return;
46  m_arrays.reset(new_size == 0 ? 0 : new _4dArray<T>[new_size]);
47  m_size = new_size;
48 }
49 
50 template <typename T>
51 inline size_t CollectionOf4dArrays<T>::size() const
52 {
53  return m_size;
54 }
55 
56 template <typename T>
57 inline void CollectionOf4dArrays<T>::fill(const T& value)
58 {
59  for (size_t a = 0; a < m_size; ++a)
60  std::fill((*this)[a].begin(), (*this)[a].end(), value);
61 }
62 
63 template <typename T>
64 inline _4dArray<T>& CollectionOf4dArrays<T>::operator[](size_t index)
65 {
66  return array(index);
67 }
68 
69 template <typename T>
70 inline const _4dArray<T>& CollectionOf4dArrays<T>::operator[](size_t index) const
71 {
72  return array(index);
73 }
74 
75 template <typename T>
76 inline CollectionOf3dSlicesOf4dArrays<T> CollectionOf4dArrays<T>::slice(size_t index3)
77 {
78  return CollectionOf3dSlicesOf4dArrays<T>(*this, index3);
79 }
80 
81 template <typename T>
82 inline CollectionOf3dSlicesOfConst4dArrays<T> CollectionOf4dArrays<T>::const_slice(
83  size_t index3) const
84 {
85  return CollectionOf3dSlicesOfConst4dArrays<T>(*this, index3);
86 }
87 
88 template <typename T>
89 inline CollectionOf2dSlicesOf4dArrays<T> CollectionOf4dArrays<T>::slice(size_t index2, size_t index3)
90 {
91  return CollectionOf2dSlicesOf4dArrays<T>(*this, index2, index3);
92 }
93 
94 template <typename T>
95 inline CollectionOf2dSlicesOfConst4dArrays<T> CollectionOf4dArrays<T>::const_slice(
96  size_t index2, size_t index3) const
97 {
98  return CollectionOf2dSlicesOfConst4dArrays<T>(*this, index2, index3);
99 }
100 
101 template <typename T>
102 inline CollectionOf1dSlicesOf4dArrays<T> CollectionOf4dArrays<T>::slice(size_t index1, size_t index2, size_t index3)
103 {
104  return CollectionOf1dSlicesOf4dArrays<T>(*this, index1, index2, index3);
105 }
106 
107 template <typename T>
108 inline CollectionOf1dSlicesOfConst4dArrays<T> CollectionOf4dArrays<T>::const_slice(
109  size_t index1, size_t index2, size_t index3) const
110 {
111  return CollectionOf1dSlicesOfConst4dArrays<T>(*this, index1, index2, index3);
112 }
113 
114 template <typename T>
115 inline _4dArray<T>& CollectionOf4dArrays<T>::array(size_t i)
116 {
117 #ifdef FIBER_CHECK_ARRAY_BOUNDS
118  check_array_index(i);
119 #endif
120  return m_arrays[i];
121 }
122 
123 template <typename T>
124 inline const _4dArray<T>& CollectionOf4dArrays<T>::array(size_t i) const
125 {
126 #ifdef FIBER_CHECK_ARRAY_BOUNDS
127  check_array_index(i);
128 #endif
129  return m_arrays[i];
130 }
131 
132 template <typename T>
133 inline void CollectionOf4dArrays<T>::check_array_index(size_t array_index) const
134 {
135 #ifdef FIBER_CHECK_ARRAY_BOUNDS
136  if (m_size <= array_index)
137  throw std::invalid_argument("Invalid array index");
138 #endif
139 }
140 
141 // CollectionOf3dSlicesOf4dArrays
142 
143 template <typename T>
144 inline CollectionOf3dSlicesOf4dArrays<T>::
145 CollectionOf3dSlicesOf4dArrays(CollectionOf4dArrays<T>& collection, size_t index3) :
146  m_collection(collection), m_index3(index3)
147 {}
148 
149 template <typename T>
150 inline CollectionOf3dSlicesOf4dArrays<T>& CollectionOf3dSlicesOf4dArrays<T>::
151 self() {
152  return *this;
153 }
154 
155 template <typename T>
157 operator[](size_t index) const {
158  return _3dSliceOfConst4dArray<T>(m_collection[index], m_index3);
159 }
160 
161 template <typename T>
162 inline _3dSliceOf4dArray<T> CollectionOf3dSlicesOf4dArrays<T>::
163 operator[](size_t index) {
164  return _3dSliceOf4dArray<T>(m_collection[index], m_index3);
165 }
166 
167 template <typename T>
168 inline size_t CollectionOf3dSlicesOf4dArrays<T>::size() const {
169  return m_collection.size();
170 }
171 
172 // CollectionOf3dSlicesOfConst4dArrays
173 
174 template <typename T>
175 inline CollectionOf3dSlicesOfConst4dArrays<T>::
176 CollectionOf3dSlicesOfConst4dArrays(const CollectionOf4dArrays<T>& collection,
177  size_t index3) :
178  m_collection(collection), m_index3(index3)
179 {}
180 
181 template <typename T>
182 inline _3dSliceOfConst4dArray<T> CollectionOf3dSlicesOfConst4dArrays<T>::
183 operator[](size_t index) const {
184  return _3dSliceOfConst4dArray<T>(m_collection[index], m_index3);
185 }
186 
187 template <typename T>
188 inline size_t CollectionOf3dSlicesOfConst4dArrays<T>::size() const {
189  return m_collection.size();
190 }
191 
192 // CollectionOf2dSlicesOf4dArrays
193 
194 template <typename T>
195 inline CollectionOf2dSlicesOf4dArrays<T>::
196 CollectionOf2dSlicesOf4dArrays(CollectionOf4dArrays<T>& collection, size_t index2, size_t index3) :
197  m_collection(collection), m_index2(index2), m_index3(index3)
198 {}
199 
200 template <typename T>
201 inline CollectionOf2dSlicesOf4dArrays<T>& CollectionOf2dSlicesOf4dArrays<T>::
202 self() {
203  return *this;
204 }
205 
206 template <typename T>
208 operator[](size_t index) const {
209  return _2dSliceOfConst4dArray<T>(m_collection[index], m_index2, m_index3);
210 }
211 
212 template <typename T>
213 inline _2dSliceOf4dArray<T> CollectionOf2dSlicesOf4dArrays<T>::
214 operator[](size_t index) {
215  return _2dSliceOf4dArray<T>(m_collection[index], m_index2, m_index3);
216 }
217 
218 template <typename T>
219 inline size_t CollectionOf2dSlicesOf4dArrays<T>::size() const {
220  return m_collection.size();
221 }
222 
223 // CollectionOf2dSlicesOfConst4dArrays
224 
225 template <typename T>
226 inline CollectionOf2dSlicesOfConst4dArrays<T>::
227 CollectionOf2dSlicesOfConst4dArrays(const CollectionOf4dArrays<T>& collection,
228  size_t index2, size_t index3) :
229  m_collection(collection), m_index2(index2), m_index3(index3)
230 {}
231 
232 template <typename T>
233 inline _2dSliceOfConst4dArray<T> CollectionOf2dSlicesOfConst4dArrays<T>::
234 operator[](size_t index) const {
235  return _2dSliceOfConst4dArray<T>(m_collection[index], m_index2, m_index3);
236 }
237 
238 template <typename T>
239 inline size_t CollectionOf2dSlicesOfConst4dArrays<T>::size() const {
240  return m_collection.size();
241 }
242 
243 // CollectionOf1dSlicesOf4dArrays
244 
245 template <typename T>
246 inline CollectionOf1dSlicesOf4dArrays<T>::
247 CollectionOf1dSlicesOf4dArrays(CollectionOf4dArrays<T>& collection,
248  size_t index1, size_t index2, size_t index3) :
249  m_collection(collection), m_index1(index1), m_index2(index2), m_index3(index3)
250 {}
251 
252 template <typename T>
253 inline CollectionOf1dSlicesOf4dArrays<T>& CollectionOf1dSlicesOf4dArrays<T>::
254 self() {
255  return *this;
256 }
257 
258 template <typename T>
260 operator[](size_t index) const {
261  return _1dSliceOfConst4dArray<T>(m_collection[index], m_index1, m_index2, m_index3);
262 }
263 
264 template <typename T>
265 inline _1dSliceOf4dArray<T> CollectionOf1dSlicesOf4dArrays<T>::
266 operator[](size_t index) {
267  return _1dSliceOf4dArray<T>(m_collection[index], m_index1, m_index2, m_index3);
268 }
269 
270 template <typename T>
271 inline size_t CollectionOf1dSlicesOf4dArrays<T>::size() const {
272  return m_collection.size();
273 }
274 
275 // CollectionOf1dSlicesOfConst4dArrays
276 
277 template <typename T>
278 inline CollectionOf1dSlicesOfConst4dArrays<T>::
279 CollectionOf1dSlicesOfConst4dArrays(const CollectionOf4dArrays<T>& collection,
280  size_t index1, size_t index2, size_t index3) :
281  m_collection(collection), m_index1(index1), m_index2(index2), m_index3(index3)
282 {}
283 
284 template <typename T>
285 inline _1dSliceOfConst4dArray<T> CollectionOf1dSlicesOfConst4dArrays<T>::
286 operator[](size_t index) const {
287  return _1dSliceOfConst4dArray<T>(m_collection[index], m_index1, m_index2, m_index3);
288 }
289 
290 template <typename T>
291 inline size_t CollectionOf1dSlicesOfConst4dArrays<T>::size() const {
292  return m_collection.size();
293 }
294 
295 } // namespace Fiber
CollectionOf1dSlicesOf4dArrays & self()
Returns a reference to self.
Definition: collection_of_4d_arrays_imp.hpp:254
Definition: collection_of_4d_arrays.hpp:162
Definition: collection_of_4d_arrays.hpp:120
Lightweight encapsulation of a 2D slice of a constant 4d array.
Definition: _4d_array.hpp:176
Lightweight encapsulation of a 2D slice of a constant 4d array.
Definition: _4d_array.hpp:128
Lightweight encapsulation of a 2D slice of a constant 4d array.
Definition: _4d_array.hpp:225
CollectionOf3dSlicesOf4dArrays & self()
Returns a reference to self.
Definition: collection_of_4d_arrays_imp.hpp:151
CollectionOf2dSlicesOf4dArrays & self()
Returns a reference to self.
Definition: collection_of_4d_arrays_imp.hpp:202
Definition: collection_of_4d_arrays.hpp:78