dune-multidomaingrid 2.10-git
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
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
38
41
42public:
44
45 static const std::size_t maxSize = capacity;
50
52
54 {
56
57 static bool fixedSize(int dim, int codim)
58 {
59 return false;
60 }
61
63 {
64 return sds.size();
65 }
66
67 template<typename MessageBufferImp>
69 {
70 for(Iterator it = sds.begin(); it != sds.end(); ++it)
71 buf.write(*it);
72 }
73
74 template<typename MessageBufferImp>
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
105 {
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
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;
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>
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
bool setContains(const ArrayBasedSet< SI, capacity > &a, const ArrayBasedSet< SI, capacity > &b)
void setAdd(ArrayBasedSet< SI, capacity > &a, const ArrayBasedSet< SI, capacity > &b)
size_type dim() const
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
T begin(T... args)
T binary_search(T... args)
T copy(T... args)
T end(T... args)
T equal(T... args)
T includes(T... args)
T lower_bound(T... args)
T max(T... args)
T set_difference(T... args)
T set_union(T... args)
T sort(T... args)