Reference documentation for deal.II version 8.4.2
array_view.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2004 - 2016 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE at
12 // the top level of the deal.II distribution.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii__array_view_h
17 #define dealii__array_view_h
18 
19 #include <deal.II/base/config.h>
20 #include <deal.II/base/exceptions.h>
21 #include <deal.II/base/table.h>
22 
23 #include <boost/type_traits/remove_cv.hpp>
24 
25 #include <vector>
26 
27 DEAL_II_NAMESPACE_OPEN
28 
29 
70 template <typename ElementType>
71 class ArrayView
72 {
73 public:
78  typedef ElementType value_type;
79 
99  ArrayView (value_type *starting_element,
100  const std::size_t n_elements);
101 
111  ArrayView (const ArrayView<typename boost::remove_cv<value_type>::type> &view);
112 
117  std::size_t size() const;
118 
128  value_type &operator[] (const std::size_t i) const;
129 
130 private:
135  value_type *const starting_element;
136 
140  const std::size_t n_elements;
141 };
142 
143 
144 
145 //---------------------------------------------------------------------------
146 
147 
148 template <typename ElementType>
149 inline
151  const std::size_t n_elements)
152  :
153  starting_element (starting_element),
154  n_elements(n_elements)
155 {}
156 
157 
158 
159 template <typename ElementType>
160 inline
161 ArrayView<ElementType>::ArrayView(const ArrayView<typename boost::remove_cv<value_type>::type> &view)
162  :
163  starting_element (&view[0]),
164  n_elements(view.size())
165 {}
166 
167 
168 
169 template <typename ElementType>
170 inline
171 std::size_t
173 {
174  return n_elements;
175 }
176 
177 
178 template <typename ElementType>
179 inline
181 ArrayView<ElementType>::operator[](const std::size_t i) const
182 {
183  Assert (i<n_elements, ExcIndexRange(i, 0, n_elements));
184 
185  return *(starting_element + i);
186 }
187 
188 
203 template <typename ElementType>
204 inline
206 make_array_view (std::vector<ElementType> &vector)
207 {
208  return ArrayView<ElementType> (&vector[0], vector.size());
209 }
210 
211 
212 
227 template <typename ElementType>
228 inline
230 make_array_view (const std::vector<ElementType> &vector)
231 {
232  return ArrayView<const ElementType> (&vector[0], vector.size());
233 }
234 
235 
236 
256 template <typename ElementType>
257 inline
259 make_array_view (std::vector<ElementType> &vector,
260  const std::size_t starting_index,
261  const std::size_t size_of_view)
262 {
263  Assert (starting_index + size_of_view <= vector.size(),
264  ExcMessage ("The starting index and size of the view you want to "
265  "create would lead to a view that extends beyond the end "
266  "of the given vector."));
267  return ArrayView<ElementType> (&vector[starting_index], size_of_view);
268 }
269 
270 
271 
291 template <typename ElementType>
292 inline
294 make_array_view (const std::vector<ElementType> &vector,
295  const std::size_t starting_index,
296  const std::size_t size_of_view)
297 {
298  Assert (starting_index + size_of_view <= vector.size(),
299  ExcMessage ("The starting index and size of the view you want to "
300  "create would lead to a view that extends beyond the end "
301  "of the given vector."));
302  return ArrayView<const ElementType> (&vector[starting_index], size_of_view);
303 }
304 
305 
306 
323 template <typename ElementType>
324 inline
327  const typename Table<2,ElementType>::size_type row)
328 {
329  AssertIndexRange (row, table.size()[0]);
330  return ArrayView<ElementType> (&table[row][0], table.size()[1]);
331 }
332 
333 
334 
351 template <typename ElementType>
352 inline
355  const typename Table<2,ElementType>::size_type row)
356 {
357  AssertIndexRange (row, table.size()[0]);
358  return ArrayView<const ElementType> (&table[row][0], table.size()[1]);
359 }
360 
361 
362 
382 template <typename ElementType>
383 inline
386  const typename Table<2,ElementType>::size_type row,
387  const typename Table<2,ElementType>::size_type starting_column,
388  const std::size_t size_of_view)
389 {
390  AssertIndexRange (row, table.size()[0]);
391  AssertIndexRange (starting_column, table.size()[1]);
392  Assert (starting_column + size_of_view <= table.size()[1],
393  ExcMessage ("The starting index and size of the view you want to "
394  "create would lead to a view that extends beyond the end "
395  "of a column of the given table."));
396  return ArrayView<ElementType> (&table[row][starting_column], size_of_view);
397 }
398 
399 
400 
420 template <typename ElementType>
421 inline
424  const typename Table<2,ElementType>::size_type row,
425  const typename Table<2,ElementType>::size_type starting_column,
426  const std::size_t size_of_view)
427 {
428  AssertIndexRange (row, table.size()[0]);
429  AssertIndexRange (starting_column, table.size()[1]);
430  Assert (starting_column + size_of_view <= table.size()[1],
431  ExcMessage ("The starting index and size of the view you want to "
432  "create would lead to a view that extends beyond the end "
433  "of a column of the given table."));
434  return ArrayView<const ElementType> (&table[row][starting_column], size_of_view);
435 }
436 
437 
438 
439 DEAL_II_NAMESPACE_CLOSE
440 
441 #endif
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
Definition: array_view.h:259
const std::size_t n_elements
Definition: array_view.h:140
::ExceptionBase & ExcMessage(std::string arg1)
ElementType value_type
Definition: array_view.h:78
#define AssertIndexRange(index, range)
Definition: exceptions.h:1081
ArrayView< const ElementType > make_array_view(const Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row, const typename Table< 2, ElementType >::size_type starting_column, const std::size_t size_of_view)
Definition: array_view.h:423
value_type & operator[](const std::size_t i) const
Definition: array_view.h:181
#define Assert(cond, exc)
Definition: exceptions.h:294
ArrayView< ElementType > make_array_view(Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row)
Definition: array_view.h:326
std::size_t size() const
Definition: array_view.h:172
ArrayView< const ElementType > make_array_view(const std::vector< ElementType > &vector, const std::size_t starting_index, const std::size_t size_of_view)
Definition: array_view.h:294
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector)
Definition: array_view.h:206
ArrayView(value_type *starting_element, const std::size_t n_elements)
Definition: array_view.h:150
ArrayView< const ElementType > make_array_view(const Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row)
Definition: array_view.h:354
Definition: table.h:33
unsigned int size(const unsigned int i) const
ArrayView< ElementType > make_array_view(Table< 2, ElementType > &table, const typename Table< 2, ElementType >::size_type row, const typename Table< 2, ElementType >::size_type starting_column, const std::size_t size_of_view)
Definition: array_view.h:385
AlignedVector< T >::size_type size_type
Definition: table.h:411
ArrayView< const ElementType > make_array_view(const std::vector< ElementType > &vector)
Definition: array_view.h:230
value_type *const starting_element
Definition: array_view.h:135