hxmaputils.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 _HLXMAPUTILS_H_
  36. #define _HLXMAPUTILS_H_
  37. #include "hxtypes.h"
  38. #include "hxassert.h"
  39. typedef void* POSITION;         // XXXSAB: where does this belong?
  40. #if defined(HELIX_CONFIG_LOW_HEAP_HASH_TABLE)
  41. // The default values to the hash class result in terrible heap consumption.
  42. // Using absolute minimal values here. Not much of a hash table now though!
  43. #define CHUNK_INIT 1
  44. #else
  45. #define CHUNK_INIT 16
  46. #endif
  47. #define DECLARE_ITEMVEC(CLASS,ITEM,NIL,CHUNK,INIT) 
  48.     class CLASS 
  49.     { 
  50.     public: 
  51.         CLASS(); 
  52.         CLASS(int num);
  53.         CLASS(int num, const ITEM& item); 
  54.         CLASS(const CLASS& from); 
  55.         CLASS& operator= (const CLASS& from); 
  56.         ~CLASS(); 
  57.  
  58.         inline ITEM& operator[] (int idx) 
  59.         { 
  60.             return m_items[idx]; 
  61.             /* return (idx >= 0 && idx < m_used ? m_items[idx] : nil()); */ 
  62.         } 
  63.  
  64.         inline const ITEM& operator[] (int idx) const 
  65.         { 
  66.             return m_items[idx]; 
  67.             /* return (idx >= 0 && idx < m_used ? m_items[idx] : nil()); */ 
  68.         } 
  69.  
  70.         inline bool empty () const { return m_used <= 0; } 
  71.         inline int size () const { return m_used; } 
  72.         inline void resize (int s) 
  73.         { 
  74.             resize(s, INIT); 
  75.         } 
  76.  
  77.         void resize (int s, const ITEM& item); 
  78.  
  79.         inline int capacity () const { return m_alloc; } 
  80.         void reserve (int s); 
  81.         inline void SetChunkSize (int chunk) { m_chunkSize = chunk; } 
  82.         void GrowBy (int by); 
  83.  
  84.         CLASS& push_back (const ITEM& item); 
  85.  
  86.         inline CLASS& pop_back () 
  87.         { 
  88.             HX_ASSERT (m_used > 0); 
  89.             if (m_used > 0) --m_used; 
  90.             return *this; 
  91.         } 
  92.  
  93.         inline ITEM& back() 
  94.         { 
  95.             HX_ASSERT (m_items); HX_ASSERT (m_used > 0); 
  96.             return m_items[m_used-1]; 
  97.         } 
  98.  
  99.         void zap (int idx, int numToZap = 1); 
  100.  
  101.     private: 
  102.         ITEM*       m_items; 
  103.         int         m_alloc; 
  104.         int         m_used; 
  105.         UINT16      m_chunkSize; 
  106.     }
  107. #define DECLARE_ITEMVEC_IMP(PARENT, CLASS,ITEM,NIL,CHUNK,INIT) 
  108.         PARENT::CLASS::CLASS() : 
  109.             m_items(0), m_alloc(0), m_used(0), m_chunkSize(CHUNK) 
  110.         { 
  111.         } 
  112.  
  113.         PARENT::CLASS::CLASS(int num) : 
  114.             m_items(0), m_alloc(0), m_used(0), m_chunkSize(CHUNK) 
  115.         { 
  116.             if (num > 0) 
  117.             { 
  118.                 m_items = new ITEM[num]; 
  119.                 m_used = m_alloc = num; 
  120.                 for (int i = 0; i < num; ++i) m_items[i] = INIT; 
  121.             } 
  122.         } 
  123.  
  124.         PARENT::CLASS::CLASS(int num, const ITEM& item) : 
  125.             m_items(0), m_alloc(0), m_used(0), m_chunkSize(CHUNK) 
  126.         { 
  127.             if (num > 0) 
  128.             { 
  129.                 m_items = new ITEM[num]; 
  130.                 m_used = m_alloc = num; 
  131.                 for (int i = 0; i < num; ++i) m_items[i] = item; 
  132.             } 
  133.         } 
  134.  
  135.         PARENT::CLASS::CLASS(const PARENT::CLASS& from) : 
  136.             m_items(0), m_alloc(0), m_used(0), m_chunkSize(CHUNK) 
  137.         { 
  138.             m_used = from.m_used; 
  139.             m_alloc = from.m_alloc; 
  140.             m_items = new ITEM[m_alloc]; 
  141.             for (int i = 0; i < m_used; ++i) m_items[i] = from.m_items[i]; 
  142.         } 
  143.  
  144.         PARENT::CLASS& PARENT::CLASS::operator= (const PARENT::CLASS& from) 
  145.         { 
  146.             if (m_items != from.m_items) 
  147.             { 
  148.                 HX_VECTOR_DELETE(m_items); 
  149.                 m_used = from.m_used; 
  150.                 m_alloc = from.m_alloc; 
  151.                 m_items = new ITEM[m_alloc]; 
  152.                 for (int i = 0; i < m_used; ++i) m_items[i] = from.m_items[i]; 
  153.             } 
  154.             return *this; 
  155.         } 
  156.  
  157.         PARENT::CLASS::~CLASS() { HX_VECTOR_DELETE(m_items); } 
  158.  
  159.  
  160.         void PARENT::CLASS::resize (int s, const ITEM& item) 
  161.         { 
  162.             reserve(s); 
  163.             for (int i = m_used; i < s; ++i) m_items[i] = item; 
  164.             m_used = s; 
  165.         } 
  166.  
  167.         void PARENT::CLASS::reserve (int s) 
  168.         { 
  169.             if (s > m_alloc) 
  170.             { 
  171.                 ITEM* newItems = new ITEM[s]; 
  172.                 if( newItems ){ 
  173.                 for (int i = 0; i < m_used; ++i) newItems[i] = m_items[i]; 
  174.                 HX_VECTOR_DELETE (m_items); 
  175.                 m_items = newItems; 
  176.                 m_alloc = s; 
  177.                 } 
  178.             } 
  179.         } 
  180.  
  181.         void PARENT::CLASS::GrowBy (int by) 
  182.         { 
  183.             /* If no chunkSize specified, 
  184.                use the larger of 16 and the currently allocated amount. 
  185.             */ 
  186.  
  187.             int chunk = m_chunkSize > 0 ? m_chunkSize : MAX (m_alloc, CHUNK_INIT); 
  188.             int newAlloc = m_alloc + ((by + chunk - 1) / chunk) * chunk; 
  189.             reserve (newAlloc); 
  190.         } 
  191.  
  192.         PARENT::CLASS& PARENT::CLASS::push_back (const ITEM& item) 
  193.         { 
  194.             if (m_used == m_alloc) GrowBy (1); 
  195.             HX_ASSERT (m_used < m_alloc); 
  196.             m_items[m_used++] = item; 
  197.             return *this; 
  198.         } 
  199.  
  200.         void PARENT::CLASS::zap (int idx, int numToZap) 
  201.         { 
  202.             HX_ASSERT (idx >= 0 && idx < m_used); 
  203.  
  204.             if ((idx + numToZap) >= m_used) 
  205.             { 
  206.                 m_used = idx; 
  207.             } 
  208.             else 
  209.             { 
  210.                 int src = idx + numToZap; 
  211.                 int dest = idx; 
  212.                 for (; src < m_used; ++src, ++dest) 
  213.                     m_items[dest] = m_items[src]; 
  214.                 m_used -= numToZap; 
  215.             } 
  216.         } 
  217. struct HlxMap
  218. {
  219.     DECLARE_ITEMVEC(IntVec_t, int, 0, 0, 0);
  220.     static ULONG32 StrHashFunc (const char* key, bool bCaseSens);
  221. };
  222. #endif // _HLXMAPUTILS_H_