glist.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:8k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef _GLIST_H
  36. #define _GLIST_H
  37. #include "hxtypes.h"
  38. class GListIterator;
  39. class GList;
  40. class GListNode
  41. {
  42.     friend class GListIterator;
  43.     friend class GList;
  44. private:
  45.     void      *m_pElement;
  46.     GListNode *m_pNext;
  47.     GListNode *m_pPrev;
  48.     GListNode(void *pElement = 0L, GListNode *pNext = 0L, GListNode *pPrev = 0L)
  49.     {
  50.         m_pElement = pElement;
  51.         m_pNext    = pNext;
  52.         m_pPrev    = pPrev;
  53.     };
  54.     ~GListNode() {};
  55.     void      *GetElement() { return m_pElement; }
  56.     GListNode *GetNext()    { return m_pNext;    }
  57.     GListNode *GetPrev()    { return m_pPrev;    }
  58.     void       SetElement(void *pElement) { m_pElement = pElement; }
  59.     void       SetNext(GListNode *pNext)  { m_pNext    = pNext;    }
  60.     void       SetPrev(GListNode *pPrev)  { m_pPrev    = pPrev;    }
  61. };
  62. class GListIterator
  63. {
  64.     friend class GList;
  65. protected:
  66.     GListNode *m_pNode;
  67.     GListIterator(GListNode * const pNode) : m_pNode(pNode) {};
  68. public:
  69.     GListIterator() {};
  70.     GListIterator(const GListIterator & rIterator) : m_pNode(rIterator.m_pNode) {};
  71.     ~GListIterator() {};
  72.     GListIterator & operator = (const GListIterator & rIterator )
  73.     {
  74.         m_pNode = rIterator.m_pNode;
  75.         return *this;
  76.     };
  77.     BOOL operator == (const GListIterator & rIterator) const
  78.     {
  79.         return (m_pNode == rIterator.m_pNode ? TRUE : FALSE);
  80.     };
  81.     BOOL operator != (const GListIterator & rIterator) const
  82.     {
  83.         return (m_pNode != rIterator.m_pNode ? TRUE : FALSE);
  84.     };
  85.     GListIterator & operator ++ ()
  86.     {
  87.         m_pNode = m_pNode->m_pNext;
  88.         return *this;
  89.     }
  90.     GListIterator operator ++ (int)
  91.     {
  92.         GListIterator cIterator = *this;
  93.         ++*this;
  94.         return cIterator;
  95.     };
  96.     GListIterator & operator -- ()
  97.     {
  98.         m_pNode = m_pNode->m_pPrev;
  99.         return *this;
  100.     };
  101.     GListIterator operator -- (int)
  102.     {
  103.         GListIterator cIterator = *this;
  104.         --*this;
  105.         return cIterator;
  106.     };
  107.     GListIterator operator + (int n) const
  108.     {
  109.         GListIterator cIterator = *this;
  110.         if (n > 0)
  111.         {
  112.             while (n--)
  113.             {
  114.                 ++cIterator;
  115.             }
  116.         }
  117.         else
  118.         {
  119.             while (n++)
  120.             {
  121.                 --cIterator;
  122.             }
  123.         }
  124.         return cIterator;
  125.     };
  126.     GListIterator operator += (int n)
  127.     {
  128.         return *this = *this + n;
  129.     };
  130.     GListIterator operator - (int n) const
  131.     {
  132.         GListIterator cIterator = *this;
  133.         if (n > 0)
  134.         {
  135.             while (n--)
  136.             {
  137.                 --cIterator;
  138.             }
  139.         }
  140.         else
  141.         {
  142.             while (n++)
  143.             {
  144.                 ++cIterator;
  145.             }
  146.         }
  147.         return cIterator;
  148.     };
  149.     GListIterator operator -= (int n)
  150.     {
  151.         return *this = *this - n;
  152.     };
  153.     void * operator * () const           { return m_pNode->m_pElement; };
  154.     void * operator [] (int index) const { return *(*this + index); };
  155. };
  156. class GList
  157. {
  158. protected:
  159.     GListNode m_cHead;
  160.     ULONG32   m_ulSize;
  161. public:
  162.     GList() : m_cHead(), m_ulSize(0)
  163.     {
  164.         m_cHead.SetNext(&m_cHead);
  165.         m_cHead.SetPrev(&m_cHead);
  166.     };
  167.    ~GList()
  168.    {
  169.        Erase(Begin(), End());
  170.    }
  171.     BOOL    Empty()   { return (m_ulSize ? FALSE : TRUE); }
  172.     ULONG32 Size()    { return m_ulSize; }
  173. ULONG32 GetCount(){ return m_ulSize; }
  174.     GListIterator Begin() { return GListIterator(m_cHead.m_pNext); }
  175.     GListIterator End()   { return GListIterator(&m_cHead); }
  176.     void * First()                 { return *Begin(); }
  177.     void * Last()                  { return *(--End()); }
  178.     void * operator [] (int index) { return *(Begin() + index); }
  179.     BOOL operator == (GList & rList)
  180.     {
  181.         if (m_ulSize != rList.m_ulSize)
  182.         {
  183.             return FALSE;
  184.         }
  185.         GListIterator start1 = Begin();
  186.         GListIterator end1   = End();
  187.         GListIterator start2 = rList.Begin();
  188.         while (start1 != end1)
  189.         {
  190.             if (*start1++ != *start2++)
  191.             {
  192.                 return FALSE;
  193.             }
  194.         }
  195.         return TRUE;
  196.     }
  197.     BOOL operator != (GList & rList)
  198.     {
  199.         return (*this == rList ? FALSE : TRUE);
  200.     }
  201.     GListIterator Insert(GListIterator cPos, void *pElement)
  202.     {
  203.         GListNode *pNode               = new GListNode(pElement);
  204.         pNode->m_pNext                 = cPos.m_pNode;
  205.         pNode->m_pPrev                 = cPos.m_pNode->m_pPrev;
  206.         cPos.m_pNode->m_pPrev->m_pNext = pNode;
  207.         cPos.m_pNode->m_pPrev          = pNode;
  208.         m_ulSize++;
  209.         return GListIterator(pNode);
  210.     }
  211.     GListIterator PushFront(void *pElement)
  212.     {
  213.         return Insert(Begin(), pElement);
  214.     }
  215.     GListIterator PushBack(void *pElement)
  216.     {
  217.         return Insert(End(), pElement);
  218.     }
  219.     void Erase(GListIterator cPos)
  220.     {
  221.         if (cPos == End())
  222.         {
  223.             return;
  224.         }
  225.         cPos.m_pNode->m_pPrev->m_pNext = cPos.m_pNode->m_pNext;
  226.         cPos.m_pNode->m_pNext->m_pPrev = cPos.m_pNode->m_pPrev;
  227.         delete cPos.m_pNode;
  228.         --m_ulSize;
  229.         return;
  230.     }
  231.     void Erase(GListIterator cStart, GListIterator cEnd)
  232.     {
  233.         while (cStart != cEnd && cStart != End())
  234.         {
  235.             Erase(cStart++);
  236.         }
  237.         return;
  238.     }
  239.     void PopFront()
  240.     {
  241.         Erase(Begin());
  242.     }
  243.     void PopBack()
  244.     {
  245.         Erase(--End());
  246.     }
  247.     void EraseAll()
  248.     {
  249.         Erase(Begin(), End());
  250.     }
  251.     void ResetAll()
  252.     {
  253.         GListNode *pCurrent = m_cHead.m_pNext;
  254.         GListNode *pNext    = pCurrent->m_pNext;
  255.         while (pCurrent != pNext)
  256.         {
  257.             pCurrent->m_pPrev->m_pNext = pCurrent->m_pNext;
  258.             pCurrent->m_pNext->m_pPrev = pCurrent->m_pPrev;
  259.             delete pCurrent;
  260.             --m_ulSize;
  261.         }
  262.         m_cHead.m_pNext = m_cHead.m_pPrev = &m_cHead;
  263.     }
  264.     void Remove(void *pElement)
  265.     {
  266.         GListIterator cStart = Begin();
  267.         GListIterator cEnd   = End();
  268.         while (cStart != cEnd)
  269.         {
  270.             GListIterator cNext = cStart;
  271.             ++cNext;
  272.             if (*cStart == pElement)
  273.             {
  274.                 Erase(cStart);
  275.             }
  276.             cStart = cNext;
  277.         }
  278. #if 0
  279.         GListIterator itr;
  280.         while (Size() > 0)
  281.         {
  282.             itr = Begin();
  283.             if (*itr == pElement)
  284.             {
  285.                 Erase(itr);
  286.             }
  287.         }
  288. #endif
  289.     }
  290. };
  291. #endif