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) {
202 std::vector<Uuid> uuids;
204 foreach (
const std::shared_ptr<T>& obj,
mObjects) {
205 uuids.push_back(obj->getUuid());
212 foreach (
const std::shared_ptr<T>& obj,
mObjects) {
213 uuids.insert(obj->getUuid());
220 for (
int i = 0; i <
count(); ++i) {
228 for (
int i = 0; i <
count(); ++i) {
229 if (
mObjects[i]->getUuid() == key) {
236 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept {
237 for (
int i = 0; i <
count(); ++i) {
238 if (QString::compare(
asStr(
mObjects[i]->getName()), name, cs) == 0) {
245 return index >= 0 && index <
mObjects.count();
249 bool contains(
const QString& name)
const noexcept {
254 std::shared_ptr<T>
value(
int index) noexcept {
return mObjects.value(index); }
255 std::shared_ptr<const T>
value(
int index)
const noexcept {
256 return std::const_pointer_cast<
const T>(
mObjects.value(index));
259 std::shared_ptr<T>
find(
const Uuid& key) noexcept {
262 std::shared_ptr<const T>
find(
const Uuid& key)
const noexcept {
265 std::shared_ptr<T>
find(
const QString& name,
266 Qt::CaseSensitivity cs = Qt::CaseSensitive) noexcept {
271 Qt::CaseSensitivity cs = Qt::CaseSensitive)
const noexcept {
276 std::shared_ptr<const T>
at(
int index)
const noexcept {
277 return std::const_pointer_cast<
const T>(
mObjects.at(index));
280 std::shared_ptr<const T>
first() const noexcept {
return mObjects.first(); }
282 std::shared_ptr<const T>
last() const noexcept {
return mObjects.last(); }
283 std::shared_ptr<T>
get(
const T* obj) {
284 std::shared_ptr<T>
ptr =
find(obj);
285 if (!ptr)
throw LogicError(__FILE__, __LINE__);
288 std::shared_ptr<T>
get(
const Uuid& key) {
289 std::shared_ptr<T>
ptr =
find(key);
293 std::shared_ptr<const T>
get(
const Uuid& key)
const {
294 std::shared_ptr<const T>
ptr =
find(key);
298 std::shared_ptr<T>
get(
const QString& name) {
299 std::shared_ptr<T>
ptr =
find(name);
303 std::shared_ptr<const T>
get(
const QString& name)
const {
304 std::shared_ptr<const T>
ptr =
find(name);
321 append(std::make_shared<T>(*child));
325 void swap(
int i,
int j) noexcept {
327 qBound(0, i,
count() - 1);
328 qBound(0, j,
count() - 1);
330 if (i > j) qSwap(i, j);
331 std::shared_ptr<T> oj =
take(j);
332 std::shared_ptr<T> oi =
take(i);
336 int insert(
int index,
const std::shared_ptr<T>& obj) noexcept {
338 qBound(0, index,
count());
342 int append(
const std::shared_ptr<T>& obj) noexcept {
347 foreach (
const std::shared_ptr<T>&
ptr, list.mObjects) {
351 std::shared_ptr<T>
take(
int index) noexcept {
356 std::shared_ptr<T>
take(
const Uuid& uuid) noexcept {
359 std::shared_ptr<T>
take(
const QString& name) noexcept {
362 void remove(
int index) noexcept {
take(index); }
363 void remove(
const T* obj) noexcept {
take(obj); }
364 void remove(
const Uuid& uuid) noexcept {
take(uuid); }
365 void remove(
const QString& name) noexcept {
take(name); }
368 for (
int i =
count() - 1; i >= 0; --i) {
380 foreach (
const std::shared_ptr<T>&
ptr,
mObjects) {
388 template <
typename Compare>
390 Compare lessThan)
const noexcept {
393 std::sort(copiedList.mObjects.begin(), copiedList.mObjects.end(),
394 [&lessThan](
const std::shared_ptr<T>& ptr1,
395 const std::shared_ptr<T>& ptr2) {
396 return lessThan(*ptr1, *ptr2);
401 return sorted([](
const T& lhs,
const T& rhs) {
402 return lhs.getUuid() < rhs.getUuid();
417 if (rhs.mObjects.count() !=
mObjects.count())
return false;
418 for (
int i = 0; i <
mObjects.count(); ++i) {
419 if (*rhs.mObjects[i] != *
mObjects[i])
return false;
425 return !(*
this == rhs);
431 foreach (
const std::shared_ptr<T>&
ptr, rhs.mObjects) {
433 *ptr,
typename std::is_nothrow_copy_constructible<T>::type()));
441 foreach (
const std::shared_ptr<T>&
ptr, rhs.mObjects) {
455 std::shared_ptr<T> obj =
mObjects.takeAt(index);
466 qCritical() <<
"Received notification from unknown list element!";
474 "no element of type \"%1\" with the UUID \"%2\" in the list."))
483 "no element of type \"%1\" with the name \"%2\" in the list."))
490 std::true_type copyConstructable) noexcept {
491 Q_UNUSED(copyConstructable);
492 return std::make_shared<T>(other);
495 std::false_type copyConstructable) noexcept {
496 Q_UNUSED(copyConstructable);
497 return other.cloneShared();
499 template <
typename TStr>
500 inline const QString&
asStr(
const TStr& obj)
const noexcept {
503 inline const QString&
asStr(
const QString& obj)
const noexcept {
return obj; }
518 #if (QT_VERSION > QT_VERSION_CHECK(5, 9, 0)) 519 namespace QtPrivate {
522 template <
typename T,
typename P,
typename... OnEditedArgs>
523 class QForeachContainer<
526 ~QForeachContainer() =
delete;
528 template <
typename T,
typename P,
typename... OnEditedArgs>
529 class QForeachContainer<
532 ~QForeachContainer() =
delete;
535 #if (QT_VERSION > QT_VERSION_CHECK(5, 9, 0)) I it
Definition: serializableobjectlist.h:103
const_iterator cend() noexcept
Definition: serializableobjectlist.h:313
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:281
SerializableObjectList< T, P, OnEditedArgs... > sortedByUuid() const noexcept
Definition: serializableobjectlist.h:400
std::shared_ptr< T > value(int index) noexcept
Definition: serializableobjectlist.h:254
void clear() noexcept
Definition: serializableobjectlist.h:366
int loadFromSExpression(const SExpression &node)
Definition: serializableobjectlist.h:318
std::shared_ptr< T > copyObject(const T &other, std::true_type copyConstructable) noexcept
Definition: serializableobjectlist.h:489
void ensureLineBreak()
Definition: sexpression.cpp:206
std::vector< Uuid > getUuids() const noexcept
Definition: serializableobjectlist.h:201
std::shared_ptr< T > operator[](int i) noexcept
Definition: serializableobjectlist.h:407
iterator end() noexcept
Definition: serializableobjectlist.h:315
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition: serializableobjectlist.h:379
Definition: occmodel.cpp:77
Iterator(const I &it) noexcept
Definition: serializableobjectlist.h:108
std::shared_ptr< T > find(const QString &name, Qt::CaseSensitivity cs=Qt::CaseSensitive) noexcept
Definition: serializableobjectlist.h:265
The SerializableObjectList class implements a list of serializable objects.
Definition: serializableobjectlist.h:96
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:199
void elementEditedHandler(const T &obj, OnEditedArgs... args) noexcept
Definition: serializableobjectlist.h:460
SerializableObjectList< T, P, OnEditedArgs... > & operator=(const SerializableObjectList< T, P, OnEditedArgs... > &rhs) noexcept
Definition: serializableobjectlist.h:427
SExpression & appendList(const QString &name)
Definition: sexpression.cpp:212
bool contains(int index) const noexcept
Definition: serializableobjectlist.h:244
QSet< Uuid > getUuidSet() const noexcept
Definition: serializableobjectlist.h:209
bool contains(const T *obj) const noexcept
Definition: serializableobjectlist.h:247
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:279
void insertElement(int index, const std::shared_ptr< T > &obj) noexcept
Definition: serializableobjectlist.h:449
SerializableObjectList(const SExpression &node)
Definition: serializableobjectlist.h:186
std::shared_ptr< const T > find(const QString &name, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition: serializableobjectlist.h:269
bool isEmpty() const noexcept
Definition: serializableobjectlist.h:198
const QString & asStr(const QString &obj) const noexcept
Definition: serializableobjectlist.h:503
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:415
const QVector< std::shared_ptr< T > > & values() noexcept
Definition: serializableobjectlist.h:200
iterator begin() noexcept
Definition: serializableobjectlist.h:314
Iterator< typename QVector< std::shared_ptr< Polygon > >::iterator, Polygon > iterator
Definition: serializableobjectlist.h:121
int indexOf(const QString &name, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition: serializableobjectlist.h:235
void append(SerializableObjectList &list) noexcept
Definition: serializableobjectlist.h:345
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:276
std::shared_ptr< const T > find(const Uuid &key) const noexcept
Definition: serializableobjectlist.h:262
void throwKeyNotFoundException(const Uuid &key) const
Definition: serializableobjectlist.h:469
const QString & asStr(const TStr &obj) const noexcept
Definition: serializableobjectlist.h:500
int append(const std::shared_ptr< T > &obj) noexcept
Definition: serializableobjectlist.h:342
std::shared_ptr< const T > operator[](int i) const noexcept
Definition: serializableobjectlist.h:411
bool contains(const QString &name) const noexcept
Definition: serializableobjectlist.h:249
std::shared_ptr< T > take(int index) noexcept
Definition: serializableobjectlist.h:351
std::shared_ptr< const T > value(int index) const noexcept
Definition: serializableobjectlist.h:255
The RuntimeError class.
Definition: exceptions.h:216
std::shared_ptr< T > copyObject(const T &other, std::false_type copyConstructable) noexcept
Definition: serializableobjectlist.h:494
void swap(int i, int j) noexcept
Definition: serializableobjectlist.h:325
int indexOf(const T *obj) const noexcept
Definition: serializableobjectlist.h:219
int insert(int index, const std::shared_ptr< T > &obj) noexcept
Definition: serializableobjectlist.h:336
void throwNameNotFoundException(const QString &name) const
Definition: serializableobjectlist.h:478
std::shared_ptr< T > find(const Uuid &key) noexcept
Definition: serializableobjectlist.h:259
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:423
std::shared_ptr< T > take(const QString &name) noexcept
Definition: serializableobjectlist.h:359
std::shared_ptr< T > takeElement(int index) noexcept
Definition: serializableobjectlist.h:454
SerializableObjectList< T, P, OnEditedArgs... > & operator=(SerializableObjectList< T, P, OnEditedArgs... > &&rhs) noexcept
Definition: serializableobjectlist.h:437
The Signal class is used to emit signals on non-QObject derived classes.
Definition: signalslot.h:65
QList< SExpression * > getChildren(Type type) noexcept
Definition: sexpression.cpp:94
Iterator(const Iterator &other) noexcept
Definition: serializableobjectlist.h:107
const_iterator cbegin() noexcept
Definition: serializableobjectlist.h:312
Event
Definition: serializableobjectlist.h:126
O * operator->()
Definition: serializableobjectlist.h:115
virtual ~SerializableObjectList() noexcept
Definition: serializableobjectlist.h:195
std::shared_ptr< T > take(const Uuid &uuid) noexcept
Definition: serializableobjectlist.h:356
std::shared_ptr< T > take(const T *obj) noexcept
Definition: serializableobjectlist.h:355
int indexOf(const Uuid &key) const noexcept
Definition: serializableobjectlist.h:227
std::shared_ptr< T > find(const T *obj) noexcept
Definition: serializableobjectlist.h:258
The Uuid class is a replacement for QUuid to get UUID strings without {} braces.
Definition: uuid.h:58
const_iterator end() const noexcept
Definition: serializableobjectlist.h:311
QVector< std::shared_ptr< T > > mObjects
Definition: serializableobjectlist.h:506
bool contains(const Uuid &key) const noexcept
Definition: serializableobjectlist.h:248
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:389
The Slot class is used to receive signals from non-QObject derived classes.
Definition: signalslot.h:36
The SExpression class.
Definition: sexpression.h:69
QString toStr() const noexcept
Get the UUID as a string (without braces)
Definition: uuid.h:88
SerializableObjectList() noexcept
Definition: serializableobjectlist.h:145
Slot< T, OnEditedArgs... > mOnEditedSlot
Definition: serializableobjectlist.h:507
std::shared_ptr< const T > last() const noexcept
Definition: serializableobjectlist.h:282
std::shared_ptr< const T > first() const noexcept
Definition: serializableobjectlist.h:280
const_iterator begin() const noexcept
Definition: serializableobjectlist.h:310