20 #ifndef LIBREPCB_CORE_SERIALIZABLEOBJECTLIST_H 21 #define LIBREPCB_CORE_SERIALIZABLEOBJECTLIST_H 26 #include "../exceptions.h" 27 #include "../types/uuid.h" 28 #include "../utils/signalslot.h" 95 template <
typename T,
typename P,
typename... OnEditedArgs>
101 template <
typename I,
typename O>
116 std::shared_ptr<O>
ptr() noexcept {
117 return std::const_pointer_cast<O>(*it);
132 const std::shared_ptr<const T>&,
Event>
135 const std::shared_ptr<const T>&,
Event>
138 const std::shared_ptr<const T>&, OnEditedArgs...>
141 const std::shared_ptr<const T>&, OnEditedArgs...>
170 while (!other.isEmpty()) {
175 std::initializer_list<std::shared_ptr<T>> elements) noexcept
182 foreach (
const std::shared_ptr<T>& obj, elements) {
append(obj); }
200 std::vector<Uuid> uuids;
202 foreach (
const std::shared_ptr<T>& obj,
mObjects) {
203 uuids.push_back(obj->getUuid());
210 foreach (
const std::shared_ptr<T>& obj,
mObjects) {
211 uuids.insert(obj->getUuid());
218 for (
int i = 0; i <
count(); ++i) {
226 for (
int i = 0; i <
count(); ++i) {
227 if (
mObjects[i]->getUuid() == key) {
233 int indexOf(
const QString& name)
const noexcept {
234 for (
int i = 0; i <
count(); ++i) {
235 if (
mObjects[i]->getName() == name) {
242 return index >= 0 && index <
mObjects.count();
246 bool contains(
const QString& name)
const noexcept {
251 std::shared_ptr<T>
value(
int index) noexcept {
return mObjects.value(index); }
252 std::shared_ptr<const T>
value(
int index)
const noexcept {
253 return std::const_pointer_cast<
const T>(
mObjects.value(index));
256 std::shared_ptr<T>
find(
const Uuid& key) noexcept {
259 std::shared_ptr<const T>
find(
const Uuid& key)
const noexcept {
262 std::shared_ptr<T>
find(
const QString& name) noexcept {
265 std::shared_ptr<const T>
find(
const QString& name)
const noexcept {
270 std::shared_ptr<const T>
at(
int index)
const noexcept {
271 return std::const_pointer_cast<
const T>(
mObjects.at(index));
274 std::shared_ptr<const T>
first() const noexcept {
return mObjects.first(); }
276 std::shared_ptr<const T>
last() const noexcept {
return mObjects.last(); }
277 std::shared_ptr<T>
get(
const T* obj) {
278 std::shared_ptr<T>
ptr =
find(obj);
279 if (!ptr)
throw LogicError(__FILE__, __LINE__);
282 std::shared_ptr<T>
get(
const Uuid& key) {
283 std::shared_ptr<T>
ptr =
find(key);
287 std::shared_ptr<const T>
get(
const Uuid& key)
const {
288 std::shared_ptr<const T>
ptr =
find(key);
292 std::shared_ptr<T>
get(
const QString& name) {
293 std::shared_ptr<T>
ptr =
find(name);
297 std::shared_ptr<const T>
get(
const QString& name)
const {
298 std::shared_ptr<const T>
ptr =
find(name);
315 append(std::make_shared<T>(*child));
319 void swap(
int i,
int j) noexcept {
321 qBound(0, i,
count() - 1);
322 qBound(0, j,
count() - 1);
324 if (i > j) qSwap(i, j);
325 std::shared_ptr<T> oj =
take(j);
326 std::shared_ptr<T> oi =
take(i);
330 int insert(
int index,
const std::shared_ptr<T>& obj) noexcept {
332 qBound(0, index,
count());
336 int append(
const std::shared_ptr<T>& obj) noexcept {
341 foreach (
const std::shared_ptr<T>&
ptr, list.mObjects) {
345 std::shared_ptr<T>
take(
int index) noexcept {
350 std::shared_ptr<T>
take(
const Uuid& uuid) noexcept {
353 std::shared_ptr<T>
take(
const QString& name) noexcept {
356 void remove(
int index) noexcept {
take(index); }
357 void remove(
const T* obj) noexcept {
take(obj); }
358 void remove(
const Uuid& uuid) noexcept {
take(uuid); }
359 void remove(
const QString& name) noexcept {
take(name); }
362 for (
int i =
count() - 1; i >= 0; --i) {
374 foreach (
const std::shared_ptr<T>&
ptr,
mObjects) {
382 template <
typename Compare>
387 std::sort(copiedList.mObjects.begin(), copiedList.mObjects.end(),
388 [&lessThan](
const std::shared_ptr<T>& ptr1,
389 const std::shared_ptr<T>& ptr2) {
390 return lessThan(*ptr1, *ptr2);
395 return sorted([](
const T& lhs,
const T& rhs) {
396 return lhs.getUuid() < rhs.getUuid();
411 if (rhs.mObjects.count() !=
mObjects.count())
return false;
412 for (
int i = 0; i <
mObjects.count(); ++i) {
413 if (*rhs.mObjects[i] != *
mObjects[i])
return false;
419 return !(*
this == rhs);
425 foreach (
const std::shared_ptr<T>&
ptr, rhs.mObjects) {
427 *ptr,
typename std::is_nothrow_copy_constructible<T>::type()));
435 foreach (
const std::shared_ptr<T>&
ptr, rhs.mObjects) {
449 std::shared_ptr<T> obj =
mObjects.takeAt(index);
460 qCritical() <<
"Received notification from unknown list element!";
468 "no element of type \"%1\" with the UUID \"%2\" in the list."))
477 "no element of type \"%1\" with the name \"%2\" in the list."))
484 std::true_type copyConstructable) noexcept {
485 Q_UNUSED(copyConstructable);
486 return std::make_shared<T>(other);
489 std::false_type copyConstructable) noexcept {
490 Q_UNUSED(copyConstructable);
491 return other.cloneShared();
507 #if (QT_VERSION > QT_VERSION_CHECK(5, 9, 0)) 508 namespace QtPrivate {
511 template <
typename T,
typename P,
typename... OnEditedArgs>
512 class QForeachContainer<
515 ~QForeachContainer() =
delete;
517 template <
typename T,
typename P,
typename... OnEditedArgs>
518 class QForeachContainer<
521 ~QForeachContainer() =
delete;
524 #if (QT_VERSION > QT_VERSION_CHECK(5, 9, 0)) I it
Definition: serializableobjectlist.h:103
const_iterator cend() noexcept
Definition: serializableobjectlist.h:307
The LogicError class.
Definition: exceptions.h:179
bool operator!=(const Iterator &rhs) const noexcept
Definition: serializableobjectlist.h:109
SerializableObjectList(SerializableObjectList< T, P, OnEditedArgs... > &&other) noexcept
Definition: serializableobjectlist.h:162
Slot< SerializableObjectList< T, P, OnEditedArgs... >, int, const std::shared_ptr< const T > &, Event > OnEditedSlot
Definition: serializableobjectlist.h:136
std::shared_ptr< T > & last() noexcept
Definition: serializableobjectlist.h:275
SerializableObjectList< T, P, OnEditedArgs... > sortedByUuid() const noexcept
Definition: serializableobjectlist.h:394
const QList< SExpression > & getChildren() const noexcept
Get all children of this node.
Definition: sexpression.h:99
std::shared_ptr< T > value(int index) noexcept
Definition: serializableobjectlist.h:251
void clear() noexcept
Definition: serializableobjectlist.h:360
int loadFromSExpression(const SExpression &node)
Definition: serializableobjectlist.h:312
std::shared_ptr< T > copyObject(const T &other, std::true_type copyConstructable) noexcept
Definition: serializableobjectlist.h:483
void ensureLineBreak()
Definition: sexpression.cpp:191
std::vector< Uuid > getUuids() const noexcept
Definition: serializableobjectlist.h:199
std::shared_ptr< T > operator[](int i) noexcept
Definition: serializableobjectlist.h:401
iterator end() noexcept
Definition: serializableobjectlist.h:309
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition: serializableobjectlist.h:373
Definition: occmodel.cpp:76
Iterator(const I &it) noexcept
Definition: serializableobjectlist.h:108
The SerializableObjectList class implements a list of serializable objects.
Definition: serializableobjectlist.h:96
int indexOf(const QString &name) const noexcept
Definition: serializableobjectlist.h:233
Slot< SerializableObjectList< T, P, OnEditedArgs... >, int, const std::shared_ptr< const T > &, OnEditedArgs... > OnElementEditedSlot
Definition: serializableobjectlist.h:142
O & operator*()
Definition: serializableobjectlist.h:114
std::shared_ptr< O > ptr() noexcept
Definition: serializableobjectlist.h:116
int count() const noexcept
Definition: serializableobjectlist.h:197
void elementEditedHandler(const T &obj, OnEditedArgs... args) noexcept
Definition: serializableobjectlist.h:454
SerializableObjectList< T, P, OnEditedArgs... > & operator=(const SerializableObjectList< T, P, OnEditedArgs... > &rhs) noexcept
Definition: serializableobjectlist.h:421
SExpression & appendList(const QString &name)
Definition: sexpression.cpp:197
bool contains(int index) const noexcept
Definition: serializableobjectlist.h:241
QSet< Uuid > getUuidSet() const noexcept
Definition: serializableobjectlist.h:207
bool contains(const T *obj) const noexcept
Definition: serializableobjectlist.h:244
Signal< SerializableObjectList< T, P, OnEditedArgs... >, int, const std::shared_ptr< const T > &, Event > onEdited
Definition: serializableobjectlist.h:133
~Iterator()
Definition: serializableobjectlist.h:119
std::shared_ptr< T > & first() noexcept
Definition: serializableobjectlist.h:273
void insertElement(int index, const std::shared_ptr< T > &obj) noexcept
Definition: serializableobjectlist.h:443
SerializableObjectList(const SExpression &node)
Definition: serializableobjectlist.h:184
bool isEmpty() const noexcept
Definition: serializableobjectlist.h:196
Iterator< typename QVector< std::shared_ptr< Polygon > >::const_iterator, const Polygon > const_iterator
Definition: serializableobjectlist.h:123
bool operator==(const SerializableObjectList< T, P, OnEditedArgs... > &rhs) const noexcept
Definition: serializableobjectlist.h:409
const QVector< std::shared_ptr< T > > & values() noexcept
Definition: serializableobjectlist.h:198
iterator begin() noexcept
Definition: serializableobjectlist.h:308
Iterator< typename QVector< std::shared_ptr< Polygon > >::iterator, Polygon > iterator
Definition: serializableobjectlist.h:121
void append(SerializableObjectList &list) noexcept
Definition: serializableobjectlist.h:339
Signal< SerializableObjectList< T, P, OnEditedArgs... >, int, const std::shared_ptr< const T > &, OnEditedArgs... > onElementEdited
Definition: serializableobjectlist.h:139
std::shared_ptr< const T > at(int index) const noexcept
Definition: serializableobjectlist.h:270
std::shared_ptr< const T > find(const Uuid &key) const noexcept
Definition: serializableobjectlist.h:259
void throwKeyNotFoundException(const Uuid &key) const
Definition: serializableobjectlist.h:463
int append(const std::shared_ptr< T > &obj) noexcept
Definition: serializableobjectlist.h:336
std::shared_ptr< const T > operator[](int i) const noexcept
Definition: serializableobjectlist.h:405
bool contains(const QString &name) const noexcept
Definition: serializableobjectlist.h:246
std::shared_ptr< T > take(int index) noexcept
Definition: serializableobjectlist.h:345
std::shared_ptr< const T > value(int index) const noexcept
Definition: serializableobjectlist.h:252
The RuntimeError class.
Definition: exceptions.h:216
std::shared_ptr< const T > find(const QString &name) const noexcept
Definition: serializableobjectlist.h:265
std::shared_ptr< T > copyObject(const T &other, std::false_type copyConstructable) noexcept
Definition: serializableobjectlist.h:488
void swap(int i, int j) noexcept
Definition: serializableobjectlist.h:319
int indexOf(const T *obj) const noexcept
Definition: serializableobjectlist.h:217
int insert(int index, const std::shared_ptr< T > &obj) noexcept
Definition: serializableobjectlist.h:330
void throwNameNotFoundException(const QString &name) const
Definition: serializableobjectlist.h:472
std::shared_ptr< T > find(const Uuid &key) noexcept
Definition: serializableobjectlist.h:256
SerializableObjectList(const SerializableObjectList< T, P, OnEditedArgs... > &other) noexcept
Definition: serializableobjectlist.h:152
Definition: serializableobjectlist.h:102
bool operator!=(const SerializableObjectList< T, P, OnEditedArgs... > &rhs) const noexcept
Definition: serializableobjectlist.h:417
std::shared_ptr< T > find(const QString &name) noexcept
Definition: serializableobjectlist.h:262
std::shared_ptr< T > take(const QString &name) noexcept
Definition: serializableobjectlist.h:353
std::shared_ptr< T > takeElement(int index) noexcept
Definition: serializableobjectlist.h:448
SerializableObjectList< T, P, OnEditedArgs... > & operator=(SerializableObjectList< T, P, OnEditedArgs... > &&rhs) noexcept
Definition: serializableobjectlist.h:431
The Signal class is used to emit signals on non-QObject derived classes.
Definition: signalslot.h:65
Iterator(const Iterator &other) noexcept
Definition: serializableobjectlist.h:107
const_iterator cbegin() noexcept
Definition: serializableobjectlist.h:306
Event
Definition: serializableobjectlist.h:126
O * operator->()
Definition: serializableobjectlist.h:115
virtual ~SerializableObjectList() noexcept
Definition: serializableobjectlist.h:193
std::shared_ptr< T > take(const Uuid &uuid) noexcept
Definition: serializableobjectlist.h:350
std::shared_ptr< T > take(const T *obj) noexcept
Definition: serializableobjectlist.h:349
int indexOf(const Uuid &key) const noexcept
Definition: serializableobjectlist.h:225
std::shared_ptr< T > find(const T *obj) noexcept
Definition: serializableobjectlist.h:255
The Uuid class is a replacement for QUuid to get UUID strings without {} braces.
Definition: uuid.h:56
const_iterator end() const noexcept
Definition: serializableobjectlist.h:305
QVector< std::shared_ptr< T > > mObjects
Definition: serializableobjectlist.h:495
bool contains(const Uuid &key) const noexcept
Definition: serializableobjectlist.h:245
Iterator & operator++()
Definition: serializableobjectlist.h:110
SerializableObjectList(std::initializer_list< std::shared_ptr< T >> elements) noexcept
Definition: serializableobjectlist.h:174
SerializableObjectList< T, P, OnEditedArgs... > sorted(Compare lessThan) const noexcept
Definition: serializableobjectlist.h:383
The Slot class is used to receive signals from non-QObject derived classes.
Definition: signalslot.h:36
The SExpression class.
Definition: sexpression.h:66
QString toStr() const noexcept
Get the UUID as a string (without braces)
Definition: uuid.h:86
SerializableObjectList() noexcept
Definition: serializableobjectlist.h:145
Slot< T, OnEditedArgs... > mOnEditedSlot
Definition: serializableobjectlist.h:496
std::shared_ptr< const T > last() const noexcept
Definition: serializableobjectlist.h:276
std::shared_ptr< const T > first() const noexcept
Definition: serializableobjectlist.h:274
const_iterator begin() const noexcept
Definition: serializableobjectlist.h:304