6 #ifndef SWIFT_MISC_ORDERABLELIST_H
7 #define SWIFT_MISC_ORDERABLELIST_H
17 template <
class OBJ,
class CONTAINER>
20 static_assert(std::is_base_of_v<IOrderable, OBJ>,
"OBJ needs to implement IOrderable");
37 for (OBJ &obj :
container()) { obj.setOrder(c++); }
45 if (!obj.hasValidOrder()) {
return true; }
56 if (!obj.hasValidOrder()) {
continue; }
57 orders.append(obj.getOrder());
65 const QList<int> orders = items.orderValues();
66 if (orders.isEmpty()) {
return this->
container(); }
68 CONTAINER newContainer;
71 if (orders.contains(obj.getOrder())) {
continue; }
72 newContainer.push_back(obj);
80 const QList<int> orders = items.orderValues();
81 if (orders.isEmpty()) {
return; }
83 CONTAINER newContainer;
86 if (orders.contains(obj.getOrder())) {
continue; }
87 newContainer.push_back(obj);
93 void moveTo(
const CONTAINER &items,
int targetOrder)
95 if (items.isEmpty()) {
return; }
97 CONTAINER newItems(items);
98 const int shift = items.size();
99 newContainer.sortAscendingByOrder();
100 newContainer.resetOrder();
101 for (OBJ &obj : newContainer)
103 if (obj.getOrder() < targetOrder) {
continue; }
104 obj.setOrder(obj.getOrder() + shift);
106 newItems.sortAscendingByOrder();
107 newItems.resetOrder(targetOrder);
108 newContainer.push_back(newItems);
116 for (OBJ &obj :
container()) { obj.setOrder(c++); }
123 for (OBJ &obj :
container()) { obj.setOrder(c--); }
129 if (
container().isEmpty()) {
return OBJ(); }
133 if (!obj.hasValidOrder()) {
continue; }
134 if (obj.getOrder() < min.getOrder()) { min = obj; }
142 if (
container().isEmpty()) {
return OBJ(); }
146 if (!obj.hasValidOrder()) {
continue; }
147 if (obj.getOrder() > max.getOrder()) { max = obj; }
157 const CONTAINER &
container()
const {
return static_cast<const CONTAINER &
>(*this); }
160 CONTAINER &
container() {
return static_cast<CONTAINER &
>(*this); }
List of orderable IOrderable objects.
void freezeOrderReverse()
Current reverse order of list will be new order values.
void removeItemsWithSameOrder(const CONTAINER &items)
Remove the items based on their order IOrderable::order.
IOrderableList()=default
Constructor.
void sortAscendingByOrder()
Sort ascending.
void sortDescendingByOrder()
Sort descending.
CONTAINER & container()
Container.
void moveTo(const CONTAINER &items, int targetOrder)
Move items to given order.
QList< int > orderValues() const
All order values IOrderable::order.
OBJ maxOrderOrDefault() const
Object with max.order or default.
OBJ minOrderOrDefault() const
Object with min.order or default.
const CONTAINER & container() const
Container.
CONTAINER withoutItemsOfSameOrder(const CONTAINER &items) const
Items with order will not be included.
void resetOrder(int offset=0)
Set order member to current order.
void freezeOrder()
Current order of list will be new order values.
bool needsOrder() const
All order values set or missing some?
auto MemberLess(Ts... vs)
Predicate which compares the return values of some member functions of two objects.
Free functions in swift::misc.
T::const_iterator begin(const LockFreeReader< T > &reader)
Non-member begin() and end() for so LockFree containers can be used in ranged for loops.
T::const_iterator end(const LockFreeReader< T > &reader)
Non-member begin() and end() for so LockFree containers can be used in ranged for loops.