hxasvect.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:16k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxasvect.h,v 1.1.1.1.50.3 2004/07/09 01:45:51 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. /////////////////////////////////////////////////////////////////////////////
  50. // HXASVECT.H
  51. //
  52. // Class definitions for:
  53. //
  54. //        CHXAssocVectPtrToPtr
  55. //        CHXAssocVectStringToOb
  56. //        CHXAssocVectStringToString
  57. //
  58. //
  59. // The CHXAssocVectPtrToPtr - this is map class for associating "pointers" to 
  60. // "pointers". 
  61. //
  62. // The CHXAssocVectStringToOb - this is map class for associating "strings" to 
  63. // "pointers".
  64. //
  65. // The CHXAssocVectStringToString - this is map class for associating "strings" to 
  66. // "strings".
  67. //
  68. // All implementations use AssocVector imported from the public lib Loki 
  69. // written by Andrei Alexandrescu.
  70. ////////////////////
  71. #ifndef HXASVECT_H_
  72. #define HXASVECT_H_
  73. #include "hxcppflags.h"
  74. #include "hxcom.h"
  75. #ifdef HX_CPP_BASIC_TEMPLATES
  76. #include "hxtypes.h"
  77. #include "hxstring.h"
  78. #include "assocvector.h"
  79. #ifndef NDEBUG
  80. #define DEBUG_CODE(code) code
  81. #define DEBUG_COMMA ,
  82. #else
  83. #define DEBUG_CODE(code)
  84. #define DEBUG_COMMA
  85. #endif
  86. typedef void* POSITION;
  87. namespace AssocVectorHelpers
  88. {
  89. #ifndef NDEBUG
  90.     const UINT32
  91.         LengthBits = CHAR_BIT * (sizeof(POSITION) - 1),
  92.         KeepLengthMask = (1u << LengthBits) - 1;
  93.     inline UINT32 GetOffset(POSITION pos)
  94.     {
  95.         return (reinterpret_cast<UINT32>(pos) & KeepLengthMask) - 1;
  96.     }
  97.     inline unsigned char GetSerialNumber(POSITION pos)
  98.     {
  99.         UINT32& val = *reinterpret_cast<UINT32*>(&pos);
  100.         return static_cast<unsigned char>(val >> LengthBits);
  101.     }
  102.     inline void EmbedSerialNumber(POSITION& pos, unsigned char serial)
  103.     {
  104.         UINT32& val = *reinterpret_cast<UINT32*>(&pos);
  105.         HX_ASSERT((val & KeepLengthMask) == val);
  106. // HX_ASSERT(((serial << LengthBits) >> LengthBits) == serial);
  107.         HX_ASSERT(((val | (serial << LengthBits)) & KeepLengthMask) == val);
  108.         val |= serial << LengthBits;
  109.     }
  110. #else
  111.     inline UINT32 GetOffset(POSITION pos)
  112.     {
  113.         return reinterpret_cast<UINT32>(pos);
  114.     }
  115. #endif
  116.     inline POSITION MakePosition(UINT32 offset)
  117.     {
  118.         ++offset;
  119.         HX_ASSERT((offset & KeepLengthMask) == offset);
  120.         return reinterpret_cast<POSITION>(offset);
  121.     }
  122. }
  123. //////////////////////////////////////////////////////////////////////////////
  124. //
  125. //        CHXGenericAssocVect
  126. //
  127. //////////////////////////////////////////////////////////////////////////////
  128. template <class Key, class Value, class Compare = std::less<Key> >
  129. class CHXGenericAssocVect
  130. {
  131.     typedef Loki::AssocVector<Key, Value, Compare> Data;
  132. public:
  133.     class Iterator
  134.     {
  135.     public:
  136.         friend class CHXGenericAssocVect<Key, Value, Compare>;
  137.         Iterator() : value_(0)
  138.         {
  139.             DEBUG_CODE(pCont_ = 0; serial_ = 0;)
  140.         }
  141.         
  142.         Iterator& operator++()
  143.         {
  144.             HX_ASSERT(serial_ == pCont_->m_Serial);
  145.             ++value_;
  146.             return *this;
  147.         }
  148.         
  149.         Iterator& operator--()
  150.         {
  151.             HX_ASSERT(serial_ == pCont_->m_Serial);
  152.             --value_;
  153.             return *this;
  154.         }
  155.         
  156.         void operator+=( int i )
  157.         {
  158.             HX_ASSERT(serial_ == pCont_->m_Serial);
  159.             value_ += i;
  160.         }
  161.         
  162.         void operator-=( int i )
  163.         {
  164.             HX_ASSERT(serial_ == pCont_->m_Serial);
  165.             value_ -= i;
  166.         }
  167.         
  168.         BOOL operator==(const Iterator& rhs) const
  169.         {
  170.             HX_ASSERT(pCont_ == rhs.pCont_);
  171.             HX_ASSERT(serial_ == rhs.serial_);
  172.             return value_ == rhs.value_;
  173.         }
  174.         
  175.         BOOL operator!=(const Iterator& rhs) const
  176.         {
  177.             return !(*this == rhs);
  178.         }
  179.         
  180.         Value& operator*()
  181.         {
  182.             HX_ASSERT(serial_ == pCont_->m_Serial);
  183.             return value_->second;
  184.         }
  185.         
  186.         Key& get_key()
  187.         {
  188.             HX_ASSERT(serial_ == pCont_->m_Serial);
  189.             return value_->first;
  190.         }
  191.         const Key& get_key() const
  192.         {
  193.             HX_ASSERT(serial_ == pCont_->m_Serial);
  194.             return value_->first;
  195.         }
  196.     protected:
  197.         Iterator(CHXGenericAssocVect* pCont, POSITION pos)
  198.             : value_(pCont->m_Data.begin() + AssocVectorHelpers::GetOffset(pos))
  199.         {
  200.             DEBUG_CODE(pCont_ = pCont; serial_ = pCont->m_Serial;)
  201.             HX_ASSERT(serial_ == AssocVectorHelpers::GetSerialNumber(pos));
  202.         }
  203.         
  204.         Iterator(Data::iterator it DEBUG_CODE(DEBUG_COMMA CHXGenericAssocVect* pCont))
  205.             : value_(it)
  206.         {
  207.             DEBUG_CODE(pCont_ = pCont; serial_ = pCont->m_Serial;)
  208.         }
  209.         // Member variables
  210.         Data::iterator value_;
  211.         DEBUG_CODE(CHXGenericAssocVect* pCont_; unsigned char serial_;)
  212.     };
  213.     friend class Iterator;
  214. // Construction
  215.     CHXGenericAssocVect(const Compare& comp = Compare()) : m_Data(comp)
  216.     {
  217.         DEBUG_CODE(m_Serial = rand() >> (CHAR_BIT * (sizeof(short int) - 1));)
  218.     }
  219. // Attributes
  220.     // number of elements
  221.     int GetCount() const
  222.     {
  223.         return m_Data.size();
  224.     }
  225.     
  226.     BOOL IsEmpty() const
  227.     {
  228.         return m_Data.empty();
  229.     }
  230.     // Lookup
  231.     BOOL Lookup(const Key& key, Value& rValue) const
  232.     {
  233.         Data::const_iterator i = m_Data.find(key);
  234.         if (i == m_Data.end()) return FALSE;
  235.         rValue = i->second;
  236.         return TRUE;
  237.     }
  238.     
  239.     POSITION Lookup(const Key& key) const
  240.     {
  241.         Data::const_iterator i = m_Data.find(key);
  242.         if (i == m_Data.end()) return 0;
  243.         POSITION result = AssocVectorHelpers::MakePosition(i - m_Data.begin());
  244.         DEBUG_CODE(AssocVectorHelpers::EmbedSerialNumber(
  245.             result, m_Serial);)
  246.         return result;
  247.     }
  248. // Operations
  249.     // Lookup and add if not there
  250.     Value& operator[](const Key& key)
  251.     {
  252.         return m_Data[key];
  253.     }
  254.     // add a new (key, value) pair
  255.     POSITION SetAt(const Key& key, const Value& newValue)
  256.     {
  257.         std::pair<Data::iterator, bool> insResult = 
  258.             m_Data.insert(Data::value_type(key, newValue));
  259.         if (!insResult.second)
  260.         {
  261.             insResult.first->second = newValue;
  262.         }
  263.         else
  264.         {
  265.             DEBUG_CODE(++m_Serial;)
  266.         }
  267.         using namespace AssocVectorHelpers;
  268.         POSITION result = MakePosition(insResult.first - m_Data.begin());
  269.         DEBUG_CODE(EmbedSerialNumber(result, m_Serial);)
  270.         return result;
  271.     }
  272.     // removing existing (key, ?) pair
  273.     Iterator Erase(Iterator it)
  274.     {
  275.         DEBUG_CODE(++m_Serial;)
  276.         const UINT32 offset = it.value_ - m_Data.begin();
  277.         m_Data.erase(it.value_);
  278.         return Iterator(m_Data.begin() + offset DEBUG_CODE(DEBUG_COMMA this));
  279.     }
  280.     
  281.     POSITION Remove(const Key& key)
  282.     {
  283.         DEBUG_CODE(++m_Serial;)
  284.         const UINT32 offset = m_Data.find(key) - m_Data.begin();
  285.         m_Data.erase(m_Data.begin() + offset);
  286.         using namespace AssocVectorHelpers;
  287.         POSITION result = MakePosition(offset);
  288.         DEBUG_CODE(EmbedSerialNumber(result, m_Serial);)
  289.         return result;
  290.     }
  291.     
  292.     BOOL RemoveKey(const Key& key)
  293.     {
  294.         DEBUG_CODE(++m_Serial;)
  295.         UINT32 oldSize = m_Data.size();
  296.         m_Data.erase(key);
  297.         return oldSize != m_Data.size();
  298.     }
  299.     
  300.     void RemoveAll()
  301.     {
  302.         DEBUG_CODE(++m_Serial;)
  303.         m_Data.clear();
  304.     }
  305.     // iterating all (key, value) pairs
  306.     POSITION GetStartPosition() const
  307.     {
  308.         if (m_Data.empty()) return 0;
  309.         POSITION result = AssocVectorHelpers::MakePosition(0);
  310.         HX_ASSERT(result != 0);
  311.         DEBUG_CODE(AssocVectorHelpers::EmbedSerialNumber(result, m_Serial));
  312.         HX_ASSERT(result != 0);
  313.     
  314.         return result;
  315.     }
  316.     
  317.     void GetNextAssoc(POSITION& rNextPosition, Key& rKey, Value& rValue) const
  318.     {
  319.         using namespace AssocVectorHelpers;
  320.         
  321.         DEBUG_CODE(const unsigned char serial = GetSerialNumber(rNextPosition);)
  322.         HX_ASSERT(serial == m_Serial);
  323.         UINT32 offset = GetOffset(rNextPosition);
  324.         HX_ASSERT(offset < m_Data.size());
  325.         const Data::value_type& val = m_Data.begin()[offset];
  326.         rKey = val.first;
  327.         rValue = val.second;
  328.         if (++offset < m_Data.size())
  329.         {
  330.             rNextPosition = MakePosition(offset);
  331.             DEBUG_CODE(EmbedSerialNumber(rNextPosition, serial));
  332.         }
  333.         else
  334.         {
  335.             rNextPosition = 0;
  336.         }
  337.     }
  338.     
  339.     Iterator Begin()
  340.     {
  341.         return Iterator(m_Data.begin() DEBUG_CODE(DEBUG_COMMA this));
  342.     }
  343.     
  344.     Iterator End()
  345.     {
  346.         return Iterator(m_Data.end() DEBUG_CODE(DEBUG_COMMA this));
  347.     }
  348.     void Swap(CHXGenericAssocVect& rhs)
  349.     {
  350.         m_Data.swap(rhs.m_Data);
  351.         DEBUG_CODE(std::swap(m_Serial, rhs.m_Serial));
  352.     }
  353. // Implementation
  354. protected:
  355.     Data m_Data;
  356.     DEBUG_CODE(unsigned char m_Serial;)
  357. public:
  358.     ~CHXGenericAssocVect()
  359.     {
  360.     }
  361. };
  362. //////////////////////////////////////////////////////////////////////////////
  363. //
  364. //        CHXAssocVectStringToOb
  365. //
  366. //////////////////////////////////////////////////////////////////////////////
  367. struct StringCompare : public std::binary_function<CHXString, CHXString, bool>
  368. {
  369.     char m_PreserveCase;
  370.         
  371.     explicit StringCompare(char PreserveCase = TRUE) : m_PreserveCase(PreserveCase) 
  372.     {
  373.     }
  374.     bool operator()(const CHXString& p1, const CHXString& p2) const
  375.     {
  376.         return (m_PreserveCase ? strcmp(p1, p2) : strcmpi(p1, p2)) < 0;
  377.     }
  378. };
  379.     
  380. class CHXAssocVectStringToOb 
  381.     : public CHXGenericAssocVect<CHXString, void*, StringCompare>
  382. {
  383.     typedef CHXGenericAssocVect<CHXString, void*, StringCompare> Base;
  384. public:
  385.     CHXAssocVectStringToOb(const StringCompare& comp = StringCompare())
  386.         : Base(comp)
  387.     {
  388.     }
  389.     
  390.     void SetCaseSensitive(BOOL b)
  391.     {
  392.         if (!b != !m_Data.key_comp().m_PreserveCase)
  393.         {
  394.             CHXAssocVectStringToOb(StringCompare(char(!!b))).Swap(*this);
  395.         }
  396.     }
  397.     void GetNextAssoc(POSITION& rNextPosition, CHXString& rKey, void*& rValue) const
  398.     {
  399. Base::GetNextAssoc(rNextPosition, rKey, rValue);
  400.     }
  401.     // JE 12/11/01 - added a method which takes const char*& for key so that the
  402.     // key returned points to memory owned by the map (in the case of small CHXStrings)
  403.     // rather than being owned by the small string buffer of the CHXString& in the 
  404.     // above method
  405.     void GetNextAssoc(POSITION& rNextPosition, const char*& rKey, void*& rValue) const
  406.     {
  407.         using namespace AssocVectorHelpers;
  408.         
  409.         DEBUG_CODE(const unsigned char serial = GetSerialNumber(rNextPosition);)
  410.     HX_ASSERT(serial == m_Serial);
  411.         UINT32 offset = GetOffset(rNextPosition);
  412.         HX_ASSERT(offset < m_Data.size());
  413.         const Data::value_type& val = m_Data.begin()[offset];
  414.         rKey = val.first;
  415.         rValue = val.second;
  416.         if (++offset < m_Data.size())
  417.         {
  418.             rNextPosition = MakePosition(offset);
  419.             DEBUG_CODE(EmbedSerialNumber(rNextPosition, serial));
  420.         }
  421.         else
  422.         {
  423.             rNextPosition = 0;
  424.         }
  425.     }
  426. };
  427. /////////////////////////////////////////////////////////////////////////////
  428. class HXEXPORT_CLASS CHXAssocVectPtrToPtr 
  429.     : public CHXGenericAssocVect<void*, void*>
  430. {
  431. };
  432. ////////////////////////////////////////////////////////////////////////////
  433. class CHXAssocVectStringToString
  434.     : public CHXGenericAssocVect<CHXString, CHXString>
  435. {
  436. };
  437. ////////////////////////////////////////////////////////////////////////////
  438. class HXEXPORT_CLASS CHXAssocVectLongToObj
  439.     : public CHXGenericAssocVect<LONG32, void*>
  440. {
  441. };
  442. ////////////////////////////////////////////////////////////////////////////
  443. class HXEXPORT_CLASS CHXAssocVectGUIDToObj
  444.     : public CHXGenericAssocVect<GUID, void*>
  445. {
  446.     typedef CHXGenericAssocVect<GUID, void*> Base;
  447. public:
  448.     void GetNextAssoc(POSITION& rNextPosition, GUID*& rpKey, void*& rValue) const
  449.     {
  450.         using namespace AssocVectorHelpers;
  451.         
  452.         DEBUG_CODE(const unsigned char serial = GetSerialNumber(rNextPosition);)
  453.         HX_ASSERT(serial == m_Serial);
  454.         const UINT32 offset = GetOffset(rNextPosition);
  455.         HX_ASSERT(offset < m_Data.size());
  456.         const Data::value_type& val = m_Data.begin()[offset];
  457.         rpKey = const_cast<GUID*>(&val.first);
  458.         rValue = val.second;
  459.         rNextPosition = MakePosition(offset + 1);
  460.         DEBUG_CODE(EmbedSerialNumber(rNextPosition, serial));
  461.     }
  462.     typedef Base::Iterator BaseIterator;
  463.     class Iterator : public BaseIterator
  464.     {
  465.     public:
  466.         Iterator(CHXAssocVectGUIDToObj* pCont, POSITION pos)
  467.             : BaseIterator(pCont, pos)
  468.         {
  469.         }
  470.         
  471.         Iterator(Data::iterator it DEBUG_CODE(DEBUG_COMMA CHXAssocVectGUIDToObj* pCont))
  472.             : BaseIterator(it DEBUG_CODE(DEBUG_COMMA pCont))
  473.         {
  474.         }
  475. Iterator(const BaseIterator& iter)
  476.             : BaseIterator(iter)
  477.         {
  478.         }
  479.         GUID* get_key()
  480.         {
  481.             return &value_->first;
  482.         }
  483.     };
  484. };
  485. ////////////////////////////////////////////////////////////////////////////
  486. #else // HX_CPP_BASIC_TEMPLATES
  487. #include "hxmap.h"
  488. #include "hxguidmap.h"
  489. typedef CHXMapStringToString CHXAssocVectStringToString;
  490. typedef CHXMapStringToOb CHXAssocVectStringToOb;
  491. typedef CHXMapGUIDToObj CHXAssocVectGUIDToObj;
  492. typedef CHXMapLongToObj CHXAssocVectLongToObj;
  493. typedef CHXMapPtrToPtr CHXAssocVectPtrToPtr;
  494. #endif // HX_CPP_BASIC_TEMPLATES
  495. #endif // HXASVECT_H_