31 enum { MinimumGroupCount = 3, MaximumGroupCount = 11 };
42 CacheFlag = 1 << Cache,
43 DefaultFlag = 1 << Default,
44 PersistedFlag = 1 << Persisted,
45 PrependFlag = 0x10000000,
46 AppendFlag = 0x20000000,
47 UnresolvedFlag = 0x40000000,
48 MovedFlag = 0x80000000,
49 GroupMask = ~(PrependFlag | AppendFlag | UnresolvedFlag | MovedFlag | CacheFlag)
55 Range() : next(
this), previous(
this) {}
56 Range(Range *next,
void *list,
int index,
int count, uint flags)
57 : next(next), previous(next->previous), list(list), index(index), count(count), flags(flags) {
58 next->previous =
this; previous->next =
this; }
67 inline int start()
const {
return index; }
68 inline int end()
const {
return index + count; }
70 inline int groups()
const {
return flags & GroupMask; }
72 inline bool inGroup()
const {
return flags & GroupMask; }
73 inline bool inCache()
const {
return flags & CacheFlag; }
74 inline bool inGroup(
int group)
const {
return flags & (1 << group); }
75 inline bool isUnresolved()
const {
return flags & UnresolvedFlag; }
77 inline bool prepend()
const {
return flags & PrependFlag; }
78 inline bool append()
const {
return flags & AppendFlag; }
81 class Q_AUTOTEST_EXPORT iterator
84 inline iterator() =
default;
85 inline iterator(Range *range,
int offset, Group group,
int groupCount);
87 bool operator ==(
const iterator &it)
const {
return range == it.range && offset == it.offset; }
88 bool operator !=(
const iterator &it)
const {
return range != it.range || offset != it.offset; }
90 bool operator ==(Group group)
const {
return range->flags & (1 << group); }
91 bool operator !=(Group group)
const {
return !(range->flags & (1 << group)); }
93 Range *&operator *() {
return range; }
94 Range *
const &operator *()
const {
return range; }
95 Range *operator ->() {
return range; }
96 const Range *operator ->()
const {
return range; }
98 iterator &operator +=(
int difference);
100 template<
typename T> T *list()
const {
return static_cast<T *>(range->list); }
101 int modelIndex()
const {
return range->index + offset; }
103 void incrementIndexes(
int difference) { incrementIndexes(difference, range->flags); }
104 void decrementIndexes(
int difference) { decrementIndexes(difference, range->flags); }
106 inline void incrementIndexes(
int difference, uint flags);
107 inline void decrementIndexes(
int difference, uint flags);
109 void setGroup(Group g) { group = g; groupFlag = 1 << g; }
111 Range *range =
nullptr;
113 Group group = Default;
116 int index[MaximumGroupCount] = { 0 };
118 int cacheIndex()
const {
122 void setCacheIndex(
int cacheIndex) {
123 index[Cache] = cacheIndex;
127 class Q_AUTOTEST_EXPORT insert_iterator :
public iterator
130 inline insert_iterator() {}
131 inline insert_iterator(
const iterator &it) : iterator(it) {}
132 inline insert_iterator(Range *,
int, Group,
int);
134 insert_iterator &operator +=(
int difference);
139 inline Change() =
default;
140 inline Change(
const iterator &it,
int count, uint flags,
int moveId = -1);
144 int index[MaximumGroupCount] = { 0 };
146 int cacheIndex()
const {
150 void setCacheIndex(
int cacheIndex) {
151 index[Cache] = cacheIndex;
154 inline bool isMove()
const {
return moveId >= 0; }
155 inline bool inCache()
const {
return flags & CacheFlag; }
156 inline bool inGroup()
const {
return flags & GroupMask; }
157 inline bool inGroup(
int group)
const {
return flags & (CacheFlag << group); }
159 inline int groups()
const {
return flags & GroupMask; }
162 struct Insert :
public Change
165 Insert(
const iterator &it,
int count, uint flags,
int moveId = -1)
166 : Change(it, count, flags, moveId) {}
169 struct Remove :
public Change
172 Remove(
const iterator &it,
int count, uint flags,
int moveId = -1)
173 : Change(it, count, flags, moveId) {}
176 QQmlListCompositor();
177 ~QQmlListCompositor();
179 int defaultGroups()
const {
return m_defaultFlags & ~PrependFlag; }
180 void setDefaultGroups(
int groups) { m_defaultFlags = groups | PrependFlag; }
181 void setDefaultGroup(Group group) { m_defaultFlags |= (1 << group); }
182 void clearDefaultGroup(Group group) { m_defaultFlags &= ~(1 << group); }
183 void setRemoveGroups(
int groups) { m_removeFlags = PrependFlag | AppendFlag | groups; }
184 void setGroupCount(
int count);
186 int count(Group group)
const;
187 iterator find(Group group,
int index);
188 iterator find(Group group,
int index)
const;
189 insert_iterator findInsertPosition(Group group,
int index);
191 const iterator &end() {
return m_end; }
193 void append(
void *list,
int index,
int count, uint flags, QVector<Insert> *inserts =
nullptr);
194 void insert(Group group,
int before,
void *list,
int index,
int count, uint flags, QVector<Insert> *inserts =
nullptr);
195 iterator insert(iterator before,
void *list,
int index,
int count, uint flags, QVector<Insert> *inserts =
nullptr);
197 void setFlags(Group fromGroup,
int from,
int count, Group group,
int flags, QVector<Insert> *inserts =
nullptr);
198 void setFlags(iterator from,
int count, Group group, uint flags, QVector<Insert> *inserts =
nullptr);
199 void setFlags(Group fromGroup,
int from,
int count, uint flags, QVector<Insert> *inserts =
nullptr) {
200 setFlags(fromGroup, from, count, fromGroup, flags, inserts); }
201 void setFlags(
const iterator from,
int count, uint flags, QVector<Insert> *inserts =
nullptr) {
202 setFlags(from, count, from.group, flags, inserts); }
204 void clearFlags(Group fromGroup,
int from,
int count, Group group, uint flags, QVector<Remove> *removals =
nullptr);
205 void clearFlags(iterator from,
int count, Group group, uint flags, QVector<Remove> *removals =
nullptr);
206 void clearFlags(Group fromGroup,
int from,
int count, uint flags, QVector<Remove> *removals =
nullptr) {
207 clearFlags(fromGroup, from, count, fromGroup, flags, removals); }
208 void clearFlags(
const iterator &from,
int count, uint flags, QVector<Remove> *removals =
nullptr) {
209 clearFlags(from, count, from.group, flags, removals); }
211 bool verifyMoveTo(Group fromGroup,
int from, Group toGroup,
int to,
int count, Group group)
const;
220 QVector<Remove> *removals =
nullptr,
221 QVector<Insert> *inserts =
nullptr);
224 void listItemsInserted(
void *list,
int index,
int count, QVector<Insert> *inserts);
225 void listItemsRemoved(
void *list,
int index,
int count, QVector<Remove> *removals);
226 void listItemsMoved(
void *list,
int from,
int to,
int count, QVector<Remove> *removals, QVector<Insert> *inserts);
227 void listItemsChanged(
void *list,
int index,
int count, QVector<Change> *changes);
232 QVector<QQmlChangeSet::Change> *removes,
233 QVector<QQmlChangeSet::Change> *inserts);
244 inline Range *insert(Range *before,
void *list,
int index,
int count, uint flags);
245 inline Range *erase(Range *range);
250 MovedFlags(
int moveId, uint flags) : moveId(moveId), flags(flags) {}
256 void listItemsRemoved(
257 QVector<Remove> *translatedRemovals,
259 QVector<QQmlChangeSet::Change> *removals,
260 QVector<QQmlChangeSet::Change> *insertions =
nullptr,
261 QVector<MovedFlags> *movedFlags =
nullptr);
262 void listItemsInserted(
263 QVector<Insert> *translatedInsertions,
265 const QVector<QQmlChangeSet::Change> &insertions,
266 const QVector<MovedFlags> *movedFlags =
nullptr);
267 void listItemsChanged(
268 QVector<Change> *translatedChanges,
270 const QVector<QQmlChangeSet::Change> &changes);
272 friend Q_AUTOTEST_EXPORT QDebug operator <<(QDebug debug,
const QQmlListCompositor &list);