/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtQml module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 3 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL3 included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 3 requirements ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 2.0 or (at your option) the GNU General ** Public license version 3 or any later version approved by the KDE Free ** Qt Foundation. The licenses are as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-2.0.html and ** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QFIELDLIST_P_H #define QFIELDLIST_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include // QForwardFieldList is a super simple linked list that can only prepend template class QForwardFieldList { public: inline QForwardFieldList(); inline N *first() const; inline N *takeFirst(); inline void prepend(N *); inline bool isEmpty() const; inline bool isOne() const; inline bool isMany() const; static inline N *next(N *v); inline bool flag() const; inline void setFlag(); inline void clearFlag(); inline void setFlagValue(bool); inline bool flag2() const; inline void setFlag2(); inline void clearFlag2(); inline void setFlag2Value(bool); private: QFlagPointer _first; }; // QFieldList is a simple linked list, that can append and prepend and also // maintains a count template class QFieldList { public: inline QFieldList(); inline N *first() const; inline N *takeFirst(); inline void append(N *); inline void prepend(N *); inline bool isEmpty() const; inline bool isOne() const; inline bool isMany() const; inline int count() const; inline void append(QFieldList &); inline void prepend(QFieldList &); inline void insertAfter(N *, QFieldList &); inline void copyAndClear(QFieldList &); inline void copyAndClearAppend(QForwardFieldList &); inline void copyAndClearPrepend(QForwardFieldList &); static inline N *next(N *v); inline bool flag() const; inline void setFlag(); inline void clearFlag(); inline void setFlagValue(bool); private: N *_first; N *_last; quint32 _flag:1; quint32 _count:31; }; template QForwardFieldList::QForwardFieldList() { } template N *QForwardFieldList::first() const { return *_first; } template N *QForwardFieldList::takeFirst() { N *value = *_first; if (value) { _first = next(value); value->*nextMember = 0; } return value; } template void QForwardFieldList::prepend(N *v) { Q_ASSERT(v->*nextMember == 0); v->*nextMember = *_first; _first = v; } template bool QForwardFieldList::isEmpty() const { return _first.isNull(); } template bool QForwardFieldList::isOne() const { return *_first && _first->*nextMember == 0; } template bool QForwardFieldList::isMany() const { return *_first && _first->*nextMember != 0; } template N *QForwardFieldList::next(N *v) { Q_ASSERT(v); return v->*nextMember; } template bool QForwardFieldList::flag() const { return _first.flag(); } template void QForwardFieldList::setFlag() { _first.setFlag(); } template void QForwardFieldList::clearFlag() { _first.clearFlag(); } template void QForwardFieldList::setFlagValue(bool v) { _first.setFlagValue(v); } template bool QForwardFieldList::flag2() const { return _first.flag2(); } template void QForwardFieldList::setFlag2() { _first.setFlag2(); } template void QForwardFieldList::clearFlag2() { _first.clearFlag2(); } template void QForwardFieldList::setFlag2Value(bool v) { _first.setFlag2Value(v); } template QFieldList::QFieldList() : _first(0), _last(0), _flag(0), _count(0) { } template N *QFieldList::first() const { return _first; } template N *QFieldList::takeFirst() { N *value = _first; if (value) { _first = next(value); if (_last == value) { Q_ASSERT(_first == 0); _last = 0; } value->*nextMember = 0; --_count; } return value; } template void QFieldList::append(N *v) { Q_ASSERT(v->*nextMember == 0); if (isEmpty()) { _first = v; _last = v; } else { _last->*nextMember = v; _last = v; } ++_count; } template void QFieldList::prepend(N *v) { Q_ASSERT(v->*nextMember == 0); if (isEmpty()) { _first = v; _last = v; } else { v->*nextMember = _first; _first = v; } ++_count; } template bool QFieldList::isEmpty() const { return _count == 0; } template bool QFieldList::isOne() const { return _count == 1; } template bool QFieldList::isMany() const { return _count > 1; } template int QFieldList::count() const { return _count; } template N *QFieldList::next(N *v) { Q_ASSERT(v); return v->*nextMember; } template void QFieldList::append(QFieldList &o) { if (!o.isEmpty()) { if (isEmpty()) { _first = o._first; _last = o._last; _count = o._count; } else { _last->*nextMember = o._first; _last = o._last; _count += o._count; } o._first = o._last = 0; o._count = 0; } } template void QFieldList::prepend(QFieldList &o) { if (!o.isEmpty()) { if (isEmpty()) { _first = o._first; _last = o._last; _count = o._count; } else { o._last->*nextMember = _first; _first = o._first; _count += o._count; } o._first = o._last = 0; o._count = 0; } } template void QFieldList::insertAfter(N *after, QFieldList &o) { if (after == 0) { prepend(o); } else if (after == _last) { append(o); } else if (!o.isEmpty()) { if (isEmpty()) { _first = o._first; _last = o._last; _count = o._count; } else { o._last->*nextMember = after->*nextMember; after->*nextMember = o._first; _count += o._count; } o._first = o._last = 0; o._count = 0; } } template void QFieldList::copyAndClear(QFieldList &o) { _first = o._first; _last = o._last; _count = o._count; o._first = o._last = 0; o._count = 0; } template void QFieldList::copyAndClearAppend(QForwardFieldList &o) { _first = 0; _last = 0; _count = 0; while (N *n = o.takeFirst()) append(n); } template void QFieldList::copyAndClearPrepend(QForwardFieldList &o) { _first = 0; _last = 0; _count = 0; while (N *n = o.takeFirst()) prepend(n); } template bool QFieldList::flag() const { return _flag; } template void QFieldList::setFlag() { _flag = true; } template void QFieldList::clearFlag() { _flag = false; } template void QFieldList::setFlagValue(bool v) { _flag = v; } #endif // QFIELDLIST_P_H