SPH
FlatSet.h
Go to the documentation of this file.
1 #pragma once
2 
7 
10 #include <algorithm>
11 
13 
14 template <typename T, typename TLess = std::less<T>>
15 class FlatSet : TLess, Noncopyable {
16 private:
17  Array<T> data;
18 
19 public:
20  FlatSet() = default;
21 
22  FlatSet(std::initializer_list<T> list) {
23  for (const T& value : list) {
24  this->insert(value);
25  }
26  }
27 
28  INLINE Size size() const {
29  return data.size();
30  }
31 
32  INLINE bool empty() const {
33  return data.empty();
34  }
35 
36  INLINE T& operator[](const Size idx) {
37  return data[idx];
38  }
39 
40  INLINE const T& operator[](const Size idx) const {
41  return data[idx];
42  }
43 
44  template <typename U>
45  bool insert(U&& value) {
46  Size from = 0;
47  Size to = data.size();
48  Size mid = Size(-1);
49 
50  while (from < to && from != mid) {
51  mid = (from + to) / 2;
52  if (less(data[mid], value)) {
53  from = mid + 1;
54  } else if (less(value, data[mid])) {
55  to = mid;
56  } else {
57  // found the same value, skip
58  return false;
59  }
60  }
61  data.insert(from, std::forward<U>(value));
62  return true;
63  }
64 
65  template <typename TIter>
66  void insert(TIter first, TIter last) {
67  data.insert(data.size(), first, last);
68  std::sort(data.begin(), data.end(), TLess{});
69  data.remove(std::unique(data.begin(), data.end()), data.end());
70  }
71 
72  void reserve(const Size capacity) {
73  data.reserve(capacity);
74  }
75 
76  Iterator<T> find(const T& value) {
77  auto iter = std::lower_bound(data.begin(), data.end(), value);
78  if (iter != data.end() && *iter == value) {
79  return iter;
80  } else {
81  return data.end();
82  }
83  }
84 
85  Iterator<const T> find(const T& value) const {
86  return const_cast<FlatSet*>(this)->find(value);
87  }
88 
89  bool contains(const T& value) {
90  return this->find(value) != this->end();
91  }
92 
94  const Size idx = pos - data.begin();
95  data.remove(idx);
96  return data.begin() + idx;
97  }
98 
99  void clear() {
100  data.clear();
101  }
102 
104  return data.begin();
105  }
106 
108  return data.begin();
109  }
110 
112  return data.end();
113  }
114 
116  return data.end();
117  }
118 
119  operator ArrayView<T>() {
120  return data;
121  }
122 
123  operator ArrayView<const T>() const {
124  return data;
125  }
126 
127  const Array<T>& array() const& {
128  return data;
129  }
130 
132  return std::move(data);
133  }
134 
135 private:
136  INLINE bool less(const T& t1, const T& t2) const {
137  return TLess::operator()(t1, t2);
138  }
139 };
140 
Generic dynamically allocated resizable storage.
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
uint32_t Size
Integral type used to index arrays (by default).
Definition: Globals.h:16
#define INLINE
Macros for conditional compilation based on selected compiler.
Definition: Object.h:31
#define NAMESPACE_SPH_END
Definition: Object.h:12
Wrapper of type value of which may or may not be present.
Object providing safe access to continuous memory of data.
Definition: ArrayView.h:17
Generic dynamically allocated resizable storage.
Definition: Array.h:43
void reserve(const TCounter newMaxSize)
Allocates enough memory to store the given number of elements.
Definition: Array.h:279
INLINE Iterator< StorageType > end() noexcept
Definition: Array.h:462
void remove(const TCounter idx)
Removes an element with given index from the array.
Definition: Array.h:383
void insert(const TCounter position, U &&value)
Inserts a new element to given position in the array.
Definition: Array.h:345
void clear()
Removes all elements from the array, but does NOT release the memory.
Definition: Array.h:434
INLINE TCounter size() const noexcept
Definition: Array.h:193
INLINE bool empty() const noexcept
Definition: Array.h:201
INLINE Iterator< StorageType > begin() noexcept
Definition: Array.h:450
INLINE T & operator[](const Size idx)
Definition: FlatSet.h:36
void insert(TIter first, TIter last)
Definition: FlatSet.h:66
bool insert(U &&value)
Definition: FlatSet.h:45
bool contains(const T &value)
Definition: FlatSet.h:89
Iterator< T > erase(Iterator< T > pos)
Definition: FlatSet.h:93
Iterator< T > begin()
Definition: FlatSet.h:103
const Array< T > & array() const &
Definition: FlatSet.h:127
FlatSet(std::initializer_list< T > list)
Definition: FlatSet.h:22
INLINE bool empty() const
Definition: FlatSet.h:32
INLINE const T & operator[](const Size idx) const
Definition: FlatSet.h:40
void clear()
Definition: FlatSet.h:99
Iterator< const T > find(const T &value) const
Definition: FlatSet.h:85
Iterator< T > find(const T &value)
Definition: FlatSet.h:76
Iterator< const T > end() const
Definition: FlatSet.h:115
Iterator< const T > begin() const
Definition: FlatSet.h:107
Iterator< T > end()
Definition: FlatSet.h:111
FlatSet()=default
void reserve(const Size capacity)
Definition: FlatSet.h:72
Array< T > array() &&
Definition: FlatSet.h:131
INLINE Size size() const
Definition: FlatSet.h:28
Simple (forward) iterator over continuous array of objects of type T.
Definition: Iterator.h:18
Object with deleted copy constructor and copy operator.
Definition: Object.h:54