src/hbservers/hbthemeserver/hbdoublelinkedlistinline_p.h
changeset 0 16d8024aca5e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbservers/hbthemeserver/hbdoublelinkedlistinline_p.h	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,262 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (developer.feedback@nokia.com)
+**
+** This file is part of the HbServers module of the UI Extensions for Mobile.
+**
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at developer.feedback@nokia.com.
+**
+****************************************************************************/
+
+#ifndef HBDOUBLELINKEDLIST_INLINE_P_H
+#define HBDOUBLELINKEDLIST_INLINE_P_H
+
+/*!
+    @hbserver
+    \class HbDLink
+    \brief HbDLink implements a linkage linkage in a doubly-linked list
+
+*/
+
+template<class ElemType> inline
+HbDLink<ElemType>::HbDLink()
+        : mNext(0), mPrev(0)
+{
+}
+
+template<class ElemType> inline
+ElemType*
+HbDLink<ElemType>::next() const
+{
+    return mNext;
+}
+
+template<class ElemType> inline
+ElemType*
+HbDLink<ElemType>::prev() const
+{
+    return mPrev;
+}
+
+template<class ElemType> inline
+void
+HbDLink<ElemType>::setNext(ElemType *element)
+{
+    mNext = element;
+}
+
+template<class ElemType> inline
+void
+HbDLink<ElemType>::setPrev(ElemType *element)
+{
+    mPrev = element;
+}
+
+/*!
+    @hbserver
+    \class HbDLinkList
+    \brief HbDLinkList implements a generic doubly link list of ElemType.
+
+    HbDlinkList class use for List Recently Used policy implementation.
+*/
+
+
+/*!
+    \fn HbDLinkList::HbDLinkList()
+    Constructor
+    Constructs a HbDLinkList obect
+    \a dLink ia a pointer to HbDLink member of ElemType to use for this list.
+ */
+template<class ElemType> inline
+HbDLinkList<ElemType>::HbDLinkList(HbDLink<ElemType> ElemType:: *dLink)
+        : listFront(0), listBack(0), mDLink(dLink)
+{
+
+}
+
+/*!
+    \fn HbDLinkList::~HbDLinkList()
+    Destructor
+
+ */
+template<class ElemType> inline
+HbDLinkList<ElemType>::~HbDLinkList()
+{
+    // remove links before remove.
+    if ((listFront != 0) || (listBack != 0)) {
+        removeAll();
+    }
+}
+
+/*!
+    \fn HbDLinkList::insertBack()
+    insert a node after the last node
+    \a newItem denotes the item to be inserted after the last node
+ */
+template<class ElemType> inline
+void
+HbDLinkList<ElemType>::insertBack(ElemType* newItem)
+{
+    if (newItem == 0) {
+        return;
+    }
+    if (listBack == 0) {
+        insertFrontIfListEmpty(newItem);
+    } else {
+        insertAfter(newItem, listBack);
+    }
+}
+
+/*!
+    \fn HbDLinkList::removeFront()
+    remove the front node
+ */
+template<class ElemType> inline
+ElemType*
+HbDLinkList<ElemType>::removeFront()
+{
+    ElemType* itemToRemove = listFront;
+    if (itemToRemove != 0) {
+        removeNode(itemToRemove);
+    } else {
+        return 0;
+    }
+    return itemToRemove;
+}
+
+/*!
+    \fn HbDLinkList::removeNode()
+    remove a particular node
+    /a itemToRemove denotesthe cache item to be removed from the list
+ */
+template<class ElemType> inline
+void
+HbDLinkList<ElemType>::removeNode(ElemType* itemToRemove)
+{
+    if (!itemToRemove) {
+        return;
+    }
+
+    if (itemToRemove == listFront) {
+        listFront = (listFront->*mDLink).next();
+        if (listFront) {
+            (listFront->*mDLink).mPrev = 0;
+        } else {
+            listBack = 0;
+        }
+    } else if (itemToRemove == listBack) {
+        listBack = (listBack->*mDLink).prev();
+        if (listBack) {
+            (listBack->*mDLink).mNext = 0;
+        }
+    } else {
+        ((itemToRemove->*mDLink).prev()->*mDLink).mNext = (itemToRemove->*mDLink).next();
+        ((itemToRemove->*mDLink).next()->*mDLink).mPrev = (itemToRemove->*mDLink).prev();
+    }
+    (itemToRemove->*mDLink).mNext = 0;
+    (itemToRemove->*mDLink).mPrev = 0;
+}
+
+/*!
+    \fn HbDLinkList::removeAll()
+    remove all the items in the list.
+ */
+template<class ElemType> inline
+void
+HbDLinkList<ElemType>::removeAll()
+{
+    while (listFront) {
+        removeFront();
+    }
+}
+
+/*!
+    \fn HbDLinkList::isEmpty()
+    Check if list is empty
+ */
+template<class ElemType> inline
+bool
+HbDLinkList<ElemType>::isEmpty() const
+{
+    if (listFront != 0)
+        return false;
+    else
+        return true;
+}
+
+/*!
+    \fn HbDLinkList::front()
+    Return the node at the front of list
+ */
+template<class ElemType> inline
+ElemType*
+HbDLinkList<ElemType>:: front() const
+{
+    return listFront;
+}
+
+/*!
+    \fn HbDLinkList::front()
+    Return the last node in the list
+ */
+template<class ElemType> inline
+ElemType*
+HbDLinkList<ElemType>:: back() const
+{
+    return listBack;
+}
+
+/*!
+    \fn HbDLinkList::insertFrontIfListEmpty()
+    This is a private function. We are only interested in inserting at the back of list.
+    However, when a list is empty both front and back point to the same item.
+    \a newItem denotes the cache item to be inserted at the front of the list
+ */
+template<class ElemType> inline
+void
+HbDLinkList<ElemType>::insertFrontIfListEmpty(ElemType* newItem)
+{
+    if (listFront == 0) {
+        listFront = newItem;
+        listBack = newItem;
+    }
+}
+
+/*!
+    \fn HbDLinkList::insertAfter()
+    insert a node after a given node
+    \a newItem denotes the new cache item to be inserted
+    \a lastItem denotes the cache item after which the new item is to be inserted
+ */
+template<class ElemType> inline
+void
+HbDLinkList<ElemType>::insertAfter(ElemType *newItem, ElemType *lastItem)
+{
+    (newItem->*mDLink).mNext = (lastItem->*mDLink).next() ;
+    (newItem->*mDLink).mPrev = lastItem;
+
+    if ((lastItem->*mDLink).next() == 0) {
+        listBack = newItem;
+    } else {
+        ((lastItem->*mDLink).mNext->*mDLink).mPrev = newItem;
+    }
+    (lastItem->*mDLink).mNext = newItem;
+}
+
+#endif
+