dune-multidomaingrid 2.8
Loading...
Searching...
No Matches
arraybasedset.hh
Go to the documentation of this file.
1#ifndef DUNE_MULTIDOMAINGRID_ARRAYBASEDSET_HH
2#define DUNE_MULTIDOMAINGRID_ARRAYBASEDSET_HH
3
4#include <algorithm>
5#include <array>
6#include <cassert>
7#include <cstddef>
8#include <cstdint>
9#include <limits>
10#include <type_traits>
11#include <strings.h>
12
13#include <dune/common/exceptions.hh>
14
15namespace Dune {
16
17namespace mdgrid {
18
19template<typename SI, std::size_t capacity>
20class ArrayBasedSet;
21
22
23template<typename SI, std::size_t capacity>
26
27
28template<typename SI, std::size_t capacity>
31
32
33template<typename SI, std::size_t capacity>
35
36 friend bool setContains<>(const ArrayBasedSet<SI,capacity>& a,
38
39 friend void setAdd<>(ArrayBasedSet<SI,capacity>& a,
41
42public:
43 typedef SI SubDomainIndex;
44
45 static const std::size_t maxSize = capacity;
46 static const SubDomainIndex emptyTag = std::numeric_limits<SubDomainIndex>::max();
47 typedef typename std::array<SubDomainIndex,maxSize>::iterator ArrayIterator;
48 typedef typename std::array<SubDomainIndex,maxSize>::const_iterator Iterator;
50
52
54 {
56
57 static bool fixedSize(int dim, int codim)
58 {
59 return false;
60 }
61
62 static std::size_t size(const ArrayBasedSet& sds)
63 {
64 return sds.size();
65 }
66
67 template<typename MessageBufferImp>
68 static void gather(MessageBufferImp& buf, const ArrayBasedSet& sds)
69 {
70 for(Iterator it = sds.begin(); it != sds.end(); ++it)
71 buf.write(*it);
72 }
73
74 template<typename MessageBufferImp>
75 static void scatter(MessageBufferImp& buf, ArrayBasedSet& sds, std::size_t n)
76 {
78 h._size = n;
79 ArrayIterator end = h._set.begin() + n;
80 for (ArrayIterator it = h._set.begin(); it != end; ++it)
81 buf.read(*it);
82 sds.addAll(h);
83 }
84
85 };
86
87 Iterator begin() const {
88 return _set.begin();
89 }
90
91 Iterator end() const {
92 return _set.begin() + _size;
93 }
94
95 bool contains(SubDomainIndex domain) const {
96 return std::binary_search(_set.begin(),_set.begin() + _size,domain);
97 }
98
99 template<typename Set>
100 bool containsAll(const Set& set) const {
101 return setContains(*this,set);
102 }
103
104 void difference(const ArrayBasedSet& minuend, const ArrayBasedSet& subtrahend)
105 {
106 Iterator res = std::set_difference(minuend.begin(),minuend.end(),
107 subtrahend.begin(),subtrahend.end(),
108 _set.begin());
109 _size = res - _set.begin();
110 }
111
112 bool simple() const {
113 return _size == 1;
114 }
115
116 bool empty() const {
117 return _size == 0;
118 }
119
120 SetState state() const {
121 switch (_size) {
122 case 0:
123 return emptySet;
124 case 1:
125 return simpleSet;
126 default:
127 return multipleSet;
128 }
129 }
130
131 std::size_t size() const {
132 return _size;
133 }
134
135 void clear() {
136 _size = 0;
137 }
138
139 void add(SubDomainIndex domain) {
140 if (!std::binary_search(_set.begin(),_set.begin()+_size,domain)) {
141 assert(_size < maxSize);
142 _set[_size++] = domain;
143 std::sort(_set.begin(),_set.begin()+_size);
144 }
145 }
146
147 void remove(SubDomainIndex domain) {
148 ArrayIterator it = std::lower_bound(_set.begin(),_set.begin()+_size,domain);
149 assert(*it == domain);
150 *it = emptyTag;
151 std::sort(_set.begin(),_set.end() + (_size--));
152 }
153
154 void set(SubDomainIndex domain) {
155 _size = 1;
156 _set[0] = domain;
157 }
158
159 template<typename Set>
160 void addAll(const Set& set) {
161 setAdd(*this,set);
162 }
163
164 int domainOffset(SubDomainIndex domain) const {
165 Iterator it = std::lower_bound(_set.begin(),_set.begin()+_size,domain);
166 assert(*it == domain);
167 return it - _set.begin();
168 }
169
171 _size(0)
172 {}
173
174 bool operator==(const ArrayBasedSet& r) const {
175 return _size == r._size && std::equal(_set.begin(),_set.begin()+_size,r._set.begin());
176 }
177
178 bool operator!=(const ArrayBasedSet& r) const {
179 return !operator==(r);
180 }
181
182private:
183 std::size_t _size;
184 std::array<SubDomainIndex,maxSize> _set;
185
186};
187
188
189template<typename SubDomainIndex, std::size_t capacity>
192 return std::includes(a._set.begin(),a._set.begin() + a._size,b._set.begin(),b._set.begin() + b._size);
193}
194
195template<typename SubDomainIndex, std::size_t capacity>
198 std::array<SubDomainIndex,2*capacity> tmp;
199 typename std::array<SubDomainIndex,2*capacity>::iterator it = std::set_union(a._set.begin(), a._set.begin() + a._size,
200 b._set.begin(), b._set.begin() + b._size,
201 tmp.begin());
202 a._size = it - tmp.begin();
203 assert(a._size <= capacity);
204 std::copy(tmp.begin(),++it,a._set.begin());
205}
206
207} // namespace mdgrid
208
209} // namespace Dune
210
211#endif // DUNE_MULTIDOMAINGRID_ARRAYBASEDSET_HH
Definition: multidomaingrid.hh:8
bool setContains(const ArrayBasedSet< SI, capacity > &a, const ArrayBasedSet< SI, capacity > &b)
void setAdd(ArrayBasedSet< SI, capacity > &a, const ArrayBasedSet< SI, capacity > &b)
Definition: arraybasedset.hh:34
Iterator begin() const
Definition: arraybasedset.hh:87
void clear()
Definition: arraybasedset.hh:135
Iterator end() const
Definition: arraybasedset.hh:91
friend void setAdd(ArrayBasedSet< SI, capacity > &a, const ArrayBasedSet< SI, capacity > &b)
bool simple() const
Definition: arraybasedset.hh:112
std::size_t size() const
Definition: arraybasedset.hh:131
bool operator!=(const ArrayBasedSet &r) const
Definition: arraybasedset.hh:178
friend bool setContains(const ArrayBasedSet< SI, capacity > &a, const ArrayBasedSet< SI, capacity > &b)
void set(SubDomainIndex domain)
Definition: arraybasedset.hh:154
bool contains(SubDomainIndex domain) const
Definition: arraybasedset.hh:95
std::array< SubDomainIndex, maxSize >::const_iterator Iterator
Definition: arraybasedset.hh:48
bool operator==(const ArrayBasedSet &r) const
Definition: arraybasedset.hh:174
bool empty() const
Definition: arraybasedset.hh:116
void remove(SubDomainIndex domain)
Definition: arraybasedset.hh:147
SetState state() const
Definition: arraybasedset.hh:120
void difference(const ArrayBasedSet &minuend, const ArrayBasedSet &subtrahend)
Definition: arraybasedset.hh:104
int domainOffset(SubDomainIndex domain) const
Definition: arraybasedset.hh:164
bool containsAll(const Set &set) const
Definition: arraybasedset.hh:100
SI SubDomainIndex
Definition: arraybasedset.hh:43
SetState
Definition: arraybasedset.hh:51
@ multipleSet
Definition: arraybasedset.hh:51
@ emptySet
Definition: arraybasedset.hh:51
@ simpleSet
Definition: arraybasedset.hh:51
std::array< SubDomainIndex, maxSize >::iterator ArrayIterator
Definition: arraybasedset.hh:47
static const std::size_t maxSize
Definition: arraybasedset.hh:45
ArrayBasedSet< SubDomainIndex, capacity > This
Definition: arraybasedset.hh:49
static const SubDomainIndex emptyTag
Definition: arraybasedset.hh:46
ArrayBasedSet()
Definition: arraybasedset.hh:170
void addAll(const Set &set)
Definition: arraybasedset.hh:160
void add(SubDomainIndex domain)
Definition: arraybasedset.hh:139
Definition: arraybasedset.hh:54
static void scatter(MessageBufferImp &buf, ArrayBasedSet &sds, std::size_t n)
Definition: arraybasedset.hh:75
static std::size_t size(const ArrayBasedSet &sds)
Definition: arraybasedset.hh:62
SubDomainIndex DataType
Definition: arraybasedset.hh:55
static void gather(MessageBufferImp &buf, const ArrayBasedSet &sds)
Definition: arraybasedset.hh:68
static bool fixedSize(int dim, int codim)
Definition: arraybasedset.hh:57