diff options
Diffstat (limited to 'src/qml/qml/ftw/qfieldlist_p.h')
-rw-r--r-- | src/qml/qml/ftw/qfieldlist_p.h | 171 |
1 files changed, 53 insertions, 118 deletions
diff --git a/src/qml/qml/ftw/qfieldlist_p.h b/src/qml/qml/ftw/qfieldlist_p.h index 2bf07fb20d..b4c6a55f1a 100644 --- a/src/qml/qml/ftw/qfieldlist_p.h +++ b/src/qml/qml/ftw/qfieldlist_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QFIELDLIST_P_H #define QFIELDLIST_P_H @@ -51,12 +15,12 @@ // We mean it. // -#include <QtCore/qglobal.h> +#include <QtCore/private/qglobal_p.h> +#include <QtCore/qtaggedpointer.h> -#include <private/qflagpointer_p.h> // QForwardFieldList is a super simple linked list that can only prepend -template<class N, N *N::*nextMember> +template<class N, N *N::*nextMember, typename Tag = QtPrivate::TagInfo<N>> class QForwardFieldList { public: @@ -65,6 +29,8 @@ public: inline N *takeFirst(); inline void prepend(N *); + template <typename OtherTag> + inline void copyAndClearPrepend(QForwardFieldList<N, nextMember, OtherTag> &); inline bool isEmpty() const; inline bool isOne() const; @@ -72,17 +38,10 @@ public: 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); + inline Tag tag() const; + inline void setTag(Tag t); private: - QFlagPointer<N> _first; + QTaggedPointer<N, Tag> _first; }; // QFieldList is a simple linked list, that can append and prepend and also @@ -108,8 +67,10 @@ public: inline void insertAfter(N *, QFieldList<N, nextMember> &); inline void copyAndClear(QFieldList<N, nextMember> &); - inline void copyAndClearAppend(QForwardFieldList<N, nextMember> &); - inline void copyAndClearPrepend(QForwardFieldList<N, nextMember> &); + template <typename Tag> + inline void copyAndClearAppend(QForwardFieldList<N, nextMember, Tag> &); + template <typename Tag> + inline void copyAndClearPrepend(QForwardFieldList<N, nextMember, Tag> &); static inline N *next(N *v); @@ -124,21 +85,21 @@ private: quint32 _count:31; }; -template<class N, N *N::*nextMember> -QForwardFieldList<N, nextMember>::QForwardFieldList() +template<class N, N *N::*nextMember, typename Tag> +QForwardFieldList<N, nextMember, Tag>::QForwardFieldList() { } -template<class N, N *N::*nextMember> -N *QForwardFieldList<N, nextMember>::first() const +template<class N, N *N::*nextMember, typename Tag> +N *QForwardFieldList<N, nextMember, Tag>::first() const { - return *_first; + return _first.data(); } -template<class N, N *N::*nextMember> -N *QForwardFieldList<N, nextMember>::takeFirst() +template<class N, N *N::*nextMember, typename Tag> +N *QForwardFieldList<N, nextMember, Tag>::takeFirst() { - N *value = *_first; + N *value = _first.data(); if (value) { _first = next(value); value->*nextMember = nullptr; @@ -146,85 +107,57 @@ N *QForwardFieldList<N, nextMember>::takeFirst() return value; } -template<class N, N *N::*nextMember> -void QForwardFieldList<N, nextMember>::prepend(N *v) +template<class N, N *N::*nextMember, typename Tag> +void QForwardFieldList<N, nextMember, Tag>::prepend(N *v) { Q_ASSERT(v->*nextMember == nullptr); - v->*nextMember = *_first; + v->*nextMember = _first.data(); _first = v; } -template<class N, N *N::*nextMember> -bool QForwardFieldList<N, nextMember>::isEmpty() const +template<class N, N *N::*nextMember, typename Tag> +template <typename OtherTag> +void QForwardFieldList<N, nextMember, Tag>::copyAndClearPrepend(QForwardFieldList<N, nextMember, OtherTag> &o) { - return _first.isNull(); -} - -template<class N, N *N::*nextMember> -bool QForwardFieldList<N, nextMember>::isOne() const -{ - return *_first && _first->*nextMember == 0; -} - -template<class N, N *N::*nextMember> -bool QForwardFieldList<N, nextMember>::isMany() const -{ - return *_first && _first->*nextMember != 0; -} - -template<class N, N *N::*nextMember> -N *QForwardFieldList<N, nextMember>::next(N *v) -{ - Q_ASSERT(v); - return v->*nextMember; -} - -template<class N, N *N::*nextMember> -bool QForwardFieldList<N, nextMember>::flag() const -{ - return _first.flag(); -} - -template<class N, N *N::*nextMember> -void QForwardFieldList<N, nextMember>::setFlag() -{ - _first.setFlag(); + _first = nullptr; + while (N *n = o.takeFirst()) prepend(n); } -template<class N, N *N::*nextMember> -void QForwardFieldList<N, nextMember>::clearFlag() +template<class N, N *N::*nextMember, typename Tag> +bool QForwardFieldList<N, nextMember, Tag>::isEmpty() const { - _first.clearFlag(); + return _first.isNull(); } -template<class N, N *N::*nextMember> -void QForwardFieldList<N, nextMember>::setFlagValue(bool v) +template<class N, N *N::*nextMember, typename Tag> +bool QForwardFieldList<N, nextMember, Tag>::isOne() const { - _first.setFlagValue(v); + return _first.data() && _first->*nextMember == 0; } -template<class N, N *N::*nextMember> -bool QForwardFieldList<N, nextMember>::flag2() const +template<class N, N *N::*nextMember, typename Tag> +bool QForwardFieldList<N, nextMember, Tag>::isMany() const { - return _first.flag2(); + return _first.data() && _first->*nextMember != 0; } -template<class N, N *N::*nextMember> -void QForwardFieldList<N, nextMember>::setFlag2() +template<class N, N *N::*nextMember, typename Tag> +N *QForwardFieldList<N, nextMember, Tag>::next(N *v) { - _first.setFlag2(); + Q_ASSERT(v); + return v->*nextMember; } -template<class N, N *N::*nextMember> -void QForwardFieldList<N, nextMember>::clearFlag2() +template<class N, N *N::*nextMember, typename Tag> +Tag QForwardFieldList<N, nextMember, Tag>::tag() const { - _first.clearFlag2(); + return _first.tag(); } -template<class N, N *N::*nextMember> -void QForwardFieldList<N, nextMember>::setFlag2Value(bool v) +template<class N, N *N::*nextMember, typename Tag> +void QForwardFieldList<N, nextMember, Tag>::setTag(Tag t) { - _first.setFlag2Value(v); + _first.setTag(t); } template<class N, N *N::*nextMember> @@ -380,7 +313,8 @@ void QFieldList<N, nextMember>::copyAndClear(QFieldList<N, nextMember> &o) } template<class N, N *N::*nextMember> -void QFieldList<N, nextMember>::copyAndClearAppend(QForwardFieldList<N, nextMember> &o) +template <typename Tag> +void QFieldList<N, nextMember>::copyAndClearAppend(QForwardFieldList<N, nextMember, Tag> &o) { _first = 0; _last = 0; @@ -389,7 +323,8 @@ void QFieldList<N, nextMember>::copyAndClearAppend(QForwardFieldList<N, nextMemb } template<class N, N *N::*nextMember> -void QFieldList<N, nextMember>::copyAndClearPrepend(QForwardFieldList<N, nextMember> &o) +template <typename Tag> +void QFieldList<N, nextMember>::copyAndClearPrepend(QForwardFieldList<N, nextMember, Tag> &o) { _first = nullptr; _last = nullptr; |