diff options
Diffstat (limited to 'src/declarative/qml/v8/qscripttools_p.h')
-rw-r--r-- | src/declarative/qml/v8/qscripttools_p.h | 182 |
1 files changed, 17 insertions, 165 deletions
diff --git a/src/declarative/qml/v8/qscripttools_p.h b/src/declarative/qml/v8/qscripttools_p.h index f74fbab83f..c8dace0b9f 100644 --- a/src/declarative/qml/v8/qscripttools_p.h +++ b/src/declarative/qml/v8/qscripttools_p.h @@ -36,180 +36,32 @@ #ifndef QSCRIPTTOOLS_P_H #define QSCRIPTTOOLS_P_H -#include <qdebug.h> +#include <private/qintrusivelist_p.h> QT_BEGIN_NAMESPACE -template<class T> -class QScriptBagContainer; - -/*! - \internal - \interface - Helper class for a container. The purpuse of it is to add two pointer properties to a class - inheriting this class without bloating an interface. - - This class exist only as a memory storage implementation. The only way to use it is to inherit it. -*/ -class QScriptLinkedNode +template<class N, QIntrusiveListNode N::*member> +class QScriptIntrusiveList : public QIntrusiveList<N, member> { -protected: - QScriptLinkedNode() - : m_next(0) - , m_prev(0) - {} - - ~QScriptLinkedNode() - { - Q_ASSERT_X(!isUsed(), Q_FUNC_INFO, "Destorying QScriptLinkedNode instance that still is in a container"); - } - -private: - bool isUsed() const - { - return m_next || m_prev; - } - -#if defined(Q_NO_TEMPLATE_FRIENDS) public: -#else - template<class T> - friend class QScriptBagContainer; -#endif - QScriptLinkedNode *m_next; - QScriptLinkedNode *m_prev; + inline void insert(N *n); + inline void remove(N *n); }; -/*! - \internal - The QScriptBagContainer is a simple, low level, set like container for a pointer type castable to - QScriptLinkedNode*. - Algorithms complexity: - put: O(1) - get: O(1) - forEach: O(n) - \note This container doesn't take ownership of pointed values. - \attention All values have to be unique. -*/ -template<class T> -class QScriptBagContainer +template<class N, QIntrusiveListNode N::*member> +void QScriptIntrusiveList<N, member>::insert(N *n) { -public: - QScriptBagContainer() - : m_first(0) - {} - - /*! - \internal - Add a this \a value to this container - */ - void insert(T* value) - { - //dump(Q_FUNC_INFO, value); - Q_ASSERT_X(!contains(value), Q_FUNC_INFO, "Can't insert a value which is in the bag already"); - QScriptLinkedNode* v = static_cast<QScriptLinkedNode*>(value); - Q_ASSERT(v); - Q_ASSERT_X(!v->m_next && !v->m_prev, Q_FUNC_INFO, "Can't insert a value which is in an another bag"); - - if (m_first) - m_first->m_prev = v; - - v->m_next = m_first; - v->m_prev = 0; - m_first = v; - } - - /*! - \internal - Remove this \a value from this container - */ - void remove(T* value) - { - //dump(Q_FUNC_INFO, value); - QScriptLinkedNode* v = static_cast<QScriptLinkedNode*>(value); - Q_ASSERT(v); + Q_ASSERT_X(!contains(n), Q_FUNC_INFO, "Can't insert a value which is in the list already"); + Q_ASSERT_X(!(n->*member).isInList(), Q_FUNC_INFO, "Can't insert a value which is in another list"); + QIntrusiveList<N, member>::insert(n); +} - if (!v->m_next && !v->m_prev && m_first != v) { - // ignore that value as it is not registered at all - // FIXME: That may be optimized out if unregister call is removed from ~QtDataBase - return; - } - - Q_ASSERT_X(contains(value), Q_FUNC_INFO, "Can't remove a value which is not in the bag"); - Q_ASSERT(v->m_prev || (m_first == v && !v->m_prev)); - - if (v->m_next) - v->m_next->m_prev= v->m_prev; - - if (v->m_prev) - v->m_prev->m_next = v->m_next; - else - m_first = v->m_next; - // reset removed value - v->m_next = v->m_prev = 0; - } - - /*! - \internal - Call \a fun for each element in this container. Fun should accept T* as a parameter. - \note In general it is not allowed to change this container by calling put() or get() unless - given value is the same as currently procceded by forEach. - */ - template<class Functor> - void forEach(Functor fun) - { - //dump(Q_FUNC_INFO); - QScriptLinkedNode *i = m_first; - QScriptLinkedNode *tmp; - while (i) { - tmp = i; - i = i->m_next; - fun(static_cast<T*>(tmp)); - } - } - - /*! - \internal - Clear this container. - */ - void clear() - { - m_first = 0; - } - - /*! - \internal - Returns true if this container is empty; false otherwise. - */ - bool isEmpty() const - { - return !m_first; - } - -// void dump(const char* msg, T* obj = 0) const -// { -// qDebug() << msg << obj; -// qDebug() << m_first; -// QScriptLinkedNode *i = m_first; -// while (i) { -// qDebug() <<" - " << i << "(" << i->m_prev << ", " << i->m_next <<")"; -// i = i->m_next; -// } -// } - -private: - bool contains(T *value) const - { - QScriptLinkedNode *i = m_first; - while (i) { - if (static_cast<T*>(i) == value) - return true; - i = i->m_next; - } - return false; - } - QScriptLinkedNode *m_first; -}; +template<class N, QIntrusiveListNode N::*member> +void QScriptIntrusiveList<N, member>::remove(N *n) +{ + Q_ASSERT_X(contains(n), Q_FUNC_INFO, "Can't remove a value which is not in the list"); + QIntrusiveList<N, member>::remove(n); +} QT_END_NAMESPACE |