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++); }
44 [](
const OBJ &obj) {
return !obj.hasValidOrder(); });
53 if (!obj.hasValidOrder()) {
continue; }
54 orders.
append(obj.getOrder());
65 CONTAINER newContainer;
68 if (orders.
contains(obj.getOrder())) {
continue; }
69 newContainer.push_back(obj);
78 if (orders.
isEmpty()) {
return; }
80 CONTAINER newContainer;
83 if (orders.
contains(obj.getOrder())) {
continue; }
90 void moveTo(
const CONTAINER &items,
int targetOrder)
92 if (items.isEmpty()) {
return; }
94 CONTAINER newItems(items);
95 const int shift = items.size();
96 newContainer.sortAscendingByOrder();
97 newContainer.resetOrder();
98 for (OBJ &obj : newContainer)
100 if (obj.getOrder() < targetOrder) {
continue; }
101 obj.setOrder(obj.getOrder() + shift);
103 newItems.sortAscendingByOrder();
104 newItems.resetOrder(targetOrder);
105 newContainer.push_back(newItems);
113 for (OBJ &obj :
container()) { obj.setOrder(c++); }
120 for (OBJ &obj :
container()) { obj.setOrder(c--); }
126 if (
container().isEmpty()) {
return OBJ(); }
130 if (!obj.hasValidOrder()) {
continue; }
131 if (obj.getOrder() < min.getOrder()) { min = obj; }
139 if (
container().isEmpty()) {
return OBJ(); }
143 if (!obj.hasValidOrder()) {
continue; }
144 if (obj.getOrder() > max.getOrder()) { max = obj; }
154 const CONTAINER &
container()
const {
return static_cast<const CONTAINER &
>(*this); }
157 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.
void append(QList< T > &&value)
bool contains(const AT &value) const const
bool isEmpty() const const
void push_back(QList< T >::parameter_type value)