NuTo
Numerics Tool
Group.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include <boost/iterator/indirect_iterator.hpp>
5 
6 namespace NuTo
7 {
14 template <typename T>
15 class Group
16 {
18  class SortedUniqueVector
19  {
20  public:
24  bool Add(const T& element)
25  {
26  auto it = std::lower_bound(mData.begin(), mData.end(), &element);
27  if (it == mData.end() || *it != &element)
28  {
29  mData.insert(it, &element);
30  return true;
31  }
32  return false;
33  }
34 
35  bool Contains(const T& element) const
36  {
37  auto it = std::lower_bound(mData.begin(), mData.end(), &element);
38  if (it == mData.end())
39  return false;
40  return *it == &element;
41  }
42 
43  private:
44  std::vector<const T*> mData;
45  };
46 
47  typedef std::vector<T*> Data;
48 
49 public:
51  typedef boost::indirect_iterator<typename Data::iterator> GroupIterator;
52  typedef boost::indirect_iterator<typename Data::const_iterator> ConstGroupIterator;
53 
55  Group() = default;
56 
60  {
61  Add(element);
62  }
63 
67  Group(std::initializer_list<std::reference_wrapper<T>> elements)
68  {
69  for (auto element : elements)
70  Add(element);
71  }
72 
73  T& operator[](size_t index)
74  {
75  return *mData[index];
76  }
77 
78  const T& operator[](size_t index) const
79  {
80  return *mData[index];
81  }
82 
85  void Add(T& element)
86  {
87  if (mUniqueData.Add(element))
88  mData.push_back(&element);
89  }
90 
93  bool Contains(const T& element) const
94  {
95  return mUniqueData.Contains(element);
96  }
97 
99  bool Empty() const
100  {
101  return Size() == 0;
102  }
103 
105  auto Size() const
106  {
107  return mData.size();
108  }
109 
111  ConstGroupIterator begin() const
112  {
113  return mData.begin();
114  }
115 
117  ConstGroupIterator end() const
118  {
119  return mData.end();
120  }
121 
123  GroupIterator begin()
124  {
125  return mData.begin();
126  }
127 
129  GroupIterator end()
130  {
131  return mData.end();
132  }
133 
134 private:
136  Data mData;
137 
139  SortedUniqueVector mUniqueData;
140 };
141 
143 template <typename T>
144 Group<T> Unite(const Group<T>& one, const Group<T>& two)
145 {
146  Group<T> newGroup = one;
147  for (auto& t : two)
148  newGroup.Add(t);
149  return newGroup;
150 }
151 
153 template <typename T, typename... TArgs>
154 Group<T> Unite(const Group<T>& one, const TArgs&... args)
155 {
156  return Unite(one, Unite(args...));
157 }
158 
160 template <typename T>
161 Group<T> Difference(const Group<T>& one, const Group<T>& two)
162 {
163  Group<T> newGroup;
164  for (auto& t : one)
165  if (not two.Contains(t))
166  newGroup.Add(t);
167  return newGroup;
168 }
169 
171 template <typename T>
172 Group<T> Intersection(const Group<T>& one, const Group<T>& two)
173 {
174  Group<T> newGroup;
175  for (auto& t : one)
176  if (two.Contains(t))
177  newGroup.Add(t);
178  return newGroup;
179 }
180 
181 
183 template <typename T>
185 {
186  return Difference(Unite(one, two), Intersection(one, two));
187 }
188 } // namespace NuTo
ConstGroupIterator end() const
Iterate over group elements (by value not pointer)
Definition: Group.h:117
auto Size() const
Number of constituents.
Definition: Group.h:105
Group< T > Unite(const Group< T > &one, const Group< T > &two)
Unite two groups.
Definition: Group.h:144
ConstGroupIterator begin() const
Iterate over group elements (by value not pointer)
Definition: Group.h:111
T & operator[](size_t index)
Definition: Group.h:73
Group(T &element)
Create a group containing a single element.
Definition: Group.h:59
element
Definition: DamageBar.py:31
Group< T > Difference(const Group< T > &one, const Group< T > &two)
Returns group with elements of group one that are not in group two.
Definition: Group.h:161
const T & operator[](size_t index) const
Definition: Group.h:78
boost::indirect_iterator< typename Data::iterator > GroupIterator
indirect (dereferencing) iterator to provide value semantics for the iterators
Definition: Group.h:51
boost::indirect_iterator< typename Data::const_iterator > ConstGroupIterator
Definition: Group.h:52
GroupIterator begin()
Iterate over group elements (by value not pointer)
Definition: Group.h:123
Group()=default
Create an empty group.
Group(std::initializer_list< std::reference_wrapper< T >> elements)
Create a group containing multiple elements.
Definition: Group.h:67
bool Contains(const T &element) const
True if element is contained in group.
Definition: Group.h:93
bool Empty() const
True if group is empty.
Definition: Group.h:99
GroupIterator end()
Iterate over group elements (by value not pointer)
Definition: Group.h:129
Definition: Exception.h:6
void Add(T &element)
Add element to group.
Definition: Group.h:85
Ordered container class for elements, nodes and the like.
Definition: Group.h:15
Group< T > Intersection(const Group< T > &one, const Group< T > &two)
Returns group with elements that are in both groups.
Definition: Group.h:172
Group< T > SymmetricDifference(const Group< T > &one, const Group< T > &two)
Returns group with elements that are only in one group not in both.
Definition: Group.h:184