DSC
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros
simplex_set.h
1 //
2 // Deformabel Simplicial Complex (DSC) method
3 // Copyright (C) 2013 Technical University of Denmark
4 //
5 // This program is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // See licence.txt for a copy of the GNU General Public License.
16 
17 #pragma once
18 
19 #include <vector>
20 #include <cassert>
21 #include <set>
22 #include "key.h"
23 
24 namespace is_mesh
25 {
26  class ISMesh;
27 
28  template<typename key_type>
29  class SimplexSet
30  {
31  std::vector<key_type> set;
32 
33  public:
34 
35  SimplexSet() noexcept : set()
36  {
37 
38  }
39 
40  template <class InputIterator>
41  SimplexSet(InputIterator first, InputIterator last) noexcept : set(first, last)
42  {
43  }
44 
45 
46  SimplexSet(std::initializer_list<key_type> il) noexcept : set(il)
47  {
48 
49  }
50 
51  SimplexSet(const SimplexSet& ss) noexcept : set(ss.set)
52  {
53 
54  }
55 
56  SimplexSet& operator=(const SimplexSet& ss) noexcept
57  {
58  set = ss.set;
59  return *this;
60  }
61 
62  SimplexSet(SimplexSet&& ss) noexcept
63  {
64  set = std::move(ss.set);
65  }
66 
67  SimplexSet& operator=(SimplexSet&& ss) noexcept
68  {
69  if (this != &ss){
70  std::swap(set, ss.set);
71  }
72  return *this;
73  }
74 
75  ~SimplexSet()
76  {
77 
78  }
79 
80  typename std::vector<key_type>::const_iterator begin() const
81  {
82  return set.begin();
83  }
84 
85  typename std::vector<key_type>::const_iterator end() const
86  {
87  return set.end();
88  }
89 
90  unsigned int size() const
91  {
92  return static_cast<unsigned int>(set.size());
93  }
94 
95  const key_type& front() const
96  {
97  assert(set.size() > 0);
98  return set.front();
99  }
100 
101  const key_type& back() const
102  {
103  assert(set.size() > 0);
104  return set.back();
105  }
106 
107  key_type pop_back() {
108  key_type last = back();
109  set.pop_back();
110  return last;
111  }
112 
113  const key_type& operator[](unsigned int i) const
114  {
115  assert(size() > i);
116  return set[i];
117  }
118 
119  bool contains(const key_type& k) const noexcept
120  {
121  return std::find(set.begin(), set.end(), k) != end();
122  }
123 
124  int index(const key_type& k) const noexcept
125  {
126  for (int i = 0; i < set.size(); i++) {
127  if(set[i] == k)
128  {
129  return i;
130  }
131  }
132  return -1;
133  }
134 
135  void push_front(const key_type& k)
136  {
137  assert(!contains(k));
138  set.insert(set.begin(), k);
139  }
140 
141  void push_back(const key_type& k)
142  {
143  assert(!contains(k));
144  set.push_back(k);
145  }
146 
147  void swap(unsigned int i = 0, unsigned int j = 1)
148  {
149  assert(size() > i);
150  assert(size() > j);
151  std::swap(set[i], set[j]);
152  }
153 
154  SimplexSet<key_type>& operator+=(const SimplexSet<key_type>& ss)
155  {
156  for (key_type k : ss) {
157  *this += k;
158  }
159  return *this;
160  }
161 
163  {
164  for (key_type k : ss.set) {
165  *this += k;
166  }
167  return *this;
168  }
169 
170  SimplexSet<key_type>& operator+=(key_type key)
171  {
172  if(!contains(key))
173  {
174  set.push_back(key);
175  }
176  return *this;
177  }
178 
179  SimplexSet<key_type>& operator-=(const SimplexSet<key_type>& set)
180  {
181  for (auto &k : set) {
182  *this -= k;
183  }
184  return *this;
185  }
186 
187  SimplexSet<key_type>& operator-=(key_type key)
188  {
189  auto iter = std::find(begin(), end(), key);
190  if(iter != end())
191  {
192  set.erase(iter);
193  }
194  return *this;
195  }
196  };
197 
198  template<typename key_type>
199  bool operator==(const SimplexSet<key_type>& A, const SimplexSet<key_type>& B) noexcept
200  {
201  if(A.size() == B.size())
202  {
203  for (auto k : A)
204  {
205  if(!B.contains(k))
206  {
207  return false;
208  }
209  }
210  return true;
211  }
212  return false;
213  }
214 
218  template<typename key_type>
220  {
221  SimplexSet<key_type> C = A;
222  return C += B;
223  }
224 
228  template<typename key_type>
230  {
231  return std::move(A += B);
232  }
233 
237  template<typename key_type>
239  {
240  return std::move(A) + B;
241  }
242 
246  template<typename key_type>
248  {
249  return std::move(B) + A;
250  }
251 
255  template<typename key_type>
257  {
258  SimplexSet<key_type> C = A;
259  return C -= B;
260  }
261 
265  template<typename key_type>
267  {
268  return std::move(A -= B);
269  }
270 
274  template<typename key_type>
275  SimplexSet<key_type> operator-(const SimplexSet<key_type>& A, const key_type& key)
276  {
277  SimplexSet<key_type> B = {key};
278  return A - B;
279  }
280 
284  template<typename key_type>
286  {
287  return std::move(A -= key);
288  }
289 
293  template<typename key_type>
295  {
296  SimplexSet<key_type> C = A;
297  return C - (A - B);
298  }
299 
303  template<typename key_type>
305  {
306  auto C = (A - B);
307  return std::move(A) - C;
308  }
309 }
Definition: simplex_set.h:29
SimplexSet< key_type > operator+(const SimplexSet< key_type > &A, const SimplexSet< key_type > &B)
Definition: simplex_set.h:219
SimplexSet< key_type > operator&(const SimplexSet< key_type > &A, const SimplexSet< key_type > &B)
Definition: simplex_set.h:294
SimplexSet< key_type > operator-(const SimplexSet< key_type > &A, const SimplexSet< key_type > &B)
Definition: simplex_set.h:256