Reference documentation for deal.II version 9.4.0
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
collection.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (C) 2021 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.md at
12// the top level directory of deal.II.
13//
14// ---------------------------------------------------------------------
15
16#ifndef dealii_hp_collection_h
17#define dealii_hp_collection_h
18
19#include <deal.II/base/config.h>
20
23
24#include <memory>
25#include <vector>
26
28
29namespace hp
30{
34 template <typename T>
36 {
37 public:
44 CollectionIterator(const std::vector<std::shared_ptr<const T>> &data,
45 const std::size_t index)
46 : data(&data)
47 , index(index)
48 {}
49
54
59 operator=(const CollectionIterator<T> &other) = default;
60
64 bool
66 {
67 Assert(
68 this->data == other.data,
70 "You are trying to compare iterators into different hp::Collection objects."));
71 return this->index == other.index;
72 }
73
77 bool
79 {
80 Assert(
81 this->data == other.data,
83 "You are trying to compare iterators into different hp::Collection objects."));
84 return this->index != other.index;
85 }
86
90 const T &
91 operator*() const
92 {
93 AssertIndexRange(index, data->size());
94 return *(*data)[index];
95 }
96
104 {
105 AssertIndexRange(index + 1, data->size() + 1);
106 index++;
107 return *this;
108 }
109
115 operator+=(const std::size_t offset)
116 {
117 AssertIndexRange(index + offset, data->size() + 1);
118 index += offset;
119 return *this;
120 }
121
129 {
130 Assert(
131 index > 0,
133 "You can't decrement an iterator that is already at the beginning of the range."));
134 --index;
135 return *this;
136 }
137
142 operator+(const std::size_t &offset) const
143 {
144 AssertIndexRange(index + offset, T::size() + 1);
145 return CollectionIterator<T>(*data, index + offset);
146 }
147
151 std::ptrdiff_t
153 {
154 return static_cast<std::ptrdiff_t>(index) -
155 static_cast<ptrdiff_t>(other.index);
156 }
157
158 private:
162 const std::vector<std::shared_ptr<const T>> *data;
163
167 std::size_t index;
168 };
169
179 template <typename T>
180 class Collection : public Subscriptor
181 {
182 public:
187 Collection() = default;
188
192 void
193 push_back(const std::shared_ptr<const T> &new_entry);
194
202 const T &
203 operator[](const unsigned int index) const;
204
208 unsigned int
209 size() const;
210
215 std::size_t
217
223 begin() const;
224
230 end() const;
231
232 private:
236 std::vector<std::shared_ptr<const T>> entries;
237 };
238
239
240 /* --------------- inline functions ------------------- */
241
242
243
244 template <typename T>
245 std::size_t
247 {
248 return (sizeof(*this) + MemoryConsumption::memory_consumption(entries));
249 }
250
251
252
253 template <typename T>
254 void
255 Collection<T>::push_back(const std::shared_ptr<const T> &new_entry)
256 {
257 entries.push_back(new_entry);
258 }
259
260
261
262 template <typename T>
263 inline unsigned int
265 {
266 return entries.size();
267 }
268
269
270
271 template <typename T>
272 inline const T &
273 Collection<T>::operator[](const unsigned int index) const
274 {
275 AssertIndexRange(index, entries.size());
276 return *entries[index];
277 }
278
279
280
281 template <typename T>
284 {
285 return CollectionIterator<T>(entries, 0);
286 }
287
288
289
290 template <typename T>
293 {
294 return CollectionIterator<T>(entries, entries.size());
295 }
296
297} // namespace hp
298
299
301
302namespace std
303{
307 template <class T>
308 struct iterator_traits<::hp::CollectionIterator<T>>
309 {
310 using iterator_category = random_access_iterator_tag;
311 using value_type = T;
312 using difference_type = std::ptrdiff_t;
313 };
314} // namespace std
315
316#endif
std::ptrdiff_t operator-(const CollectionIterator< T > &other) const
Definition: collection.h:152
CollectionIterator< T > operator+(const std::size_t &offset) const
Definition: collection.h:142
const T & operator*() const
Definition: collection.h:91
CollectionIterator< T > & operator++()
Definition: collection.h:103
CollectionIterator< T > & operator+=(const std::size_t offset)
Definition: collection.h:115
CollectionIterator(const std::vector< std::shared_ptr< const T > > &data, const std::size_t index)
Definition: collection.h:44
CollectionIterator(const CollectionIterator< T > &other)=default
CollectionIterator< T > & operator=(const CollectionIterator< T > &other)=default
bool operator==(const CollectionIterator< T > &other) const
Definition: collection.h:65
bool operator!=(const CollectionIterator< T > &other) const
Definition: collection.h:78
CollectionIterator< T > & operator--()
Definition: collection.h:128
const std::vector< std::shared_ptr< const T > > * data
Definition: collection.h:162
void push_back(const std::shared_ptr< const T > &new_entry)
Definition: collection.h:255
std::vector< std::shared_ptr< const T > > entries
Definition: collection.h:236
CollectionIterator< T > begin() const
Definition: collection.h:283
unsigned int size() const
Definition: collection.h:264
std::size_t memory_consumption() const
Definition: collection.h:246
Collection()=default
CollectionIterator< T > end() const
Definition: collection.h:292
const T & operator[](const unsigned int index) const
Definition: collection.h:273
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:442
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:443
#define Assert(cond, exc)
Definition: exceptions.h:1473
#define AssertIndexRange(index, range)
Definition: exceptions.h:1732
static ::ExceptionBase & ExcMessage(std::string arg1)
static const char T
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
Definition: hp.h:118
STL namespace.