SWMMVis  6.0.0-alpha.4
Qt6/C++ GIS-based graphical user interface for the SWMMVis engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
storage.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2#pragma once
4#include <algorithm>
5#include <chrono>
6#include <string>
7#include <unordered_map>
8#include <unordered_set>
9#include <utility>
10#include <vector>
11
12namespace meshkit::detail
13{
14// Small internal storage vocabulary shared by the standard and Qt kernel
15// specializations. Public jobs own ordinary standard C++ arrays. No GUI mirror
16// or per-access conversion of the kernel's multi-million-entry buffers.
17template <class T> class Vector : public std::vector<T>
18{
19 using Base = std::vector<T>;
20
21public:
22 using Base::Base;
23 Vector() = default;
24 Vector(const std::vector<T> &v) : Base(v) {};
25 Vector(std::vector<T> &&v) : Base(std::move(v)) {}
26 decltype(auto) first() { return this->front(); }
27 decltype(auto) first() const { return this->front(); }
28 decltype(auto) last() { return this->back(); }
29 decltype(auto) last() const { return this->back(); }
30 const T *constData() const { return this->data(); }
31 Vector mid(std::ptrdiff_t at, std::ptrdiff_t count = -1) const
32 {
33 auto end = count < 0 ? this->size() : std::min(this->size(), at + count);
34 return {this->begin() + at, this->begin() + end};
35 }
36 void prepend(const T &v) { this->insert(this->begin(), v); }
37 void append(const Vector &v) { this->insert(this->end(), v.begin(), v.end()); }
39 {
40 append(v);
41 return *this;
42 }
43 Vector &operator<<(const T &v)
44 {
45 append(v);
46 return *this;
47 }
48
49 std::ptrdiff_t size() const noexcept { return static_cast<std::ptrdiff_t>(Base::size()); }
50 bool isEmpty() const { return this->empty(); }
51 void append(const T &v) { this->push_back(v); }
52 void append(T &&v) { this->push_back(std::move(v)); }
54 {
55 T result = std::move(this->back());
56 this->pop_back();
57 return result;
58 }
60 {
61 T result = std::move(this->front());
62 this->erase(this->begin());
63 return result;
64 }
65 void removeLast() { this->pop_back(); }
66 void removeAt(int at) { this->erase(this->begin() + at); }
67 void fill(const T &v) { std::fill(this->begin(), this->end(), v); }
68 void fill(const T &v, std::size_t size) { this->assign(size, v); }
69 bool contains(const T &v) const
70 {
71 return std::find(this->begin(), this->end(), v) != this->end();
72 }
73};
74template <class K> struct Hash : std::hash<K> {
75};
76template <class A, class B> struct Hash<std::pair<A, B>> {
77 std::size_t operator()(const std::pair<A, B> &p) const
78 {
79 const auto a = Hash<A>{}(p.first), b = Hash<B>{}(p.second);
80 return a ^ (b + std::size_t(0x9e3779b97f4a7c15ull) + (a << 6) + (a >> 2));
81 }
82};
83template <class K, class V> class Map
84{
85 using Base = std::unordered_map<K, V, Hash<K>>;
86 Base data_;
87
88public:
89 template <bool Const> class Iterator
90 {
91 using It =
92 std::conditional_t<Const, typename Base::const_iterator, typename Base::iterator>;
93 It it_;
94
95 public:
96 explicit Iterator(It it) : it_(it) {}
97 decltype(auto) value() const { return (it_->second); }
98 const K &key() const { return it_->first; }
99 decltype(auto) operator*() const { return (it_->second); }
100 auto operator->() const { return &it_->second; }
102 {
103 ++it_;
104 return *this;
105 }
106 bool operator==(const Iterator &b) const { return it_ == b.it_; }
107 bool operator!=(const Iterator &b) const { return it_ != b.it_; }
108 };
111 void clear() { data_.clear(); }
112 void reserve(std::size_t n) { data_.reserve(n); }
113 bool isEmpty() const { return data_.empty(); }
114 std::ptrdiff_t size() const { return data_.size(); }
115 bool contains(const K &k) const { return data_.find(k) != data_.end(); }
116 MutableIterator insert(const K &k, const V &v)
117 {
118 return MutableIterator(data_.insert_or_assign(k, v).first);
119 }
120 bool remove(const K &k) { return data_.erase(k) != 0; }
121 V &operator[](const K &k) { return data_[k]; }
122 V value(const K &k, const V &fallback = V{}) const
123 {
124 auto it = data_.find(k);
125 return it == data_.end() ? fallback : it->second;
126 }
127 MutableIterator find(const K &k) { return MutableIterator(data_.find(k)); }
128 MutableIterator begin() { return MutableIterator(data_.begin()); }
129 MutableIterator end() { return MutableIterator(data_.end()); }
130 ConstIterator constFind(const K &k) const { return ConstIterator(data_.find(k)); }
131 ConstIterator constEnd() const { return ConstIterator(data_.end()); }
132 ConstIterator cbegin() const { return ConstIterator(data_.cbegin()); }
133 ConstIterator cend() const { return ConstIterator(data_.cend()); }
134 ConstIterator begin() const { return cbegin(); }
135 ConstIterator end() const { return cend(); }
136};
137template <class K, class V> class MultiMap
138{
139 std::unordered_map<K, Vector<V>, Hash<K>> data_;
140
141public:
142 void clear() { data_.clear(); }
143 void remove(const K &key) { data_.erase(key); }
144 void insert(const K &key, const V &value)
145 {
146 auto &values = data_[key];
147 values.insert(values.begin(), value);
148 }
149 bool contains(const K &key, const V &value) const
150 {
151 auto it = data_.find(key);
152 return it != data_.end() && it->second.contains(value);
153 }
154 Vector<V> values(const K &key) const
155 {
156 auto it = data_.find(key);
157 return it == data_.end() ? Vector<V>{} : it->second;
158 }
159};
160template <class K> class Set : public std::unordered_set<K, Hash<K>>
161{
162public:
163 bool remove(const K &k) { return this->erase(k) != 0; }
164 bool isEmpty() const { return this->empty(); }
165 bool contains(const K &key) const { return this->find(key) != this->end(); }
166};
168 using Point = Point2;
169 using Box = Box2;
170 using String = std::string;
171 using PointInput = std::vector<Point2>;
172 template <class T> using Vector = detail::Vector<T>;
173 template <class K, class V> using Hash = Map<K, V>;
174 template <class K, class V> using MultiHash = MultiMap<K, V>;
175 template <class K> using Set = detail::Set<K>;
176 static String message(const char *s) { return s; }
178 {
179 return "cdt: non-finite input point " + std::to_string(i);
180 }
181};
182template <class F> class ScopeExit
183{
184 F f_;
185
186public:
187 explicit ScopeExit(F f) : f_(std::move(f)) {}
188 ~ScopeExit() { f_(); }
189 ScopeExit(const ScopeExit &) = delete;
190};
191template <class F> ScopeExit<F> scopeExit(F f)
192{
193 return ScopeExit<F>(std::move(f));
194}
195class Timer
196{
197 std::chrono::steady_clock::time_point start_;
198
199public:
200 void start() { start_ = std::chrono::steady_clock::now(); }
201 std::int64_t nsecsElapsed() const
202 {
203 return std::chrono::duration_cast<std::chrono::nanoseconds>(
204 std::chrono::steady_clock::now() - start_)
205 .count();
206 }
207};
208}
Definition geometry.hpp:59
Definition geometry.hpp:11
Definition storage.hpp:90
auto operator->() const
Definition storage.hpp:100
bool operator==(const Iterator &b) const
Definition storage.hpp:106
const K & key() const
Definition storage.hpp:98
bool operator!=(const Iterator &b) const
Definition storage.hpp:107
Iterator & operator++()
Definition storage.hpp:101
Iterator(It it)
Definition storage.hpp:96
decltype(auto) value() const
Definition storage.hpp:97
Definition storage.hpp:84
MutableIterator end()
Definition storage.hpp:129
ConstIterator constFind(const K &k) const
Definition storage.hpp:130
V value(const K &k, const V &fallback=V{}) const
Definition storage.hpp:122
V & operator[](const K &k)
Definition storage.hpp:121
bool contains(const K &k) const
Definition storage.hpp:115
Iterator< true > ConstIterator
Definition storage.hpp:109
Iterator< false > MutableIterator
Definition storage.hpp:110
bool isEmpty() const
Definition storage.hpp:113
bool remove(const K &k)
Definition storage.hpp:120
ConstIterator constEnd() const
Definition storage.hpp:131
MutableIterator find(const K &k)
Definition storage.hpp:127
ConstIterator cbegin() const
Definition storage.hpp:132
ConstIterator begin() const
Definition storage.hpp:134
void clear()
Definition storage.hpp:111
std::ptrdiff_t size() const
Definition storage.hpp:114
void reserve(std::size_t n)
Definition storage.hpp:112
ConstIterator end() const
Definition storage.hpp:135
ConstIterator cend() const
Definition storage.hpp:133
MutableIterator insert(const K &k, const V &v)
Definition storage.hpp:116
MutableIterator begin()
Definition storage.hpp:128
Definition storage.hpp:138
bool contains(const K &key, const V &value) const
Definition storage.hpp:149
void clear()
Definition storage.hpp:142
void remove(const K &key)
Definition storage.hpp:143
void insert(const K &key, const V &value)
Definition storage.hpp:144
Vector< V > values(const K &key) const
Definition storage.hpp:154
Definition storage.hpp:183
ScopeExit(F f)
Definition storage.hpp:187
ScopeExit(const ScopeExit &)=delete
~ScopeExit()
Definition storage.hpp:188
Definition storage.hpp:161
bool isEmpty() const
Definition storage.hpp:164
bool contains(const K &key) const
Definition storage.hpp:165
bool remove(const K &k)
Definition storage.hpp:163
Definition storage.hpp:196
std::int64_t nsecsElapsed() const
Definition storage.hpp:201
void start()
Definition storage.hpp:200
Definition storage.hpp:18
decltype(auto) last() const
Definition storage.hpp:29
void prepend(const T &v)
Definition storage.hpp:36
T takeFirst()
Definition storage.hpp:59
void removeAt(int at)
Definition storage.hpp:66
void append(T &&v)
Definition storage.hpp:52
void removeLast()
Definition storage.hpp:65
decltype(auto) first() const
Definition storage.hpp:27
Vector(std::vector< T > &&v)
Definition storage.hpp:25
void fill(const T &v)
Definition storage.hpp:67
Vector & operator<<(const T &v)
Definition storage.hpp:43
bool isEmpty() const
Definition storage.hpp:50
bool contains(const T &v) const
Definition storage.hpp:69
void fill(const T &v, std::size_t size)
Definition storage.hpp:68
Vector mid(std::ptrdiff_t at, std::ptrdiff_t count=-1) const
Definition storage.hpp:31
void append(const Vector &v)
Definition storage.hpp:37
const T * constData() const
Definition storage.hpp:30
Vector(const std::vector< T > &v)
Definition storage.hpp:24
std::ptrdiff_t size() const noexcept
Definition storage.hpp:49
T takeLast()
Definition storage.hpp:53
void append(const T &v)
Definition storage.hpp:51
decltype(auto) last()
Definition storage.hpp:28
Vector & operator+=(const Vector &v)
Definition storage.hpp:38
decltype(auto) first()
Definition storage.hpp:26
int begin
Definition constraints.cpp:103
int end
Definition constraints.cpp:103
size_t i
Definition contourjob.cpp:30
double s
Scene px per model length unit.
Definition inletdrawingview.cpp:95
ArrowPlacement p
Definition linesymbollayer.cpp:29
int k
Definition mesh2dresultsexport.cpp:694
Definition qtcdtstorage.h:9
ScopeExit< F > scopeExit(F f)
Definition storage.hpp:191
Definition blocks.hpp:25
int at
Definition constraintaudit.cpp:156
double value
Definition rasterfluxintegration.cpp:27
std::size_t operator()(const std::pair< A, B > &p) const
Definition storage.hpp:77
Definition storage.hpp:74
Definition storage.hpp:167
static String message(const char *s)
Definition storage.hpp:176
static String invalidPointMessage(int i)
Definition storage.hpp:177
std::string String
Definition storage.hpp:170
std::vector< Point2 > PointInput
Definition storage.hpp:171
double a
Definition terrainerrorfield.cpp:42
double b
Definition terrainerrorfield.cpp:42
quint64 count
Definition terrainerrorfield.cpp:43