0000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0040: 2f 2f 2f 2f 2f 2f 0d 0a 2f 2f 20 69 73 74 72 6d //////..// istrm
0050: 61 70 2e 68 3a 20 69 6e 74 65 72 66 61 63 65 20 ap.h: interface
0060: 66 6f 72 20 74 68 65 20 43 49 53 74 72 69 6e 67 for the CIString
0070: 4d 61 70 20 63 6c 61 73 73 2e 0d 0a 2f 2f 20 20 Map class...//
0080: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 66 interf
0090: 61 63 65 20 66 6f 72 20 74 68 65 20 43 43 6f 6c ace for the CCol
00a0: 6c 65 63 74 69 6f 6e 20 63 6c 61 73 73 2e 0d 0a lection class...
00b0: 2f 2f 20 57 72 69 74 74 65 6e 20 62 79 20 44 6d // Written by Dm
00c0: 69 74 72 69 79 20 4f 73 68 63 68 65 70 6b 6f 76 itriy Oshchepkov
00d0: 20 61 6b 61 20 44 6d 69 74 72 4f 2c 20 6d 61 69 aka DmitrO, mai
00e0: 6c 74 6f 3a 20 64 6d 69 74 72 6f 40 65 7a 6d 61 lto: dmitro@ezma
00f0: 69 6c 2e 72 75 0d 0a 2f 2f 20 56 65 72 73 69 6f il.ru..// Versio
0100: 6e 3a 20 32 2e 33 20 28 64 79 6e 61 6d 69 63 20 n: 2.3 (dynamic
0110: 68 61 73 68 20 74 61 62 6c 65 20 72 65 76 69 73 hash table revis
0120: 69 6f 6e 3b 20 68 61 73 68 20 26 20 63 6f 6d 70 ion; hash & comp
0130: 61 72 65 20 66 75 6e 63 74 69 6f 6e 20 6f 70 74 are function opt
0140: 69 6d 69 7a 61 74 69 6f 6e 73 20 62 79 20 6b 6d imizations by km
0150: 73 2b 2b 29 0d 0a 2f 2f 0d 0a 2f 2f 20 43 49 53 s++)..//..// CIS
0160: 74 72 69 6e 67 4d 61 70 3a 20 69 6d 70 6c 65 6d tringMap: implem
0170: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 61 entation of an a
0180: 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 ssociative array
0190: 20 77 69 74 68 20 61 20 6b 65 79 20 61 73 20 63 with a key as c
01a0: 61 73 65 20 69 6e 73 65 6e 73 69 74 69 76 65 20 ase insensitive
01b0: 73 74 72 69 6e 67 2e 0d 0a 2f 2f 20 49 6d 70 6c string...// Impl
01c0: 65 6d 65 6e 74 65 64 20 6f 6e 20 62 61 73 65 20 emented on base
01d0: 6f 66 20 4d 46 43 20 73 6f 75 72 63 65 20 63 6f of MFC source co
01e0: 64 65 2e 20 43 6f 6d 70 6c 65 74 6c 79 20 73 61 de. Completly sa
01f0: 76 65 20 69 6e 74 65 72 66 61 63 65 20 6f 66 20 ve interface of
0200: 4d 46 43 20 63 6c 61 73 73 20 d1 4d 61 70 2e 0d MFC class .Map..
0210: 0a 2f 2f 0d 0a 2f 2f 20 43 43 6f 6c 6c 65 63 74 .//..// CCollect
0220: 69 6f 6e 3a 20 61 72 72 61 79 20 6f 66 20 6e 61 ion: array of na
0230: 6d 65 64 20 69 74 65 6d 20 70 6f 69 6e 65 72 73 med item poiners
0240: 2e 0d 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .../////////////
0250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 23 70 72 61 67 /////////..#prag
0290: 6d 61 20 6f 6e 63 65 0d 0a 0d 0a 2f 2f 23 69 6e ma once....//#in
02a0: 63 6c 75 64 65 20 3c 61 66 78 74 65 6d 70 6c 2e clude <afxtempl.
02b0: 68 3e 0d 0a 23 64 65 66 69 6e 65 20 44 45 46 41 h>..#define DEFA
02c0: 55 4c 54 5f 48 41 53 48 5f 54 41 42 4c 45 5f 53 ULT_HASH_TABLE_S
02d0: 49 5a 45 20 33 32 0d 0a 23 64 65 66 69 6e 65 20 IZE 32..#define
02e0: 44 45 46 41 55 4c 54 5f 42 4c 4f 43 4b 5f 53 49 DEFAULT_BLOCK_SI
02f0: 5a 45 5f 52 41 54 49 4f 20 34 0d 0a 23 64 65 66 ZE_RATIO 4..#def
0300: 69 6e 65 20 44 45 46 41 55 4c 54 5f 4d 41 58 5f ine DEFAULT_MAX_
0310: 42 4c 4f 43 4b 5f 53 49 5a 45 20 31 32 38 0d 0a BLOCK_SIZE 128..
0320: 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 ..template<class
0330: 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 VALUE, class AR
0340: 47 5f 56 41 4c 55 45 3e 0d 0a 63 6c 61 73 73 20 G_VALUE>..class
0350: 43 49 53 74 72 69 6e 67 4d 61 70 20 3a 20 70 75 CIStringMap : pu
0360: 62 6c 69 63 20 43 4f 62 6a 65 63 74 0d 0a 7b 0d blic CObject..{.
0370: 0a 70 72 6f 74 65 63 74 65 64 3a 0d 0a 09 2f 2f .protected:...//
0380: 20 41 73 73 6f 63 69 61 74 69 6f 6e 0d 0a 09 73 Association...s
0390: 74 72 75 63 74 20 43 41 73 73 6f 63 0d 0a 09 7b truct CAssoc...{
03a0: 0d 0a 09 09 43 41 73 73 6f 63 2a 20 70 4e 65 78 ....CAssoc* pNex
03b0: 74 3b 0d 0a 09 09 2f 2f 20 68 61 73 68 20 f5 f0 t;....// hash ..
03c0: e0 ed e8 f2 f1 ff 20 ef ee eb ed ee f1 f2 fc fe ...... .........
03d0: 2c 20 f2 e0 ea 2c 20 ea e0 ea 20 e5 e3 ee 20 e2 , ..., ... ... .
03e0: ee e7 e2 f0 e0 f9 e0 e5 f2 20 48 61 73 68 4b 65 ......... HashKe
03f0: 79 28 29 0d 0a 09 09 2f 2f 20 e8 f1 ef ee eb fc y()....// ......
0400: e7 f3 e5 f2 f1 ff 20 e4 eb ff 20 fd f4 f4 e5 ea ...... ... .....
0410: f2 e8 e2 ed ee e3 ee 20 ef e5 f0 e5 f1 f2 f0 ee ....... ........
0420: e5 ed e8 ff 20 68 61 73 68 20 f2 e0 e1 eb e8 f6 .... hash ......
0430: 20 e8 20 ef f0 e5 e4 e2 e0 f0 e8 f2 e5 eb fc ed . .............
0440: ee e3 ee 20 f1 f0 e0 e2 ed e5 ed e8 ff 0d 0a 09 ... ............
0450: 09 55 49 4e 54 20 6e 48 61 73 68 56 61 6c 75 65 .UINT nHashValue
0460: 3b 20 20 2f 2f 20 6e 65 65 64 65 64 20 66 6f 72 ; // needed for
0470: 20 65 66 66 69 63 69 65 6e 74 20 69 74 65 72 61 efficient itera
0480: 74 69 6f 6e 0d 0a 09 09 4c 50 53 54 52 20 6b 65 tion....LPSTR ke
0490: 79 3b 0d 0a 09 09 56 41 4c 55 45 20 76 61 6c 75 y;....VALUE valu
04a0: 65 3b 0d 0a 09 7d 3b 0d 0a 70 75 62 6c 69 63 3a e;...};..public:
04b0: 0d 0a 2f 2f 20 43 6f 6e 73 74 72 75 63 74 69 6f ..// Constructio
04c0: 6e 0d 0a 09 43 49 53 74 72 69 6e 67 4d 61 70 28 n...CIStringMap(
04d0: 62 6f 6f 6c 20 62 55 73 65 45 78 74 65 72 6e 61 bool bUseExterna
04e0: 6c 4b 65 79 73 20 3d 20 66 61 6c 73 65 29 3b 0d lKeys = false);.
04f0: 0a 0d 0a 2f 2f 20 41 74 74 72 69 62 75 74 65 73 ...// Attributes
0500: 0d 0a 09 2f 2f 20 6e 75 6d 62 65 72 20 6f 66 20 ...// number of
0510: 65 6c 65 6d 65 6e 74 73 0d 0a 09 69 6e 74 20 47 elements...int G
0520: 65 74 43 6f 75 6e 74 28 29 20 63 6f 6e 73 74 3b etCount() const;
0530: 0d 0a 09 42 4f 4f 4c 20 49 73 45 6d 70 74 79 28 ...BOOL IsEmpty(
0540: 29 20 63 6f 6e 73 74 3b 0d 0a 0d 0a 09 2f 2f 20 ) const;.....//
0550: 4c 6f 6f 6b 75 70 0d 0a 09 42 4f 4f 4c 20 4c 6f Lookup...BOOL Lo
0560: 6f 6b 75 70 28 4c 50 43 53 54 52 20 6b 65 79 2c okup(LPCSTR key,
0570: 20 56 41 4c 55 45 26 20 72 56 61 6c 75 65 29 20 VALUE& rValue)
0580: 63 6f 6e 73 74 3b 0d 0a 09 42 4f 4f 4c 20 4c 6f const;...BOOL Lo
0590: 6f 6b 75 70 4b 65 79 28 4c 50 43 53 54 52 20 6b okupKey(LPCSTR k
05a0: 65 79 2c 20 4c 50 43 53 54 52 26 20 72 4b 65 79 ey, LPCSTR& rKey
05b0: 29 20 63 6f 6e 73 74 3b 0d 0a 0d 0a 2f 2f 20 4f ) const;....// O
05c0: 70 65 72 61 74 69 6f 6e 73 0d 0a 09 2f 2f 20 4c perations...// L
05d0: 6f 6f 6b 75 70 20 61 6e 64 20 61 64 64 20 69 66 ookup and add if
05e0: 20 6e 6f 74 20 74 68 65 72 65 0d 0a 09 56 41 4c not there...VAL
05f0: 55 45 26 20 6f 70 65 72 61 74 6f 72 5b 5d 28 4c UE& operator[](L
0600: 50 43 53 54 52 20 6b 65 79 29 3b 0d 0a 0d 0a 09 PCSTR key);.....
0610: 2f 2f 20 61 64 64 20 61 20 6e 65 77 20 28 6b 65 // add a new (ke
0620: 79 2c 20 76 61 6c 75 65 29 20 70 61 69 72 0d 0a y, value) pair..
0630: 09 76 6f 69 64 20 53 65 74 41 74 28 4c 50 43 53 .void SetAt(LPCS
0640: 54 52 20 6b 65 79 2c 20 41 52 47 5f 56 41 4c 55 TR key, ARG_VALU
0650: 45 20 6e 65 77 56 61 6c 75 65 29 3b 0d 0a 0d 0a E newValue);....
0660: 09 2f 2f 20 72 65 6d 6f 76 69 6e 67 20 65 78 69 .// removing exi
0670: 73 74 69 6e 67 20 28 6b 65 79 2c 20 3f 29 20 70 sting (key, ?) p
0680: 61 69 72 0d 0a 09 42 4f 4f 4c 20 52 65 6d 6f 76 air...BOOL Remov
0690: 65 4b 65 79 28 4c 50 43 53 54 52 20 6b 65 79 29 eKey(LPCSTR key)
06a0: 3b 0d 0a 09 76 6f 69 64 20 52 65 6d 6f 76 65 41 ;...void RemoveA
06b0: 6c 6c 28 29 3b 0d 0a 0d 0a 09 2f 2f 20 69 74 65 ll();.....// ite
06c0: 72 61 74 69 6e 67 20 61 6c 6c 20 28 6b 65 79 2c rating all (key,
06d0: 20 76 61 6c 75 65 29 20 70 61 69 72 73 0d 0a 09 value) pairs...
06e0: 50 4f 53 49 54 49 4f 4e 20 47 65 74 53 74 61 72 POSITION GetStar
06f0: 74 50 6f 73 69 74 69 6f 6e 28 29 20 63 6f 6e 73 tPosition() cons
0700: 74 3b 0d 0a 0d 0a 09 2f 2f 20 72 4b 65 79 20 e2 t;.....// rKey .
0710: ee e7 e2 f0 e0 f9 e0 e5 f2 f1 ff 20 ef ee 20 f1 ........... .. .
0720: f1 fb eb ea e5 2c 20 fd f2 e0 20 f4 f3 ed ea f6 ....., ... .....
0730: e8 ff 20 f0 e5 ea ee ec e5 ed e4 f3 e5 f2 f1 ff .. .............
0740: 20 ea 20 e8 f1 ef ee eb fc e7 ee e2 e0 ed e8 fe . .............
0750: 20 3d 6b 6d 73 0d 0a 09 76 6f 69 64 20 47 65 74 =kms...void Get
0760: 4e 65 78 74 41 73 73 6f 63 28 50 4f 53 49 54 49 NextAssoc(POSITI
0770: 4f 4e 26 20 72 4e 65 78 74 50 6f 73 69 74 69 6f ON& rNextPositio
0780: 6e 2c 20 4c 50 43 53 54 52 26 20 72 4b 65 79 2c n, LPCSTR& rKey,
0790: 20 56 41 4c 55 45 26 20 72 56 61 6c 75 65 29 20 VALUE& rValue)
07a0: 63 6f 6e 73 74 3b 0d 0a 09 2f 2f 20 72 4b 65 79 const;...// rKey
07b0: 20 ea ee ef e8 f0 f3 e5 f2 f1 ff 20 e2 20 43 53 .......... . CS
07c0: 74 72 69 6e 67 20 28 ee f1 f2 e0 e2 eb e5 ed ee tring (.........
07d0: 20 e4 eb ff 20 f1 ee e2 ec e5 f1 f2 e8 ec ee f1 ... ...........
07e0: f2 e8 20 f1 20 f1 f3 f9 e5 f1 f2 e2 f3 fe f9 e8 .. . ...........
07f0: ec 20 ea ee e4 ee ec 29 20 3d 6b 6d 73 0d 0a 09 . .....) =kms...
0800: 76 6f 69 64 20 47 65 74 4e 65 78 74 41 73 73 6f void GetNextAsso
0810: 63 28 50 4f 53 49 54 49 4f 4e 26 20 72 4e 65 78 c(POSITION& rNex
0820: 74 50 6f 73 69 74 69 6f 6e 2c 20 43 53 74 72 69 tPosition, CStri
0830: 6e 67 26 20 72 4b 65 79 2c 20 56 41 4c 55 45 26 ng& rKey, VALUE&
0840: 20 72 56 61 6c 75 65 29 20 63 6f 6e 73 74 3b 0d rValue) const;.
0850: 0a 0d 0a 09 2f 2f 20 61 64 76 61 6e 63 65 64 20 ....// advanced
0860: 66 65 61 74 75 72 65 73 20 66 6f 72 20 64 65 72 features for der
0870: 69 76 65 64 20 63 6c 61 73 73 65 73 0d 0a 09 55 ived classes...U
0880: 49 4e 54 20 47 65 74 48 61 73 68 54 61 62 6c 65 INT GetHashTable
0890: 53 69 7a 65 28 29 20 63 6f 6e 73 74 3b 0d 0a 0d Size() const;...
08a0: 0a 09 2f 2f 20 ec e5 f2 ee e4 20 e4 e8 ed e0 ec ..// ..... .....
08b0: e8 f7 e5 f1 ea e8 20 e8 20 e1 e5 e7 ee ef e0 f1 ...... . .......
08c0: ed ee 20 28 e1 e5 e7 20 ef ee f2 e5 f0 e8 20 f3 .. (... ...... .
08d0: ea e0 e7 e0 f2 e5 eb e5 e9 29 20 f3 ef f0 e0 e2 .........) .....
08e0: eb ff e5 f2 20 f0 e0 e7 ec e5 f0 ee ec 20 68 61 .... ........ ha
08f0: 73 68 20 74 61 62 6c 65 0d 0a 09 76 6f 69 64 20 sh table...void
0900: 49 6e 69 74 48 61 73 68 54 61 62 6c 65 28 55 49 InitHashTable(UI
0910: 4e 54 20 6e 65 77 5f 6e 48 61 73 68 54 61 62 6c NT new_nHashTabl
0920: 65 53 69 7a 65 29 3b 0d 0a 0d 0a 09 2f 2f 20 e4 eSize);.....// .
0930: ee e1 e0 e2 e8 ec 20 e2 ee e7 ec ee e6 ed ee f1 ...... .........
0940: f2 fc 20 ef e5 f0 e5 ee ef f0 e5 e4 e5 eb e5 ed .. .............
0950: e8 ff 20 f5 e5 f8 2d f4 f3 ed ea f6 e8 e8 0d 0a .. ...-.........
0960: 09 76 69 72 74 75 61 6c 20 55 49 4e 54 20 48 61 .virtual UINT Ha
0970: 73 68 4b 65 79 28 4c 50 43 53 54 52 20 6b 65 79 shKey(LPCSTR key
0980: 29 20 63 6f 6e 73 74 3b 0d 0a 09 76 69 72 74 75 ) const;...virtu
0990: 61 6c 20 69 6e 74 20 43 6f 6d 70 61 72 65 28 4c al int Compare(L
09a0: 50 43 53 54 52 20 6b 65 79 31 2c 20 4c 50 43 53 PCSTR key1, LPCS
09b0: 54 52 20 6b 65 79 32 29 20 63 6f 6e 73 74 3b 0d TR key2) const;.
09c0: 0a 0d 0a 09 2f 2f 20 f4 f3 ed ea f6 e8 ff 20 e4 ....// ....... .
09d0: eb ff 20 ee f2 eb e0 e4 ea e8 20 68 61 73 68 20 .. ....... hash
09e0: f4 f3 ed ea f6 e8 e8 0d 0a 09 69 6e 74 20 47 65 ..........int Ge
09f0: 74 43 6f 6c 6c 69 73 69 6f 6e 43 6f 75 6e 74 28 tCollisionCount(
0a00: 62 6f 6f 6c 20 62 53 68 6f 77 4d 73 67 20 3d 20 bool bShowMsg =
0a10: 66 61 6c 73 65 29 20 63 6f 6e 73 74 3b 0d 0a 0d false) const;...
0a20: 0a 09 73 74 61 74 69 63 20 55 49 4e 54 20 6d 5f ..static UINT m_
0a30: 43 53 31 32 35 31 5f 75 70 70 65 72 5b 32 35 36 CS1251_upper[256
0a40: 5d 3b 0d 0a 0d 0a 2f 2f 20 49 6d 70 6c 65 6d 65 ];....// Impleme
0a50: 6e 74 61 74 69 6f 6e 0d 0a 70 72 6f 74 65 63 74 ntation..protect
0a60: 65 64 3a 0d 0a 09 43 41 73 73 6f 63 2a 2a 20 6d ed:...CAssoc** m
0a70: 5f 70 48 61 73 68 54 61 62 6c 65 3b 0d 0a 09 55 _pHashTable;...U
0a80: 49 4e 54 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 INT m_nHashTable
0a90: 53 69 7a 65 3b 0d 0a 0d 0a 09 55 49 4e 54 20 6d Size;.....UINT m
0aa0: 5f 6e 43 6f 75 6e 74 3b 0d 0a 09 43 41 73 73 6f _nCount;...CAsso
0ab0: 63 2a 20 6d 5f 70 46 72 65 65 4c 69 73 74 3b 0d c* m_pFreeList;.
0ac0: 0a 09 73 74 72 75 63 74 20 43 50 6c 65 78 2a 20 ..struct CPlex*
0ad0: 6d 5f 70 42 6c 6f 63 6b 73 3b 0d 0a 09 55 49 4e m_pBlocks;...UIN
0ae0: 54 20 6d 5f 6e 42 6c 6f 63 6b 53 69 7a 65 3b 0d T m_nBlockSize;.
0af0: 0a 0d 0a 09 43 41 73 73 6f 63 2a 20 4e 65 77 41 ....CAssoc* NewA
0b00: 73 73 6f 63 28 73 69 7a 65 5f 74 20 6e 4b 65 79 ssoc(size_t nKey
0b10: 53 69 7a 65 29 3b 0d 0a 09 76 6f 69 64 20 46 72 Size);...void Fr
0b20: 65 65 41 73 73 6f 63 28 43 41 73 73 6f 63 2a 29 eeAssoc(CAssoc*)
0b30: 3b 0d 0a 09 43 41 73 73 6f 63 2a 20 47 65 74 41 ;...CAssoc* GetA
0b40: 73 73 6f 63 41 74 28 4c 50 43 53 54 52 2c 20 55 ssocAt(LPCSTR, U
0b50: 49 4e 54 26 29 20 63 6f 6e 73 74 3b 0d 0a 0d 0a INT&) const;....
0b60: 09 2f 2f 20 f3 ef f0 e0 e2 eb ff e5 f2 20 f0 e5 .// ......... ..
0b70: e0 eb e8 e7 e0 f6 e8 e5 e9 20 f5 f0 e0 ed e5 ed ......... ......
0b80: e8 ff 20 ea eb fe f7 e5 e9 3a 0d 0a 09 2f 2f 20 .. ......:...//
0b90: 66 61 6c 73 65 3a 20 e2 fb e4 e5 eb ff e5 f2 20 false: ........
0ba0: ef e0 ec ff f2 fc 2c 20 ea ee ef e8 f0 f3 e5 f2 ......, ........
0bb0: 20 ea eb fe f7 0d 0a 09 2f 2f 20 74 72 75 e5 3a .......// tru.:
0bc0: 20 20 e8 f1 ef ee eb fc e7 f3 e5 f2 20 ea eb fe .......... ...
0bd0: f7 20 ef ee 20 f1 f1 fb eb ea e5 0d 0a 09 62 6f . .. .........bo
0be0: 6f 6c 20 6d 5f 62 55 73 65 45 78 74 65 72 6e 61 ol m_bUseExterna
0bf0: 6c 4b 65 79 73 3b 0d 0a 70 75 62 6c 69 63 3a 0d lKeys;..public:.
0c00: 0a 09 7e 43 49 53 74 72 69 6e 67 4d 61 70 28 29 ..~CIStringMap()
0c10: 3b 0d 0a 09 76 6f 69 64 20 53 65 72 69 61 6c 69 ;...void Seriali
0c20: 7a 65 28 43 41 72 63 68 69 76 65 26 29 3b 0d 0a ze(CArchive&);..
0c30: 23 69 66 64 65 66 20 5f 44 45 42 55 47 0d 0a 09 #ifdef _DEBUG...
0c40: 76 6f 69 64 20 44 75 6d 70 28 43 44 75 6d 70 43 void Dump(CDumpC
0c50: 6f 6e 74 65 78 74 26 29 20 63 6f 6e 73 74 3b 0d ontext&) const;.
0c60: 0a 09 76 6f 69 64 20 41 73 73 65 72 74 56 61 6c ..void AssertVal
0c70: 69 64 28 29 20 63 6f 6e 73 74 3b 0d 0a 23 65 6e id() const;..#en
0c80: 64 69 66 0d 0a 7d 3b 0d 0a 0d 0a 74 65 6d 70 6c dif..};....templ
0c90: 61 74 65 3c 63 6c 61 73 73 20 56 41 4c 55 45 2c ate<class VALUE,
0ca0: 20 63 6c 61 73 73 20 41 52 47 5f 56 41 4c 55 45 class ARG_VALUE
0cb0: 3e 0d 0a 55 49 4e 54 20 43 49 53 74 72 69 6e 67 >..UINT CIString
0cc0: 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 5f 56 Map<VALUE, ARG_V
0cd0: 41 4c 55 45 3e 3a 3a 6d 5f 43 53 31 32 35 31 5f ALUE>::m_CS1251_
0ce0: 75 70 70 65 72 5b 32 35 36 5d 20 3d 0d 0a 7b 0d upper[256] =..{.
0cf0: 0a 20 20 20 20 30 78 30 30 2c 30 78 30 31 2c 30 . 0x00,0x01,0
0d00: 78 30 32 2c 30 78 30 33 2c 30 78 30 34 2c 30 78 x02,0x03,0x04,0x
0d10: 30 35 2c 30 78 30 36 2c 30 78 30 37 2c 30 78 30 05,0x06,0x07,0x0
0d20: 38 2c 30 78 30 39 2c 30 78 30 41 2c 30 78 30 42 8,0x09,0x0A,0x0B
0d30: 2c 30 78 30 43 2c 30 78 30 44 2c 30 78 30 45 2c ,0x0C,0x0D,0x0E,
0d40: 30 78 30 46 2c 0d 0a 20 20 20 20 30 78 31 30 2c 0x0F,.. 0x10,
0d50: 30 78 31 31 2c 30 78 31 32 2c 30 78 31 33 2c 30 0x11,0x12,0x13,0
0d60: 78 31 34 2c 30 78 31 35 2c 30 78 31 36 2c 30 78 x14,0x15,0x16,0x
0d70: 31 37 2c 30 78 31 38 2c 30 78 31 39 2c 30 78 31 17,0x18,0x19,0x1
0d80: 41 2c 30 78 31 42 2c 30 78 31 43 2c 30 78 31 44 A,0x1B,0x1C,0x1D
0d90: 2c 30 78 31 45 2c 30 78 31 46 2c 0d 0a 20 20 20 ,0x1E,0x1F,..
0da0: 20 30 78 32 30 2c 30 78 32 31 2c 30 78 32 32 2c 0x20,0x21,0x22,
0db0: 30 78 32 33 2c 30 78 32 34 2c 30 78 32 35 2c 30 0x23,0x24,0x25,0
0dc0: 78 32 36 2c 30 78 32 37 2c 30 78 32 38 2c 30 78 x26,0x27,0x28,0x
0dd0: 32 39 2c 30 78 32 41 2c 30 78 32 42 2c 30 78 32 29,0x2A,0x2B,0x2
0de0: 43 2c 30 78 32 44 2c 30 78 32 45 2c 30 78 32 46 C,0x2D,0x2E,0x2F
0df0: 2c 0d 0a 20 20 20 20 30 78 33 30 2c 30 78 33 31 ,.. 0x30,0x31
0e00: 2c 30 78 33 32 2c 30 78 33 33 2c 30 78 33 34 2c ,0x32,0x33,0x34,
0e10: 30 78 33 35 2c 30 78 33 36 2c 30 78 33 37 2c 30 0x35,0x36,0x37,0
0e20: 78 33 38 2c 30 78 33 39 2c 30 78 33 41 2c 30 78 x38,0x39,0x3A,0x
0e30: 33 42 2c 30 78 33 43 2c 30 78 33 44 2c 30 78 33 3B,0x3C,0x3D,0x3
0e40: 45 2c 30 78 33 46 2c 0d 0a 2f 2f 20 20 20 20 20 E,0x3F,..//
0e50: 40 20 20 20 20 41 0d 0a 20 20 20 20 30 78 34 30 @ A.. 0x40
0e60: 2c 30 78 34 31 2c 30 78 34 32 2c 30 78 34 33 2c ,0x41,0x42,0x43,
0e70: 30 78 34 34 2c 30 78 34 35 2c 30 78 34 36 2c 30 0x44,0x45,0x46,0
0e80: 78 34 37 2c 30 78 34 38 2c 30 78 34 39 2c 30 78 x47,0x48,0x49,0x
0e90: 34 41 2c 30 78 34 42 2c 30 78 34 43 2c 30 78 34 4A,0x4B,0x4C,0x4
0ea0: 44 2c 30 78 34 45 2c 30 78 34 46 2c 0d 0a 2f 2f D,0x4E,0x4F,..//
0eb0: 09 09 09 09 09 09 09 09 09 09 09 09 09 09 20 5a .............. Z
0ec0: 09 09 09 09 09 09 20 20 5f 20 0d 0a 20 20 20 20 ...... _ ..
0ed0: 30 78 35 30 2c 30 78 35 31 2c 30 78 35 32 2c 30 0x50,0x51,0x52,0
0ee0: 78 35 33 2c 30 78 35 34 2c 30 78 35 35 2c 30 78 x53,0x54,0x55,0x
0ef0: 35 36 2c 30 78 35 37 2c 30 78 35 38 2c 30 78 35 56,0x57,0x58,0x5
0f00: 39 2c 30 78 35 41 2c 30 78 35 42 2c 30 78 35 43 9,0x5A,0x5B,0x5C
0f10: 2c 30 78 35 44 2c 30 78 35 45 2c 30 78 35 46 2c ,0x5D,0x5E,0x5F,
0f20: 0d 0a 2f 2f 20 20 20 20 20 60 20 20 20 20 61 0d ..// ` a.
0f30: 0a 20 20 20 20 30 78 36 30 2c 30 78 34 31 2c 30 . 0x60,0x41,0
0f40: 78 34 32 2c 30 78 34 33 2c 30 78 34 34 2c 30 78 x42,0x43,0x44,0x
0f50: 34 35 2c 30 78 34 36 2c 30 78 34 37 2c 30 78 34 45,0x46,0x47,0x4
0f60: 38 2c 30 78 34 39 2c 30 78 34 41 2c 30 78 34 42 8,0x49,0x4A,0x4B
0f70: 2c 30 78 34 43 2c 30 78 34 44 2c 30 78 34 45 2c ,0x4C,0x4D,0x4E,
0f80: 30 78 34 46 2c 0d 0a 2f 2f 09 09 09 09 09 09 09 0x4F,..//.......
0f90: 09 09 09 09 09 09 09 20 7a 09 09 09 09 09 09 20 ....... z......
0fa0: 20 7e 0d 0a 20 20 20 20 30 78 35 30 2c 30 78 35 ~.. 0x50,0x5
0fb0: 31 2c 30 78 35 32 2c 30 78 35 33 2c 30 78 35 34 1,0x52,0x53,0x54
0fc0: 2c 30 78 35 35 2c 30 78 35 36 2c 30 78 35 37 2c ,0x55,0x56,0x57,
0fd0: 30 78 35 38 2c 30 78 35 39 2c 30 78 35 41 2c 30 0x58,0x59,0x5A,0
0fe0: 78 37 42 2c 30 78 37 43 2c 30 78 37 44 2c 30 78 x7B,0x7C,0x7D,0x
0ff0: 37 45 2c 30 78 37 46 2c 0d 0a 20 20 20 20 30 78 7E,0x7F,.. 0x
1000: 38 30 2c 30 78 38 31 2c 30 78 38 32 2c 30 78 38 80,0x81,0x82,0x8
1010: 33 2c 30 78 38 34 2c 30 78 38 35 2c 30 78 38 36 3,0x84,0x85,0x86
1020: 2c 30 78 38 37 2c 30 78 38 38 2c 30 78 38 39 2c ,0x87,0x88,0x89,
1030: 30 78 38 41 2c 30 78 38 42 2c 30 78 38 43 2c 30 0x8A,0x8B,0x8C,0
1040: 78 38 44 2c 30 78 38 45 2c 30 78 38 46 2c 0d 0a x8D,0x8E,0x8F,..
1050: 20 20 20 20 30 78 39 30 2c 30 78 39 31 2c 30 78 0x90,0x91,0x
1060: 39 32 2c 30 78 39 33 2c 30 78 39 34 2c 30 78 39 92,0x93,0x94,0x9
1070: 35 2c 30 78 39 36 2c 30 78 39 37 2c 30 78 39 38 5,0x96,0x97,0x98
1080: 2c 30 78 39 39 2c 30 78 39 41 2c 30 78 39 42 2c ,0x99,0x9A,0x9B,
1090: 30 78 39 43 2c 30 78 39 44 2c 30 78 39 45 2c 30 0x9C,0x9D,0x9E,0
10a0: 78 39 46 2c 0d 0a 2f 2f 20 20 20 20 20 20 20 20 x9F,..//
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10d0: 20 20 20 20 20 a8 0d 0a 20 20 20 20 30 78 41 30 ... 0xA0
10e0: 2c 30 78 41 31 2c 30 78 41 32 2c 30 78 41 33 2c ,0xA1,0xA2,0xA3,
10f0: 30 78 41 34 2c 30 78 41 35 2c 30 78 41 36 2c 30 0xA4,0xA5,0xA6,0
1100: 78 41 37 2c 30 78 41 38 2c 30 78 41 39 2c 30 78 xA7,0xA8,0xA9,0x
1110: 41 41 2c 30 78 41 42 2c 30 78 41 43 2c 30 78 41 AA,0xAB,0xAC,0xA
1120: 44 2c 30 78 41 45 2c 30 78 41 46 2c 0d 0a 2f 2f D,0xAE,0xAF,..//
1130: 09 09 09 09 09 09 09 09 09 09 09 20 20 20 b8 0d ........... ..
1140: 0a 20 20 20 20 30 78 42 30 2c 30 78 42 31 2c 30 . 0xB0,0xB1,0
1150: 78 42 32 2c 30 78 42 33 2c 30 78 42 34 2c 30 78 xB2,0xB3,0xB4,0x
1160: 42 35 2c 30 78 42 36 2c 30 78 42 37 2c 30 78 41 B5,0xB6,0xB7,0xA
1170: 38 2c 30 78 42 39 2c 30 78 42 41 2c 30 78 42 42 8,0xB9,0xBA,0xBB
1180: 2c 30 78 42 43 2c 30 78 42 44 2c 30 78 42 45 2c ,0xBC,0xBD,0xBE,
1190: 30 78 42 46 2c 0d 0a 2f 2f 09 20 20 20 c0 0d 0a 0xBF,..//. ...
11a0: 20 20 20 20 30 78 43 30 2c 30 78 43 31 2c 30 78 0xC0,0xC1,0x
11b0: 43 32 2c 30 78 43 33 2c 30 78 43 34 2c 30 78 43 C2,0xC3,0xC4,0xC
11c0: 35 2c 30 78 43 36 2c 30 78 43 37 2c 30 78 43 38 5,0xC6,0xC7,0xC8
11d0: 2c 30 78 43 39 2c 30 78 43 41 2c 30 78 43 42 2c ,0xC9,0xCA,0xCB,
11e0: 30 78 43 43 2c 30 78 43 44 2c 30 78 43 45 2c 30 0xCC,0xCD,0xCE,0
11f0: 78 43 46 2c 0d 0a 2f 2f 09 09 09 09 09 09 09 09 xCF,..//........
1200: 09 09 09 09 09 09 09 09 09 09 09 09 20 20 df 0d ............ ..
1210: 0a 20 20 20 20 30 78 44 30 2c 30 78 44 31 2c 30 . 0xD0,0xD1,0
1220: 78 44 32 2c 30 78 44 33 2c 30 78 44 34 2c 30 78 xD2,0xD3,0xD4,0x
1230: 44 35 2c 30 78 44 36 2c 30 78 44 37 2c 30 78 44 D5,0xD6,0xD7,0xD
1240: 38 2c 30 78 44 39 2c 30 78 44 41 2c 30 78 44 42 8,0xD9,0xDA,0xDB
1250: 2c 30 78 44 43 2c 30 78 44 44 2c 30 78 44 45 2c ,0xDC,0xDD,0xDE,
1260: 30 78 44 46 2c 0d 0a 2f 2f 09 20 20 20 e0 0d 0a 0xDF,..//. ...
1270: 20 20 20 20 30 78 43 30 2c 30 78 43 31 2c 30 78 0xC0,0xC1,0x
1280: 43 32 2c 30 78 43 33 2c 30 78 43 34 2c 30 78 43 C2,0xC3,0xC4,0xC
1290: 35 2c 30 78 43 36 2c 30 78 43 37 2c 30 78 43 38 5,0xC6,0xC7,0xC8
12a0: 2c 30 78 43 39 2c 30 78 43 41 2c 30 78 43 42 2c ,0xC9,0xCA,0xCB,
12b0: 30 78 43 43 2c 30 78 43 44 2c 30 78 43 45 2c 30 0xCC,0xCD,0xCE,0
12c0: 78 43 46 2c 0d 0a 2f 2f 09 09 09 09 09 09 09 09 xCF,..//........
12d0: 09 09 09 09 09 09 09 09 09 09 09 09 20 20 ff 0d ............ ..
12e0: 0a 20 20 20 20 30 78 44 30 2c 30 78 44 31 2c 30 . 0xD0,0xD1,0
12f0: 78 44 32 2c 30 78 44 33 2c 30 78 44 34 2c 30 78 xD2,0xD3,0xD4,0x
1300: 44 35 2c 30 78 44 36 2c 30 78 44 37 2c 30 78 44 D5,0xD6,0xD7,0xD
1310: 38 2c 30 78 44 39 2c 30 78 44 41 2c 30 78 44 42 8,0xD9,0xDA,0xDB
1320: 2c 30 78 44 43 2c 30 78 44 44 2c 30 78 44 45 2c ,0xDC,0xDD,0xDE,
1330: 30 78 44 46 2c 0d 0a 7d 3b 0d 0a 0d 0a 74 65 6d 0xDF,..};....tem
1340: 70 6c 61 74 65 3c 63 6c 61 73 73 20 56 41 4c 55 plate<class VALU
1350: 45 2c 20 63 6c 61 73 73 20 41 52 47 5f 56 41 4c E, class ARG_VAL
1360: 55 45 3e 0d 0a 55 49 4e 54 20 43 49 53 74 72 69 UE>..UINT CIStri
1370: 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 ngMap<VALUE, ARG
1380: 5f 56 41 4c 55 45 3e 3a 3a 48 61 73 68 4b 65 79 _VALUE>::HashKey
1390: 28 4c 50 43 53 54 52 20 6b 65 79 29 20 63 6f 6e (LPCSTR key) con
13a0: 73 74 0d 0a 7b 0d 0a 09 2f 2a 0d 0a 09 69 66 20 st..{.../*...if
13b0: 28 63 68 20 3d 20 30 78 42 38 29 0d 0a 09 63 68 (ch = 0xB8)...ch
13c0: 20 3d 20 30 78 41 38 3b 0d 0a 09 65 6c 73 65 20 = 0xA8;...else
13d0: 69 66 20 28 63 68 20 3e 3d 20 30 78 45 30 20 7c if (ch >= 0xE0 |
13e0: 7c 20 63 68 20 3e 3d 20 30 78 36 31 20 26 26 20 | ch >= 0x61 &&
13f0: 63 68 20 3c 3d 20 30 78 37 41 29 0d 0a 09 63 68 ch <= 0x7A)...ch
1400: 20 2d 3d 20 30 78 32 30 3b 0d 0a 09 2a 2f 0d 0a -= 0x20;...*/..
1410: 0d 0a 20 20 20 20 55 49 4e 54 20 63 68 3b 0d 0a .. UINT ch;..
1420: 2f 2f 09 55 49 4e 54 20 6e 48 61 73 68 20 3d 20 //.UINT nHash =
1430: 30 3b 0d 0a 0d 0a 20 20 20 20 55 49 4e 54 20 78 0;.... UINT x
1440: 31 3d 30 78 31 34 66 32 61 66 66 63 3b 0d 0a 20 1=0x14f2affc;..
1450: 20 20 20 55 49 4e 54 20 78 32 3d 30 78 66 61 63 UINT x2=0xfac
1460: 35 62 64 38 66 3b 0d 0a 09 55 49 4e 54 20 78 33 5bd8f;...UINT x3
1470: 3d 30 78 65 35 66 63 38 32 61 39 3b 0d 0a 09 0d =0xe5fc82a9;....
1480: 0a 09 2f 2f 20 ed e5 ee f7 e5 e2 e8 e4 ed ee 2c ..// ..........,
1490: 20 ed ee 20 e1 e5 e7 20 ef f0 e8 e2 e5 e4 e5 ed .. ... ........
14a0: e8 ff 20 ea 20 42 59 54 45 20 e8 f1 ef ee eb fc .. . BYTE ......
14b0: e7 f3 e5 f2 f1 ff 20 6d 6f 76 73 78 21 0d 0a 09 ...... movsx!...
14c0: 77 68 69 6c 65 28 63 68 20 3d 20 73 74 61 74 69 while(ch = stati
14d0: 63 5f 63 61 73 74 3c 55 49 4e 54 3e 28 73 74 61 c_cast<UINT>(sta
14e0: 74 69 63 5f 63 61 73 74 3c 42 59 54 45 3e 28 2a tic_cast<BYTE>(*
14f0: 6b 65 79 2b 2b 29 29 29 0d 0a 09 7b 0d 0a 2f 2f key++)))...{..//
1500: 09 09 20 6e 48 61 73 68 20 3d 20 28 6e 48 61 73 .. nHash = (nHas
1510: 68 3c 3c 35 29 20 2b 20 6e 48 61 73 68 20 2b 20 h<<5) + nHash +
1520: 6d 5f 43 53 31 32 35 31 5f 75 70 70 65 72 5b 63 m_CS1251_upper[c
1530: 68 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f h];.... /
1540: 2f 20 e1 ee eb e5 e5 20 f0 e0 e2 ed ee ec e5 f0 / ..... ........
1550: ed e0 20 ed e0 20 ea ee f0 ee f2 ea e8 f5 20 f1 .. .. ........ .
1560: f2 f0 ee ea e0 f5 0d 0a 09 09 78 31 20 2b 3d 20 ..........x1 +=
1570: 5f 72 6f 74 6c 28 78 32 2c 20 34 29 20 2b 20 78 _rotl(x2, 4) + x
1580: 33 3b 0d 0a 20 20 20 20 20 20 20 20 78 32 20 2b 3;.. x2 +
1590: 3d 20 5f 72 6f 74 6c 28 78 31 2c 20 34 29 20 2b = _rotl(x1, 4) +
15a0: 20 6d 5f 43 53 31 32 35 31 5f 75 70 70 65 72 5b m_CS1251_upper[
15b0: 63 68 5d 3b 0d 0a 09 7d 3b 0d 0a 2f 2f 09 72 65 ch];...};..//.re
15c0: 74 75 72 6e 20 6e 48 61 73 68 3b 0d 0a 09 72 65 turn nHash;...re
15d0: 74 75 72 6e 20 78 31 20 2b 20 78 32 3b 0d 0a 7d turn x1 + x2;..}
15e0: 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 ....template<cla
15f0: 73 73 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 ss VALUE, class
1600: 41 52 47 5f 56 41 4c 55 45 3e 0d 0a 69 6e 74 20 ARG_VALUE>..int
1610: 43 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 CIStringMap<VALU
1620: 45 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 43 E, ARG_VALUE>::C
1630: 6f 6d 70 61 72 65 28 4c 50 43 53 54 52 20 6b 65 ompare(LPCSTR ke
1640: 79 31 2c 20 4c 50 43 53 54 52 20 6b 65 79 32 29 y1, LPCSTR key2)
1650: 20 63 6f 6e 73 74 0d 0a 7b 0d 0a 09 69 6e 74 20 const..{...int
1660: 72 65 73 75 6c 74 3b 0d 0a 09 55 49 4e 54 20 6e result;...UINT n
1670: 31 2c 20 6e 32 3b 0d 0a 09 55 49 4e 54 20 63 68 1, n2;...UINT ch
1680: 32 3b 0d 0a 0d 0a 09 77 68 69 6c 65 20 28 0d 0a 2;.....while (..
1690: 09 09 2f 2f 20 e8 ec e5 ed ed ee 20 e2 20 fd f2 ..// ...... . ..
16a0: ee ec 20 ef ee f0 ff e4 ea e5 0d 0a 09 09 63 68 .. ...........ch
16b0: 32 20 3d 20 73 74 61 74 69 63 5f 63 61 73 74 3c 2 = static_cast<
16c0: 55 49 4e 54 3e 28 73 74 61 74 69 63 5f 63 61 73 UINT>(static_cas
16d0: 74 3c 42 59 54 45 3e 28 2a 6b 65 79 32 2b 2b 29 t<BYTE>(*key2++)
16e0: 29 2c 0d 0a 09 09 6e 32 20 3d 20 6d 5f 43 53 31 ),....n2 = m_CS1
16f0: 32 35 31 5f 75 70 70 65 72 5b 63 68 32 5d 2c 0d 251_upper[ch2],.
1700: 0a 09 09 6e 31 20 3d 20 6d 5f 43 53 31 32 35 31 ...n1 = m_CS1251
1710: 5f 75 70 70 65 72 5b 73 74 61 74 69 63 5f 63 61 _upper[static_ca
1720: 73 74 3c 55 49 4e 54 3e 28 73 74 61 74 69 63 5f st<UINT>(static_
1730: 63 61 73 74 3c 42 59 54 45 3e 28 2a 6b 65 79 31 cast<BYTE>(*key1
1740: 2b 2b 29 29 5d 2c 0d 0a 09 09 21 28 20 72 65 73 ++))],....!( res
1750: 75 6c 74 20 3d 20 6e 31 20 2d 20 6e 32 29 20 26 ult = n1 - n2) &
1760: 26 20 63 68 32 29 3b 0d 0a 0d 0a 09 72 65 74 75 & ch2);.....retu
1770: 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 7d 0d 0a 0d rn result;..}...
1780: 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 20 .template<class
1790: 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 47 VALUE, class ARG
17a0: 5f 56 41 4c 55 45 3e 0d 0a 69 6e 74 20 43 49 53 _VALUE>..int CIS
17b0: 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 tringMap<VALUE,
17c0: 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 47 65 74 43 ARG_VALUE>::GetC
17d0: 6f 6c 6c 69 73 69 6f 6e 43 6f 75 6e 74 28 62 6f ollisionCount(bo
17e0: 6f 6c 20 62 53 68 6f 77 4d 73 67 29 20 63 6f 6e ol bShowMsg) con
17f0: 73 74 0d 0a 7b 0d 0a 09 69 6e 74 20 6e 55 6e 75 st..{...int nUnu
1800: 6e 69 71 75 65 20 3d 20 30 2c 20 6e 4d 61 78 42 nique = 0, nMaxB
1810: 75 63 6b 65 74 20 3d 20 30 2c 20 6e 42 75 63 6b ucket = 0, nBuck
1820: 65 74 73 20 3d 20 30 2c 20 6e 4e 75 6c 6c 73 20 ets = 0, nNulls
1830: 3d 20 30 3b 0d 0a 09 64 6f 75 62 6c 65 20 6e 43 = 0;...double nC
1840: 6f 6c 6c 69 73 69 6f 6e 73 20 3d 20 30 3b 0d 0a ollisions = 0;..
1850: 0d 0a 09 69 66 20 28 6d 5f 70 48 61 73 68 54 61 ...if (m_pHashTa
1860: 62 6c 65 20 21 3d 20 4e 55 4c 4c 29 0d 0a 09 7b ble != NULL)...{
1870: 0d 0a 09 09 66 6f 72 20 28 55 49 4e 54 20 6e 48 ....for (UINT nH
1880: 61 73 68 20 3d 20 30 3b 20 6e 48 61 73 68 20 3c ash = 0; nHash <
1890: 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a m_nHashTableSiz
18a0: 65 3b 20 2b 2b 6e 48 61 73 68 29 0d 0a 09 09 7b e; ++nHash)....{
18b0: 0d 0a 09 09 09 43 41 73 73 6f 63 2a 20 70 41 73 .....CAssoc* pAs
18c0: 73 6f 63 3b 0d 0a 09 09 09 69 6e 74 20 6e 43 75 soc;.....int nCu
18d0: 72 72 65 6e 74 20 3d 20 30 3b 0d 0a 09 09 09 66 rrent = 0;.....f
18e0: 6f 72 20 28 28 70 41 73 73 6f 63 20 3d 20 6d 5f or ((pAssoc = m_
18f0: 70 48 61 73 68 54 61 62 6c 65 5b 6e 48 61 73 68 pHashTable[nHash
1900: 5d 29 20 3f 20 30 20 3a 20 2b 2b 6e 4e 75 6c 6c ]) ? 0 : ++nNull
1910: 73 3b 20 70 41 73 73 6f 63 3b 20 70 41 73 73 6f s; pAssoc; pAsso
1920: 63 20 3d 20 70 41 73 73 6f 63 2d 3e 70 4e 65 78 c = pAssoc->pNex
1930: 74 2c 20 2b 2b 6e 43 75 72 72 65 6e 74 29 3b 0d t, ++nCurrent);.
1940: 0a 0d 0a 09 09 09 69 66 20 28 6e 43 75 72 72 65 ......if (nCurre
1950: 6e 74 20 3d 3d 20 31 29 0d 0a 09 09 09 09 2d 2d nt == 1)......--
1960: 6e 43 75 72 72 65 6e 74 3b 0d 0a 0d 0a 09 09 09 nCurrent;.......
1970: 69 66 20 28 6e 43 75 72 72 65 6e 74 29 0d 0a 09 if (nCurrent)...
1980: 09 09 7b 0d 0a 09 09 09 09 2b 2b 6e 42 75 63 6b ..{......++nBuck
1990: 65 74 73 3b 0d 0a 0d 0a 09 09 09 09 2f 2f 20 28 ets;........// (
19a0: 6e 43 75 72 72 65 6e 74 20 2d 20 31 29 21 0d 0a nCurrent - 1)!..
19b0: 09 09 09 09 64 6f 75 62 6c 65 20 66 61 63 74 20 ....double fact
19c0: 3d 20 31 3b 0d 0a 09 09 09 09 66 6f 72 20 28 69 = 1;......for (i
19d0: 6e 74 20 69 20 3d 20 32 3b 20 69 20 3c 20 6e 43 nt i = 2; i < nC
19e0: 75 72 72 65 6e 74 3b 20 66 61 63 74 20 2a 3d 69 urrent; fact *=i
19f0: 2c 20 2b 2b 69 29 3b 0d 0a 0d 0a 09 09 09 09 6e , ++i);........n
1a00: 43 6f 6c 6c 69 73 69 6f 6e 73 20 2b 3d 20 66 61 Collisions += fa
1a10: 63 74 3b 0d 0a 09 09 09 7d 0d 0a 0d 0a 09 09 09 ct;.....}.......
1a20: 6e 55 6e 75 6e 69 71 75 65 20 2b 3d 20 6e 43 75 nUnunique += nCu
1a30: 72 72 65 6e 74 3b 0d 0a 09 09 09 6e 4d 61 78 42 rrent;.....nMaxB
1a40: 75 63 6b 65 74 20 3d 20 6d 61 78 28 6e 4d 61 78 ucket = max(nMax
1a50: 42 75 63 6b 65 74 2c 20 6e 43 75 72 72 65 6e 74 Bucket, nCurrent
1a60: 29 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 09 69 66 );....}...}...if
1a70: 20 28 62 53 68 6f 77 4d 73 67 29 0d 0a 09 7b 0d (bShowMsg)...{.
1a80: 0a 09 09 64 6f 75 62 6c 65 20 6e 52 61 74 69 6f ...double nRatio
1a90: 20 3d 20 28 6d 5f 6e 43 6f 75 6e 74 20 3c 32 29 = (m_nCount <2)
1aa0: 20 3f 20 30 20 3a 20 28 28 64 6f 75 62 6c 65 29 ? 0 : ((double)
1ab0: 6e 43 6f 6c 6c 69 73 69 6f 6e 73 29 20 2f 20 28 nCollisions) / (
1ac0: 28 64 6f 75 62 6c 65 29 6d 5f 6e 43 6f 75 6e 74 (double)m_nCount
1ad0: 20 2a 20 28 6d 5f 6e 43 6f 75 6e 74 20 2d 20 31 * (m_nCount - 1
1ae0: 29 20 2f 20 28 32 20 2a 20 6d 5f 6e 48 61 73 68 ) / (2 * m_nHash
1af0: 54 61 62 6c 65 53 69 7a 65 29 29 3b 0d 0a 09 09 TableSize));....
1b00: 4d 73 67 28 22 55 6e 75 6e 69 71 75 65 20 68 61 Msg("Ununique ha
1b10: 73 68 65 73 3a 20 25 69 2c 20 43 6f 6c 6c 69 73 shes: %i, Collis
1b20: 69 6f 6e 73 20 3a 20 25 67 2c 20 42 75 63 6b 65 ions : %g, Bucke
1b30: 74 73 3a 20 25 69 2c 20 4d 61 78 20 62 75 63 6b ts: %i, Max buck
1b40: 65 74 20 73 69 7a 65 3a 20 25 69 2c 20 4e 75 6c et size: %i, Nul
1b50: 6c 73 3a 20 25 69 2c 20 41 73 73 6f 63 69 61 74 ls: %i, Associat
1b60: 69 6f 6e 73 20 63 6f 75 6e 74 3a 20 25 69 2c 20 ions count: %i,
1b70: 48 61 73 68 20 74 61 62 6c 65 20 73 69 7a 65 3a Hash table size:
1b80: 20 25 69 2c 20 48 61 73 68 20 66 75 6e 63 74 69 %i, Hash functi
1b90: 6f 6e 20 71 75 61 6c 69 74 79 3a 20 25 67 22 2c on quality: %g",
1ba0: 0d 0a 09 09 09 6e 55 6e 75 6e 69 71 75 65 2c 20 .....nUnunique,
1bb0: 6e 43 6f 6c 6c 69 73 69 6f 6e 73 2c 20 6e 42 75 nCollisions, nBu
1bc0: 63 6b 65 74 73 2c 20 6e 4d 61 78 42 75 63 6b 65 ckets, nMaxBucke
1bd0: 74 2c 20 6e 4e 75 6c 6c 73 2c 20 6d 5f 6e 43 6f t, nNulls, m_nCo
1be0: 75 6e 74 2c 20 6d 5f 6e 48 61 73 68 54 61 62 6c unt, m_nHashTabl
1bf0: 65 53 69 7a 65 2c 20 6e 52 61 74 69 6f 29 3b 0d eSize, nRatio);.
1c00: 0a 09 7d 0d 0a 0d 0a 09 72 65 74 75 72 6e 20 6e ..}.....return n
1c10: 43 6f 6c 6c 69 73 69 6f 6e 73 3b 0d 0a 7d 0d 0a Collisions;..}..
1c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 2f /////////////../
1c70: 2f 20 43 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 / CIStringMap<VA
1c80: 4c 55 45 2c 20 41 52 47 5f 56 41 4c 55 45 3e 20 LUE, ARG_VALUE>
1c90: 69 6e 6c 69 6e 65 20 66 75 6e 63 74 69 6f 6e 73 inline functions
1ca0: 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 ....template<cla
1cb0: 73 73 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 ss VALUE, class
1cc0: 41 52 47 5f 56 41 4c 55 45 3e 0d 0a 41 46 58 5f ARG_VALUE>..AFX_
1cd0: 49 4e 4c 49 4e 45 20 69 6e 74 20 43 49 53 74 72 INLINE int CIStr
1ce0: 69 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 ingMap<VALUE, AR
1cf0: 47 5f 56 41 4c 55 45 3e 3a 3a 47 65 74 43 6f 75 G_VALUE>::GetCou
1d00: 6e 74 28 29 20 63 6f 6e 73 74 0d 0a 09 7b 20 72 nt() const...{ r
1d10: 65 74 75 72 6e 20 6d 5f 6e 43 6f 75 6e 74 3b 20 eturn m_nCount;
1d20: 7d 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 }..template<clas
1d30: 73 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 s VALUE, class A
1d40: 52 47 5f 56 41 4c 55 45 3e 0d 0a 41 46 58 5f 49 RG_VALUE>..AFX_I
1d50: 4e 4c 49 4e 45 20 42 4f 4f 4c 20 43 49 53 74 72 NLINE BOOL CIStr
1d60: 69 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 ingMap<VALUE, AR
1d70: 47 5f 56 41 4c 55 45 3e 3a 3a 49 73 45 6d 70 74 G_VALUE>::IsEmpt
1d80: 79 28 29 20 63 6f 6e 73 74 0d 0a 09 7b 20 72 65 y() const...{ re
1d90: 74 75 72 6e 20 6d 5f 6e 43 6f 75 6e 74 20 3d 3d turn m_nCount ==
1da0: 20 30 3b 20 7d 0d 0a 74 65 6d 70 6c 61 74 65 3c 0; }..template<
1db0: 63 6c 61 73 73 20 56 41 4c 55 45 2c 20 63 6c 61 class VALUE, cla
1dc0: 73 73 20 41 52 47 5f 56 41 4c 55 45 3e 0d 0a 41 ss ARG_VALUE>..A
1dd0: 46 58 5f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 43 FX_INLINE void C
1de0: 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 IStringMap<VALUE
1df0: 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 53 65 , ARG_VALUE>::Se
1e00: 74 41 74 28 4c 50 43 53 54 52 20 6b 65 79 2c 20 tAt(LPCSTR key,
1e10: 41 52 47 5f 56 41 4c 55 45 20 6e 65 77 56 61 6c ARG_VALUE newVal
1e20: 75 65 29 0d 0a 09 7b 20 28 2a 74 68 69 73 29 5b ue)...{ (*this)[
1e30: 6b 65 79 5d 20 3d 20 6e 65 77 56 61 6c 75 65 3b key] = newValue;
1e40: 20 7d 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 }..template<cla
1e50: 73 73 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 ss VALUE, class
1e60: 41 52 47 5f 56 41 4c 55 45 3e 0d 0a 41 46 58 5f ARG_VALUE>..AFX_
1e70: 49 4e 4c 49 4e 45 20 50 4f 53 49 54 49 4f 4e 20 INLINE POSITION
1e80: 43 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 CIStringMap<VALU
1e90: 45 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 47 E, ARG_VALUE>::G
1ea0: 65 74 53 74 61 72 74 50 6f 73 69 74 69 6f 6e 28 etStartPosition(
1eb0: 29 20 63 6f 6e 73 74 0d 0a 09 7b 20 72 65 74 75 ) const...{ retu
1ec0: 72 6e 20 28 6d 5f 6e 43 6f 75 6e 74 20 3d 3d 20 rn (m_nCount ==
1ed0: 30 29 20 3f 20 4e 55 4c 4c 20 3a 20 42 45 46 4f 0) ? NULL : BEFO
1ee0: 52 45 5f 53 54 41 52 54 5f 50 4f 53 49 54 49 4f RE_START_POSITIO
1ef0: 4e 3b 20 7d 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 N; }..template<c
1f00: 6c 61 73 73 20 56 41 4c 55 45 2c 20 63 6c 61 73 lass VALUE, clas
1f10: 73 20 41 52 47 5f 56 41 4c 55 45 3e 0d 0a 41 46 s ARG_VALUE>..AF
1f20: 58 5f 49 4e 4c 49 4e 45 20 55 49 4e 54 20 43 49 X_INLINE UINT CI
1f30: 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 2c StringMap<VALUE,
1f40: 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 47 65 74 ARG_VALUE>::Get
1f50: 48 61 73 68 54 61 62 6c 65 53 69 7a 65 28 29 20 HashTableSize()
1f60: 63 6f 6e 73 74 0d 0a 09 7b 20 72 65 74 75 72 6e const...{ return
1f70: 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a m_nHashTableSiz
1f80: 65 3b 20 7d 0d 0a 0d 0a 2f 2f 2f 2f 2f 2f 2f 2f e; }....////////
1f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1fd0: 2f 2f 2f 2f 2f 0d 0a 2f 2f 20 43 49 53 74 72 69 /////..// CIStri
1fe0: 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 ngMap<VALUE, ARG
1ff0: 5f 56 41 4c 55 45 3e 20 6f 75 74 2d 6f 66 2d 6c _VALUE> out-of-l
2000: 69 6e 65 20 66 75 6e 63 74 69 6f 6e 73 0d 0a 0d ine functions...
2010: 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 20 .template<class
2020: 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 47 VALUE, class ARG
2030: 5f 56 41 4c 55 45 3e 0d 0a 43 49 53 74 72 69 6e _VALUE>..CIStrin
2040: 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 5f gMap<VALUE, ARG_
2050: 56 41 4c 55 45 3e 3a 3a 43 49 53 74 72 69 6e 67 VALUE>::CIString
2060: 4d 61 70 28 62 6f 6f 6c 20 62 55 73 65 45 78 74 Map(bool bUseExt
2070: 65 72 6e 61 6c 4b 65 79 73 29 0d 0a 7b 0d 0a 2f ernalKeys)..{../
2080: 2f 09 41 53 53 45 52 54 28 6e 42 6c 6f 63 6b 53 /.ASSERT(nBlockS
2090: 69 7a 65 20 3e 20 30 29 3b 0d 0a 0d 0a 09 6d 5f ize > 0);.....m_
20a0: 70 48 61 73 68 54 61 62 6c 65 20 3d 20 4e 55 4c pHashTable = NUL
20b0: 4c 3b 0d 0a 09 6d 5f 6e 48 61 73 68 54 61 62 6c L;...m_nHashTabl
20c0: 65 53 69 7a 65 20 3d 20 44 45 46 41 55 4c 54 5f eSize = DEFAULT_
20d0: 48 41 53 48 5f 54 41 42 4c 45 5f 53 49 5a 45 3b HASH_TABLE_SIZE;
20e0: 0d 0a 09 6d 5f 6e 43 6f 75 6e 74 20 3d 20 30 3b ...m_nCount = 0;
20f0: 0d 0a 09 6d 5f 70 46 72 65 65 4c 69 73 74 20 3d ...m_pFreeList =
2100: 20 4e 55 4c 4c 3b 0d 0a 09 6d 5f 70 42 6c 6f 63 NULL;...m_pBloc
2110: 6b 73 20 3d 20 4e 55 4c 4c 3b 0d 0a 0d 0a 09 2f ks = NULL;...../
2120: 2f f3 ef f0 e0 e2 eb e5 ed e8 e5 20 f0 e0 e7 ec /.......... ....
2130: e5 f0 ee ec 20 e1 eb ee ea e0 20 ef e5 f0 e5 ed .... ..... .....
2140: e5 f1 e5 ed ee 20 e2 20 49 6e 69 74 48 61 73 68 ..... . InitHash
2150: 54 61 62 6c 65 28 29 0d 0a 09 2f 2f 6d 5f 6e 42 Table()...//m_nB
2160: 6c 6f 63 6b 53 69 7a 65 20 3d 20 44 45 46 41 55 lockSize = DEFAU
2170: 4c 54 5f 42 4c 4f 43 4b 5f 53 49 5a 45 3b 0d 0a LT_BLOCK_SIZE;..
2180: 0d 0a 09 6d 5f 62 55 73 65 45 78 74 65 72 6e 61 ...m_bUseExterna
2190: 6c 4b 65 79 73 20 3d 20 62 55 73 65 45 78 74 65 lKeys = bUseExte
21a0: 72 6e 61 6c 4b 65 79 73 3b 0d 0a 7d 0d 0a 0d 0a rnalKeys;..}....
21b0: 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 20 56 template<class V
21c0: 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 47 5f ALUE, class ARG_
21d0: 56 41 4c 55 45 3e 0d 0a 76 6f 69 64 20 43 49 53 VALUE>..void CIS
21e0: 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 tringMap<VALUE,
21f0: 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 49 6e 69 74 ARG_VALUE>::Init
2200: 48 61 73 68 54 61 62 6c 65 28 55 49 4e 54 20 6e HashTable(UINT n
2210: 65 77 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a ew_nHashTableSiz
2220: 65 29 0d 0a 7b 0d 0a 09 41 53 53 45 52 54 5f 56 e)..{...ASSERT_V
2230: 41 4c 49 44 28 74 68 69 73 29 3b 0d 0a 09 0d 0a ALID(this);.....
2240: 09 2f 2f 20 e2 ee e7 ec ee e6 ed ee 20 f2 ee eb .// ........ ...
2250: fc ea ee 20 f3 e2 e5 eb e8 f7 e5 ed e8 e5 20 e8 ... .......... .
2260: eb e8 20 ea ee f0 f0 e5 ea f2 ed ee e5 20 f3 ec .. .......... ..
2270: e5 ed fc f8 e5 ed e8 e5 20 f0 e0 e7 ec e5 f0 e0 ........ .......
2280: 20 f2 e0 e1 eb e8 f6 fb 0d 0a 09 69 66 20 28 28 ..........if ((
2290: 6e 65 77 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 new_nHashTableSi
22a0: 7a 65 20 3e 20 6d 5f 6e 43 6f 75 6e 74 29 20 7c ze > m_nCount) |
22b0: 7c 20 28 6e 65 77 5f 6e 48 61 73 68 54 61 62 6c | (new_nHashTabl
22c0: 65 53 69 7a 65 20 3e 20 6d 5f 6e 48 61 73 68 54 eSize > m_nHashT
22d0: 61 62 6c 65 53 69 7a 65 29 29 0d 0a 09 7b 0d 0a ableSize))...{..
22e0: 09 09 42 4f 4f 4c 20 62 4e 65 65 64 44 65 6c 65 ..BOOL bNeedDele
22f0: 74 65 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 te = reinterpret
2300: 5f 63 61 73 74 3c 42 4f 4f 4c 3e 28 6d 5f 70 48 _cast<BOOL>(m_pH
2310: 61 73 68 54 61 62 6c 65 29 3b 0d 0a 09 09 0d 0a ashTable);......
2320: 09 09 66 6f 72 20 28 55 49 4e 54 20 62 32 20 3d ..for (UINT b2 =
2330: 20 31 3b 20 62 32 20 3c 20 5f 5f 6d 61 78 28 6e 1; b2 < __max(n
2340: 65 77 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a ew_nHashTableSiz
2350: 65 2c 20 44 45 46 41 55 4c 54 5f 48 41 53 48 5f e, DEFAULT_HASH_
2360: 54 41 42 4c 45 5f 53 49 5a 45 29 3b 20 62 32 20 TABLE_SIZE); b2
2370: 2a 3d 20 32 29 3b 0d 0a 09 09 2f 2f 20 e8 20 e2 *= 2);....// . .
2380: f1 e5 20 e6 e5 20 f5 e5 f8 2d f4 f3 ed ea f6 e8 .. .. ...-......
2390: ff 20 ed e5 f0 e0 e2 ed ee ec e5 f0 ed e0 0d 0a . ..............
23a0: 09 09 6e 65 77 5f 6e 48 61 73 68 54 61 62 6c 65 ..new_nHashTable
23b0: 53 69 7a 65 20 3d 20 62 32 20 2b 20 31 3b 0d 0a Size = b2 + 1;..
23c0: 0d 0a 09 09 43 41 73 73 6f 63 20 2a 2a 6e 65 77 ....CAssoc **new
23d0: 5f 70 48 61 73 68 54 61 62 6c 65 20 3d 20 6e 65 _pHashTable = ne
23e0: 77 20 43 41 73 73 6f 63 2a 20 5b 6e 65 77 5f 6e w CAssoc* [new_n
23f0: 48 61 73 68 54 61 62 6c 65 53 69 7a 65 5d 3b 0d HashTableSize];.
2400: 0a 09 09 6d 65 6d 73 65 74 28 6e 65 77 5f 70 48 ...memset(new_pH
2410: 61 73 68 54 61 62 6c 65 2c 20 4e 55 4c 4c 2c 20 ashTable, NULL,
2420: 73 69 7a 65 6f 66 28 43 41 73 73 6f 63 2a 29 20 sizeof(CAssoc*)
2430: 2a 20 6e 65 77 5f 6e 48 61 73 68 54 61 62 6c 65 * new_nHashTable
2440: 53 69 7a 65 29 3b 0d 0a 09 09 0d 0a 09 09 69 66 Size);........if
2450: 20 28 20 55 49 4e 54 20 6e 43 6f 75 6e 74 20 3d ( UINT nCount =
2460: 20 6d 5f 6e 43 6f 75 6e 74 20 29 0d 0a 09 09 7b m_nCount )....{
2470: 0d 0a 09 09 09 2f 2f 20 e8 e7 ec e5 ed e5 ed e8 .....// ........
2480: e5 20 f0 e0 e7 ec e5 f0 e0 20 e8 20 ef e5 f0 e5 . ....... . ....
2490: ed ee f1 20 e0 f1 f1 ee f6 e8 e0 f6 e8 e9 0d 0a ... ............
24a0: 09 09 09 43 41 73 73 6f 63 20 2a 70 41 73 73 6f ...CAssoc *pAsso
24b0: 63 2c 20 2a 70 41 73 73 6f 63 4e 65 78 74 3b 0d c, *pAssocNext;.
24c0: 0a 09 09 09 0d 0a 09 09 09 66 6f 72 20 28 55 49 .........for (UI
24d0: 4e 54 20 6e 48 61 73 68 20 3d 20 30 3b 20 6e 43 NT nHash = 0; nC
24e0: 6f 75 6e 74 20 26 26 20 28 6e 48 61 73 68 20 3c ount && (nHash <
24f0: 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a m_nHashTableSiz
2500: 65 29 3b 20 2b 2b 6e 48 61 73 68 29 0d 0a 09 09 e); ++nHash)....
2510: 09 7b 0d 0a 09 09 09 09 66 6f 72 20 28 70 41 73 .{......for (pAs
2520: 73 6f 63 20 3d 20 6d 5f 70 48 61 73 68 54 61 62 soc = m_pHashTab
2530: 6c 65 5b 6e 48 61 73 68 5d 3b 20 70 41 73 73 6f le[nHash]; pAsso
2540: 63 3b 20 2d 2d 6e 43 6f 75 6e 74 2c 20 70 41 73 c; --nCount, pAs
2550: 73 6f 63 20 3d 20 70 41 73 73 6f 63 4e 65 78 74 soc = pAssocNext
2560: 29 0d 0a 09 09 09 09 7b 0d 0a 09 09 09 09 09 55 )......{.......U
2570: 49 4e 54 20 6e 4e 65 77 48 61 73 68 20 3d 20 70 INT nNewHash = p
2580: 41 73 73 6f 63 2d 3e 6e 48 61 73 68 56 61 6c 75 Assoc->nHashValu
2590: 65 20 25 20 6e 65 77 5f 6e 48 61 73 68 54 61 62 e % new_nHashTab
25a0: 6c 65 53 69 7a 65 3b 0d 0a 09 09 09 09 09 70 41 leSize;.......pA
25b0: 73 73 6f 63 4e 65 78 74 20 3d 20 70 41 73 73 6f ssocNext = pAsso
25c0: 63 2d 3e 70 4e 65 78 74 3b 0d 0a 09 09 09 09 09 c->pNext;.......
25d0: 0d 0a 09 09 09 09 09 70 41 73 73 6f 63 2d 3e 70 .......pAssoc->p
25e0: 4e 65 78 74 20 3d 20 6e 65 77 5f 70 48 61 73 68 Next = new_pHash
25f0: 54 61 62 6c 65 5b 6e 4e 65 77 48 61 73 68 5d 3b Table[nNewHash];
2600: 0d 0a 09 09 09 09 09 6e 65 77 5f 70 48 61 73 68 .......new_pHash
2610: 54 61 62 6c 65 5b 6e 4e 65 77 48 61 73 68 5d 20 Table[nNewHash]
2620: 3d 20 70 41 73 73 6f 63 3b 0d 0a 09 09 09 09 7d = pAssoc;......}
2630: 0d 0a 09 09 09 7d 0d 0a 09 09 7d 0d 0a 09 09 0d .....}....}.....
2640: 0a 09 09 69 66 20 28 62 4e 65 65 64 44 65 6c 65 ...if (bNeedDele
2650: 74 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 64 65 6c te)....{.....del
2660: 65 74 65 5b 5d 20 6d 5f 70 48 61 73 68 54 61 62 ete[] m_pHashTab
2670: 6c 65 3b 0d 0a 09 09 7d 0d 0a 09 09 6d 5f 70 48 le;....}....m_pH
2680: 61 73 68 54 61 62 6c 65 20 3d 20 6e 65 77 5f 70 ashTable = new_p
2690: 48 61 73 68 54 61 62 6c 65 3b 0d 0a 09 09 6d 5f HashTable;....m_
26a0: 6e 48 61 73 68 54 61 62 6c 65 53 69 7a 65 20 3d nHashTableSize =
26b0: 20 6e 65 77 5f 6e 48 61 73 68 54 61 62 6c 65 53 new_nHashTableS
26c0: 69 7a 65 3b 0d 0a 0d 0a 09 09 2f 2f 20 e2 20 ee ize;......// . .
26d0: e1 f9 e5 ec 20 f1 eb f3 f7 e0 e5 20 e2 eb e8 ff .... ...... ....
26e0: ed e8 e5 20 f0 e0 e7 ec e5 f0 e0 20 e1 eb ee ea ... ....... ....
26f0: e0 20 ed e5 e7 ed e0 f7 e8 f2 e5 eb fc ed ee 0d . ..............
2700: 0a 09 09 6d 5f 6e 42 6c 6f 63 6b 53 69 7a 65 20 ...m_nBlockSize
2710: 3d 20 5f 5f 6d 69 6e 28 44 45 46 41 55 4c 54 5f = __min(DEFAULT_
2720: 4d 41 58 5f 42 4c 4f 43 4b 5f 53 49 5a 45 2c 20 MAX_BLOCK_SIZE,
2730: 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a 65 m_nHashTableSize
2740: 20 2f 20 44 45 46 41 55 4c 54 5f 42 4c 4f 43 4b / DEFAULT_BLOCK
2750: 5f 53 49 5a 45 5f 52 41 54 49 4f 29 3b 0d 0a 09 _SIZE_RATIO);...
2760: 7d 0d 0a 7d 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65 }..}....template
2770: 3c 63 6c 61 73 73 20 56 41 4c 55 45 2c 20 63 6c <class VALUE, cl
2780: 61 73 73 20 41 52 47 5f 56 41 4c 55 45 3e 0d 0a ass ARG_VALUE>..
2790: 76 6f 69 64 20 43 49 53 74 72 69 6e 67 4d 61 70 void CIStringMap
27a0: 3c 56 41 4c 55 45 2c 20 41 52 47 5f 56 41 4c 55 <VALUE, ARG_VALU
27b0: 45 3e 3a 3a 52 65 6d 6f 76 65 41 6c 6c 28 29 0d E>::RemoveAll().
27c0: 0a 7b 0d 0a 09 41 53 53 45 52 54 5f 56 41 4c 49 .{...ASSERT_VALI
27d0: 44 28 74 68 69 73 29 3b 0d 0a 0d 0a 09 69 66 20 D(this);.....if
27e0: 28 6d 5f 70 48 61 73 68 54 61 62 6c 65 20 21 3d (m_pHashTable !=
27f0: 20 4e 55 4c 4c 29 0d 0a 09 7b 0d 0a 09 09 2f 2f NULL)...{....//
2800: 20 64 65 73 74 72 6f 79 20 65 6c 65 6d 65 6e 74 destroy element
2810: 73 20 28 76 61 6c 75 65 73 20 61 6e 64 20 6b 65 s (values and ke
2820: 79 73 29 0d 0a 09 09 66 6f 72 20 28 55 49 4e 54 ys)....for (UINT
2830: 20 6e 48 61 73 68 20 3d 20 30 3b 20 6e 48 61 73 nHash = 0; nHas
2840: 68 20 3c 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 h < m_nHashTable
2850: 53 69 7a 65 3b 20 2b 2b 6e 48 61 73 68 29 0d 0a Size; ++nHash)..
2860: 09 09 7b 0d 0a 09 09 09 43 41 73 73 6f 63 2a 20 ..{.....CAssoc*
2870: 70 41 73 73 6f 63 3b 0d 0a 09 09 09 66 6f 72 20 pAssoc;.....for
2880: 28 70 41 73 73 6f 63 20 3d 20 6d 5f 70 48 61 73 (pAssoc = m_pHas
2890: 68 54 61 62 6c 65 5b 6e 48 61 73 68 5d 3b 20 70 hTable[nHash]; p
28a0: 41 73 73 6f 63 20 21 3d 20 4e 55 4c 4c 3b 0d 0a Assoc != NULL;..
28b0: 09 09 09 20 20 70 41 73 73 6f 63 20 3d 20 70 41 ... pAssoc = pA
28c0: 73 73 6f 63 2d 3e 70 4e 65 78 74 29 0d 0a 09 09 ssoc->pNext)....
28d0: 09 7b 0d 0a 09 09 09 09 44 65 73 74 72 75 63 74 .{......Destruct
28e0: 45 6c 65 6d 65 6e 74 73 3c 56 41 4c 55 45 3e 28 Elements<VALUE>(
28f0: 26 70 41 73 73 6f 63 2d 3e 76 61 6c 75 65 2c 20 &pAssoc->value,
2900: 31 29 3b 0d 0a 09 09 09 09 69 66 20 28 20 21 6d 1);......if ( !m
2910: 5f 62 55 73 65 45 78 74 65 72 6e 61 6c 4b 65 79 _bUseExternalKey
2920: 73 20 29 0d 0a 09 09 09 09 7b 0d 0a 09 09 09 09 s )......{......
2930: 09 66 72 65 65 28 20 70 41 73 73 6f 63 2d 3e 6b .free( pAssoc->k
2940: 65 79 20 29 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 ey );......}....
2950: 09 7d 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 0d 0a 09 .}....}...}.....
2960: 2f 2f 20 66 72 65 65 20 68 61 73 68 20 74 61 62 // free hash tab
2970: 6c 65 0d 0a 09 64 65 6c 65 74 65 5b 5d 20 6d 5f le...delete[] m_
2980: 70 48 61 73 68 54 61 62 6c 65 3b 0d 0a 09 6d 5f pHashTable;...m_
2990: 70 48 61 73 68 54 61 62 6c 65 20 3d 20 4e 55 4c pHashTable = NUL
29a0: 4c 3b 0d 0a 09 6d 5f 6e 48 61 73 68 54 61 62 6c L;...m_nHashTabl
29b0: 65 53 69 7a 65 20 3d 20 44 45 46 41 55 4c 54 5f eSize = DEFAULT_
29c0: 48 41 53 48 5f 54 41 42 4c 45 5f 53 49 5a 45 3b HASH_TABLE_SIZE;
29d0: 0d 0a 0d 0a 09 6d 5f 6e 43 6f 75 6e 74 20 3d 20 .....m_nCount =
29e0: 30 3b 0d 0a 09 6d 5f 70 46 72 65 65 4c 69 73 74 0;...m_pFreeList
29f0: 20 3d 20 4e 55 4c 4c 3b 0d 0a 09 6d 5f 70 42 6c = NULL;...m_pBl
2a00: 6f 63 6b 73 2d 3e 46 72 65 65 44 61 74 61 43 68 ocks->FreeDataCh
2a10: 61 69 6e 28 29 3b 0d 0a 09 6d 5f 70 42 6c 6f 63 ain();...m_pBloc
2a20: 6b 73 20 3d 20 4e 55 4c 4c 3b 0d 0a 7d 0d 0a 0d ks = NULL;..}...
2a30: 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 20 .template<class
2a40: 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 47 VALUE, class ARG
2a50: 5f 56 41 4c 55 45 3e 0d 0a 43 49 53 74 72 69 6e _VALUE>..CIStrin
2a60: 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 5f gMap<VALUE, ARG_
2a70: 56 41 4c 55 45 3e 3a 3a 7e 43 49 53 74 72 69 6e VALUE>::~CIStrin
2a80: 67 4d 61 70 28 29 0d 0a 7b 0d 0a 09 52 65 6d 6f gMap()..{...Remo
2a90: 76 65 41 6c 6c 28 29 3b 0d 0a 09 41 53 53 45 52 veAll();...ASSER
2aa0: 54 28 6d 5f 6e 43 6f 75 6e 74 20 3d 3d 20 30 29 T(m_nCount == 0)
2ab0: 3b 0d 0a 7d 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65 ;..}....template
2ac0: 3c 63 6c 61 73 73 20 56 41 4c 55 45 2c 20 63 6c <class VALUE, cl
2ad0: 61 73 73 20 41 52 47 5f 56 41 4c 55 45 3e 0d 0a ass ARG_VALUE>..
2ae0: 74 79 70 65 6e 61 6d 65 20 43 49 53 74 72 69 6e typename CIStrin
2af0: 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 5f gMap<VALUE, ARG_
2b00: 56 41 4c 55 45 3e 3a 3a 43 41 73 73 6f 63 2a 0d VALUE>::CAssoc*.
2b10: 0a 43 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c .CIStringMap<VAL
2b20: 55 45 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a UE, ARG_VALUE>::
2b30: 4e 65 77 41 73 73 6f 63 28 73 69 7a 65 5f 74 20 NewAssoc(size_t
2b40: 6e 4b 65 79 53 69 7a 65 29 0d 0a 7b 0d 0a 09 69 nKeySize)..{...i
2b50: 66 20 28 6d 5f 70 46 72 65 65 4c 69 73 74 20 3d f (m_pFreeList =
2b60: 3d 20 4e 55 4c 4c 29 0d 0a 09 7b 0d 0a 09 09 2f = NULL)...{..../
2b70: 2f 20 61 64 64 20 61 6e 6f 74 68 65 72 20 62 6c / add another bl
2b80: 6f 63 6b 0d 0a 09 09 43 50 6c 65 78 2a 20 6e 65 ock....CPlex* ne
2b90: 77 42 6c 6f 63 6b 20 3d 20 43 50 6c 65 78 3a 3a wBlock = CPlex::
2ba0: 43 72 65 61 74 65 28 6d 5f 70 42 6c 6f 63 6b 73 Create(m_pBlocks
2bb0: 2c 20 6d 5f 6e 42 6c 6f 63 6b 53 69 7a 65 2c 20 , m_nBlockSize,
2bc0: 73 69 7a 65 6f 66 28 43 49 53 74 72 69 6e 67 4d sizeof(CIStringM
2bd0: 61 70 3a 3a 43 41 73 73 6f 63 29 29 3b 0d 0a 09 ap::CAssoc));...
2be0: 09 2f 2f 20 63 68 61 69 6e 20 74 68 65 6d 20 69 .// chain them i
2bf0: 6e 74 6f 20 66 72 65 65 20 6c 69 73 74 0d 0a 09 nto free list...
2c00: 09 43 49 53 74 72 69 6e 67 4d 61 70 3a 3a 43 41 .CIStringMap::CA
2c10: 73 73 6f 63 2a 20 70 41 73 73 6f 63 20 3d 20 28 ssoc* pAssoc = (
2c20: 43 49 53 74 72 69 6e 67 4d 61 70 3a 3a 43 41 73 CIStringMap::CAs
2c30: 73 6f 63 2a 29 20 6e 65 77 42 6c 6f 63 6b 2d 3e soc*) newBlock->
2c40: 64 61 74 61 28 29 3b 0d 0a 09 09 2f 2f 20 66 72 data();....// fr
2c50: 65 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 ee in reverse or
2c60: 64 65 72 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 der to make it e
2c70: 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 0d 0a asier to debug..
2c80: 09 09 70 41 73 73 6f 63 20 2b 3d 20 6d 5f 6e 42 ..pAssoc += m_nB
2c90: 6c 6f 63 6b 53 69 7a 65 20 2d 20 31 3b 0d 0a 09 lockSize - 1;...
2ca0: 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 6d 5f .for (int i = m_
2cb0: 6e 42 6c 6f 63 6b 53 69 7a 65 2d 31 3b 20 69 20 nBlockSize-1; i
2cc0: 3e 3d 20 30 3b 20 2d 2d 69 2c 20 2d 2d 70 41 73 >= 0; --i, --pAs
2cd0: 73 6f 63 29 0d 0a 09 09 7b 0d 0a 09 09 09 70 41 soc)....{.....pA
2ce0: 73 73 6f 63 2d 3e 70 4e 65 78 74 20 3d 20 6d 5f ssoc->pNext = m_
2cf0: 70 46 72 65 65 4c 69 73 74 3b 0d 0a 09 09 09 6d pFreeList;.....m
2d00: 5f 70 46 72 65 65 4c 69 73 74 20 3d 20 70 41 73 _pFreeList = pAs
2d10: 73 6f 63 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 09 soc;....}...}...
2d20: 41 53 53 45 52 54 28 6d 5f 70 46 72 65 65 4c 69 ASSERT(m_pFreeLi
2d30: 73 74 20 21 3d 20 4e 55 4c 4c 29 3b 20 20 2f 2f st != NULL); //
2d40: 20 77 65 20 6d 75 73 74 20 68 61 76 65 20 73 6f we must have so
2d50: 6d 65 74 68 69 6e 67 0d 0a 0d 0a 09 43 49 53 74 mething.....CISt
2d60: 72 69 6e 67 4d 61 70 3a 3a 43 41 73 73 6f 63 2a ringMap::CAssoc*
2d70: 20 70 41 73 73 6f 63 20 3d 20 6d 5f 70 46 72 65 pAssoc = m_pFre
2d80: 65 4c 69 73 74 3b 0d 0a 09 6d 5f 70 46 72 65 65 eList;...m_pFree
2d90: 4c 69 73 74 20 3d 20 6d 5f 70 46 72 65 65 4c 69 List = m_pFreeLi
2da0: 73 74 2d 3e 70 4e 65 78 74 3b 0d 0a 09 2b 2b 6d st->pNext;...++m
2db0: 5f 6e 43 6f 75 6e 74 3b 0d 0a 09 41 53 53 45 52 _nCount;...ASSER
2dc0: 54 28 6d 5f 6e 43 6f 75 6e 74 20 3e 20 30 29 3b T(m_nCount > 0);
2dd0: 20 20 2f 2f 20 6d 61 6b 65 20 73 75 72 65 20 77 // make sure w
2de0: 65 20 64 6f 6e 27 74 20 6f 76 65 72 66 6c 6f 77 e don't overflow
2df0: 0d 0a 09 69 66 20 28 20 21 6d 5f 62 55 73 65 45 ...if ( !m_bUseE
2e00: 78 74 65 72 6e 61 6c 4b 65 79 73 20 29 0d 0a 09 xternalKeys )...
2e10: 7b 0d 0a 09 09 70 41 73 73 6f 63 2d 3e 6b 65 79 {....pAssoc->key
2e20: 20 3d 20 73 74 61 74 69 63 5f 63 61 73 74 3c 4c = static_cast<L
2e30: 50 53 54 52 3e 28 6d 61 6c 6c 6f 63 28 20 6e 4b PSTR>(malloc( nK
2e40: 65 79 53 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28 eySize * sizeof(
2e50: 63 68 61 72 29 20 29 29 3b 0d 0a 09 7d 0d 0a 09 char) ));...}...
2e60: 43 6f 6e 73 74 72 75 63 74 45 6c 65 6d 65 6e 74 ConstructElement
2e70: 73 3c 56 41 4c 55 45 3e 28 26 70 41 73 73 6f 63 s<VALUE>(&pAssoc
2e80: 2d 3e 76 61 6c 75 65 2c 20 31 29 3b 20 20 20 2f ->value, 1); /
2e90: 2f 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 72 / special constr
2ea0: 75 63 74 20 76 61 6c 75 65 73 0d 0a 09 72 65 74 uct values...ret
2eb0: 75 72 6e 20 70 41 73 73 6f 63 3b 0d 0a 7d 0d 0a urn pAssoc;..}..
2ec0: 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 ..template<class
2ed0: 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 VALUE, class AR
2ee0: 47 5f 56 41 4c 55 45 3e 0d 0a 76 6f 69 64 20 43 G_VALUE>..void C
2ef0: 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 IStringMap<VALUE
2f00: 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 46 72 , ARG_VALUE>::Fr
2f10: 65 65 41 73 73 6f 63 28 74 79 70 65 6e 61 6d 65 eeAssoc(typename
2f20: 20 43 49 53 74 72 69 6e 67 4d 61 70 3a 3a 43 41 CIStringMap::CA
2f30: 73 73 6f 63 2a 20 70 41 73 73 6f 63 29 0d 0a 7b ssoc* pAssoc)..{
2f40: 0d 0a 09 44 65 73 74 72 75 63 74 45 6c 65 6d 65 ...DestructEleme
2f50: 6e 74 73 3c 56 41 4c 55 45 3e 28 26 70 41 73 73 nts<VALUE>(&pAss
2f60: 6f 63 2d 3e 76 61 6c 75 65 2c 20 31 29 3b 0d 0a oc->value, 1);..
2f70: 09 69 66 20 28 20 21 6d 5f 62 55 73 65 45 78 74 .if ( !m_bUseExt
2f80: 65 72 6e 61 6c 4b 65 79 73 20 29 0d 0a 09 7b 0d ernalKeys )...{.
2f90: 0a 09 09 66 72 65 65 28 20 28 76 6f 69 64 20 2a ...free( (void *
2fa0: 29 70 41 73 73 6f 63 2d 3e 6b 65 79 20 29 3b 0d )pAssoc->key );.
2fb0: 0a 09 7d 0d 0a 09 70 41 73 73 6f 63 2d 3e 70 4e ..}...pAssoc->pN
2fc0: 65 78 74 20 3d 20 6d 5f 70 46 72 65 65 4c 69 73 ext = m_pFreeLis
2fd0: 74 3b 0d 0a 09 6d 5f 70 46 72 65 65 4c 69 73 74 t;...m_pFreeList
2fe0: 20 3d 20 70 41 73 73 6f 63 3b 0d 0a 09 2d 2d 6d = pAssoc;...--m
2ff0: 5f 6e 43 6f 75 6e 74 3b 0d 0a 09 41 53 53 45 52 _nCount;...ASSER
3000: 54 28 6d 5f 6e 43 6f 75 6e 74 20 3e 3d 20 30 29 T(m_nCount >= 0)
3010: 3b 20 20 2f 2f 20 6d 61 6b 65 20 73 75 72 65 20 ; // make sure
3020: 77 65 20 64 6f 6e 27 74 20 75 6e 64 65 72 66 6c we don't underfl
3030: 6f 77 0d 0a 7d 0d 0a 0d 0a 74 65 6d 70 6c 61 74 ow..}....templat
3040: 65 3c 63 6c 61 73 73 20 56 41 4c 55 45 2c 20 63 e<class VALUE, c
3050: 6c 61 73 73 20 41 52 47 5f 56 41 4c 55 45 3e 0d lass ARG_VALUE>.
3060: 0a 74 79 70 65 6e 61 6d 65 20 43 49 53 74 72 69 .typename CIStri
3070: 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 ngMap<VALUE, ARG
3080: 5f 56 41 4c 55 45 3e 3a 3a 43 41 73 73 6f 63 2a _VALUE>::CAssoc*
3090: 0d 0a 43 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 ..CIStringMap<VA
30a0: 4c 55 45 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a LUE, ARG_VALUE>:
30b0: 3a 47 65 74 41 73 73 6f 63 41 74 28 4c 50 43 53 :GetAssocAt(LPCS
30c0: 54 52 20 6b 65 79 2c 20 55 49 4e 54 26 20 6e 46 TR key, UINT& nF
30d0: 75 6c 6c 48 61 73 68 29 20 63 6f 6e 73 74 0d 0a ullHash) const..
30e0: 2f 2f 20 66 69 6e 64 20 61 73 73 6f 63 69 61 74 // find associat
30f0: 69 6f 6e 20 28 6f 72 20 72 65 74 75 72 6e 20 4e ion (or return N
3100: 55 4c 4c 29 0d 0a 7b 0d 0a 09 6e 46 75 6c 6c 48 ULL)..{...nFullH
3110: 61 73 68 20 3d 20 48 61 73 68 4b 65 79 28 6b 65 ash = HashKey(ke
3120: 79 29 3b 0d 0a 09 55 49 4e 54 20 6e 48 61 73 68 y);...UINT nHash
3130: 20 3d 20 6e 46 75 6c 6c 48 61 73 68 20 25 20 6d = nFullHash % m
3140: 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a 65 3b _nHashTableSize;
3150: 0d 0a 0d 0a 09 69 66 20 28 6d 5f 70 48 61 73 68 .....if (m_pHash
3160: 54 61 62 6c 65 20 3d 3d 20 4e 55 4c 4c 29 0d 0a Table == NULL)..
3170: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0d 0a ..return NULL;..
3180: 0d 0a 09 2f 2f 20 73 65 65 20 69 66 20 69 74 20 ...// see if it
3190: 65 78 69 73 74 73 0d 0a 09 43 41 73 73 6f 63 2a exists...CAssoc*
31a0: 20 70 41 73 73 6f 63 3b 0d 0a 09 66 6f 72 20 28 pAssoc;...for (
31b0: 70 41 73 73 6f 63 20 3d 20 6d 5f 70 48 61 73 68 pAssoc = m_pHash
31c0: 54 61 62 6c 65 5b 6e 48 61 73 68 5d 3b 20 70 41 Table[nHash]; pA
31d0: 73 73 6f 63 20 21 3d 20 4e 55 4c 4c 3b 20 70 41 ssoc != NULL; pA
31e0: 73 73 6f 63 20 3d 20 70 41 73 73 6f 63 2d 3e 70 ssoc = pAssoc->p
31f0: 4e 65 78 74 29 0d 0a 09 7b 0d 0a 09 09 69 66 20 Next)...{....if
3200: 28 70 41 73 73 6f 63 2d 3e 6e 48 61 73 68 56 61 (pAssoc->nHashVa
3210: 6c 75 65 20 3d 3d 20 6e 46 75 6c 6c 48 61 73 68 lue == nFullHash
3220: 29 0d 0a 09 09 7b 0d 0a 09 09 09 69 66 20 28 21 )....{.....if (!
3230: 43 6f 6d 70 61 72 65 28 70 41 73 73 6f 63 2d 3e Compare(pAssoc->
3240: 6b 65 79 2c 20 6b 65 79 29 29 0d 0a 09 09 09 09 key, key))......
3250: 72 65 74 75 72 6e 20 70 41 73 73 6f 63 3b 0d 0a return pAssoc;..
3260: 09 09 7d 0d 0a 09 7d 0d 0a 09 72 65 74 75 72 6e ..}...}...return
3270: 20 4e 55 4c 4c 3b 0d 0a 7d 0d 0a 0d 0a 74 65 6d NULL;..}....tem
3280: 70 6c 61 74 65 3c 63 6c 61 73 73 20 56 41 4c 55 plate<class VALU
3290: 45 2c 20 63 6c 61 73 73 20 41 52 47 5f 56 41 4c E, class ARG_VAL
32a0: 55 45 3e 0d 0a 42 4f 4f 4c 20 43 49 53 74 72 69 UE>..BOOL CIStri
32b0: 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 ngMap<VALUE, ARG
32c0: 5f 56 41 4c 55 45 3e 3a 3a 4c 6f 6f 6b 75 70 28 _VALUE>::Lookup(
32d0: 4c 50 43 53 54 52 20 6b 65 79 2c 20 56 41 4c 55 LPCSTR key, VALU
32e0: 45 26 20 72 56 61 6c 75 65 29 20 63 6f 6e 73 74 E& rValue) const
32f0: 0d 0a 7b 0d 0a 09 41 53 53 45 52 54 5f 56 41 4c ..{...ASSERT_VAL
3300: 49 44 28 74 68 69 73 29 3b 0d 0a 0d 0a 09 55 49 ID(this);.....UI
3310: 4e 54 20 6e 46 75 6c 6c 48 61 73 68 3b 0d 0a 09 NT nFullHash;...
3320: 43 41 73 73 6f 63 2a 20 70 41 73 73 6f 63 20 3d CAssoc* pAssoc =
3330: 20 47 65 74 41 73 73 6f 63 41 74 28 6b 65 79 2c GetAssocAt(key,
3340: 20 6e 46 75 6c 6c 48 61 73 68 29 3b 0d 0a 09 69 nFullHash);...i
3350: 66 20 28 70 41 73 73 6f 63 20 3d 3d 20 4e 55 4c f (pAssoc == NUL
3360: 4c 29 0d 0a 09 09 72 65 74 75 72 6e 20 46 41 4c L)....return FAL
3370: 53 45 3b 20 20 2f 2f 20 6e 6f 74 20 69 6e 20 6d SE; // not in m
3380: 61 70 0d 0a 0d 0a 09 72 56 61 6c 75 65 20 3d 20 ap.....rValue =
3390: 70 41 73 73 6f 63 2d 3e 76 61 6c 75 65 3b 0d 0a pAssoc->value;..
33a0: 09 72 65 74 75 72 6e 20 54 52 55 45 3b 0d 0a 7d .return TRUE;..}
33b0: 0d 0a 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 ....template<cla
33c0: 73 73 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 ss VALUE, class
33d0: 41 52 47 5f 56 41 4c 55 45 3e 0d 0a 42 4f 4f 4c ARG_VALUE>..BOOL
33e0: 20 43 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c CIStringMap<VAL
33f0: 55 45 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a UE, ARG_VALUE>::
3400: 4c 6f 6f 6b 75 70 4b 65 79 28 4c 50 43 53 54 52 LookupKey(LPCSTR
3410: 20 6b 65 79 2c 20 4c 50 43 53 54 52 26 20 72 4b key, LPCSTR& rK
3420: 65 79 29 20 63 6f 6e 73 74 0d 0a 7b 0d 0a 09 41 ey) const..{...A
3430: 53 53 45 52 54 5f 56 41 4c 49 44 28 74 68 69 73 SSERT_VALID(this
3440: 29 3b 0d 0a 0d 0a 09 55 49 4e 54 20 6e 46 75 6c );.....UINT nFul
3450: 6c 48 61 73 68 3b 0d 0a 09 43 41 73 73 6f 63 2a lHash;...CAssoc*
3460: 20 70 41 73 73 6f 63 20 3d 20 47 65 74 41 73 73 pAssoc = GetAss
3470: 6f 63 41 74 28 6b 65 79 2c 20 6e 46 75 6c 6c 48 ocAt(key, nFullH
3480: 61 73 68 29 3b 0d 0a 09 69 66 20 28 70 41 73 73 ash);...if (pAss
3490: 6f 63 20 3d 3d 20 4e 55 4c 4c 29 0d 0a 09 09 72 oc == NULL)....r
34a0: 65 74 75 72 6e 20 46 41 4c 53 45 3b 20 20 2f 2f eturn FALSE; //
34b0: 20 6e 6f 74 20 69 6e 20 6d 61 70 0d 0a 0d 0a 09 not in map.....
34c0: 72 4b 65 79 20 3d 20 70 41 73 73 6f 63 2d 3e 6b rKey = pAssoc->k
34d0: 65 79 3b 0d 0a 09 72 65 74 75 72 6e 20 54 52 55 ey;...return TRU
34e0: 45 3b 0d 0a 7d 0d 0a 0d 0a 74 65 6d 70 6c 61 74 E;..}....templat
34f0: 65 3c 63 6c 61 73 73 20 56 41 4c 55 45 2c 20 63 e<class VALUE, c
3500: 6c 61 73 73 20 41 52 47 5f 56 41 4c 55 45 3e 0d lass ARG_VALUE>.
3510: 0a 56 41 4c 55 45 26 20 43 49 53 74 72 69 6e 67 .VALUE& CIString
3520: 4d 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 5f 56 Map<VALUE, ARG_V
3530: 41 4c 55 45 3e 3a 3a 6f 70 65 72 61 74 6f 72 5b ALUE>::operator[
3540: 5d 28 4c 50 43 53 54 52 20 6b 65 79 29 0d 0a 7b ](LPCSTR key)..{
3550: 0d 0a 09 41 53 53 45 52 54 5f 56 41 4c 49 44 28 ...ASSERT_VALID(
3560: 74 68 69 73 29 3b 0d 0a 0d 0a 09 55 49 4e 54 20 this);.....UINT
3570: 6e 46 75 6c 6c 48 61 73 68 3b 0d 0a 09 43 41 73 nFullHash;...CAs
3580: 73 6f 63 2a 20 70 41 73 73 6f 63 3b 0d 0a 09 69 soc* pAssoc;...i
3590: 66 20 28 28 70 41 73 73 6f 63 20 3d 20 47 65 74 f ((pAssoc = Get
35a0: 41 73 73 6f 63 41 74 28 6b 65 79 2c 20 6e 46 75 AssocAt(key, nFu
35b0: 6c 6c 48 61 73 68 29 29 20 3d 3d 20 4e 55 4c 4c llHash)) == NULL
35c0: 29 0d 0a 09 7b 0d 0a 09 09 69 66 20 28 20 21 6d )...{....if ( !m
35d0: 5f 70 48 61 73 68 54 61 62 6c 65 20 29 0d 0a 09 _pHashTable )...
35e0: 09 7b 0d 0a 09 09 09 49 6e 69 74 48 61 73 68 54 .{.....InitHashT
35f0: 61 62 6c 65 28 20 6d 5f 6e 48 61 73 68 54 61 62 able( m_nHashTab
3600: 6c 65 53 69 7a 65 20 29 3b 0d 0a 09 09 7d 0d 0a leSize );....}..
3610: 09 09 65 6c 73 65 20 69 66 20 28 20 6d 5f 6e 43 ..else if ( m_nC
3620: 6f 75 6e 74 20 2a 20 32 20 3e 3d 20 6d 5f 6e 48 ount * 2 >= m_nH
3630: 61 73 68 54 61 62 6c 65 53 69 7a 65 20 29 0d 0a ashTableSize )..
3640: 09 09 7b 0d 0a 09 09 09 2f 2f 20 f3 e2 e5 eb e8 ..{.....// .....
3650: f7 e5 ed e8 e5 20 f0 e0 e7 ec e5 f0 e0 20 68 61 ..... ....... ha
3660: 73 68 20 74 61 62 6c 65 0d 0a 09 09 09 49 6e 69 sh table.....Ini
3670: 74 48 61 73 68 54 61 62 6c 65 28 20 6d 5f 6e 48 tHashTable( m_nH
3680: 61 73 68 54 61 62 6c 65 53 69 7a 65 20 2a 20 32 ashTableSize * 2
3690: 20 29 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 55 49 );....}......UI
36a0: 4e 54 20 6e 48 61 73 68 20 3d 20 6e 46 75 6c 6c NT nHash = nFull
36b0: 48 61 73 68 20 25 20 6d 5f 6e 48 61 73 68 54 61 Hash % m_nHashTa
36c0: 62 6c 65 53 69 7a 65 3b 0d 0a 0d 0a 09 09 2f 2f bleSize;......//
36d0: 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 it doesn't exis
36e0: 74 2c 20 61 64 64 20 61 20 6e 65 77 20 41 73 73 t, add a new Ass
36f0: 6f 63 69 61 74 69 6f 6e 0d 0a 09 09 70 41 73 73 ociation....pAss
3700: 6f 63 20 3d 20 4e 65 77 41 73 73 6f 63 28 73 74 oc = NewAssoc(st
3710: 72 6c 65 6e 28 6b 65 79 29 20 2b 20 31 29 3b 0d rlen(key) + 1);.
3720: 0a 09 09 70 41 73 73 6f 63 2d 3e 6e 48 61 73 68 ...pAssoc->nHash
3730: 56 61 6c 75 65 20 3d 20 6e 46 75 6c 6c 48 61 73 Value = nFullHas
3740: 68 3b 0d 0a 0d 0a 09 09 69 66 20 28 20 21 6d 5f h;......if ( !m_
3750: 62 55 73 65 45 78 74 65 72 6e 61 6c 4b 65 79 73 bUseExternalKeys
3760: 20 29 0d 0a 09 09 7b 0d 0a 09 09 09 73 74 72 63 )....{.....strc
3770: 70 79 20 28 70 41 73 73 6f 63 2d 3e 6b 65 79 2c py (pAssoc->key,
3780: 20 6b 65 79 29 3b 0d 0a 09 09 7d 0d 0a 09 09 65 key);....}....e
3790: 6c 73 65 0d 0a 09 09 7b 0d 0a 09 09 09 2f 2f 20 lse....{.....//
37a0: e8 f1 ef ee eb fc e7 f3 e5 ec 20 ea eb fe f7 20 .......... ....
37b0: ef ee 20 ec e5 f1 f2 f3 20 f0 e0 f1 ef ee eb ee .. ..... .......
37c0: e6 e5 ed e8 ff 0d 0a 09 09 09 2f 2f 20 e2 ed e8 ..........// ...
37d0: ec e0 ed e8 e5 21 20 ee ed 20 ed e5 20 e4 ee eb .....! .. .. ...
37e0: e6 e5 ed 20 e8 f1 f7 e5 e7 ed f3 f2 fc 20 e8 eb ... ......... ..
37f0: e8 20 e8 e7 ec e5 ed e8 f2 fc f1 ff 0d 0a 09 09 . ..............
3800: 09 2f 2f 20 e4 ee 20 ee f1 e2 ee e1 ee e6 e4 e5 .// .. .........
3810: ed e8 ff 20 e0 f1 f1 ee f6 e8 e0 f6 e8 e8 0d 0a ... ............
3820: 09 09 09 70 41 73 73 6f 63 2d 3e 6b 65 79 20 3d ...pAssoc->key =
3830: 20 63 6f 6e 73 74 5f 63 61 73 74 3c 4c 50 53 54 const_cast<LPST
3840: 52 3e 28 6b 65 79 29 3b 0d 0a 09 09 7d 0d 0a 09 R>(key);....}...
3850: 09 2f 2f 20 27 70 41 73 73 6f 63 2d 3e 76 61 6c .// 'pAssoc->val
3860: 75 65 27 20 69 73 20 61 20 63 6f 6e 73 74 72 75 ue' is a constru
3870: 63 74 65 64 20 6f 62 6a 65 63 74 2c 20 6e 6f 74 cted object, not
3880: 68 69 6e 67 20 6d 6f 72 65 0d 0a 0d 0a 09 09 2f hing more....../
3890: 2f 20 70 75 74 20 69 6e 74 6f 20 68 61 73 68 20 / put into hash
38a0: 74 61 62 6c 65 0d 0a 09 09 70 41 73 73 6f 63 2d table....pAssoc-
38b0: 3e 70 4e 65 78 74 20 3d 20 6d 5f 70 48 61 73 68 >pNext = m_pHash
38c0: 54 61 62 6c 65 5b 6e 48 61 73 68 5d 3b 0d 0a 09 Table[nHash];...
38d0: 09 6d 5f 70 48 61 73 68 54 61 62 6c 65 5b 6e 48 .m_pHashTable[nH
38e0: 61 73 68 5d 20 3d 20 70 41 73 73 6f 63 3b 0d 0a ash] = pAssoc;..
38f0: 09 7d 0d 0a 09 72 65 74 75 72 6e 20 70 41 73 73 .}...return pAss
3900: 6f 63 2d 3e 76 61 6c 75 65 3b 20 20 2f 2f 20 72 oc->value; // r
3910: 65 74 75 72 6e 20 6e 65 77 20 72 65 66 65 72 65 eturn new refere
3920: 6e 63 65 0d 0a 7d 0d 0a 0d 0a 74 65 6d 70 6c 61 nce..}....templa
3930: 74 65 3c 63 6c 61 73 73 20 56 41 4c 55 45 2c 20 te<class VALUE,
3940: 63 6c 61 73 73 20 41 52 47 5f 56 41 4c 55 45 3e class ARG_VALUE>
3950: 0d 0a 42 4f 4f 4c 20 43 49 53 74 72 69 6e 67 4d ..BOOL CIStringM
3960: 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 5f 56 41 ap<VALUE, ARG_VA
3970: 4c 55 45 3e 3a 3a 52 65 6d 6f 76 65 4b 65 79 28 LUE>::RemoveKey(
3980: 4c 50 43 53 54 52 20 6b 65 79 29 0d 0a 2f 2f 20 LPCSTR key)..//
3990: 72 65 6d 6f 76 65 20 6b 65 79 20 2d 20 72 65 74 remove key - ret
39a0: 75 72 6e 20 54 52 55 45 20 69 66 20 72 65 6d 6f urn TRUE if remo
39b0: 76 65 64 0d 0a 7b 0d 0a 09 41 53 53 45 52 54 5f ved..{...ASSERT_
39c0: 56 41 4c 49 44 28 74 68 69 73 29 3b 0d 0a 0d 0a VALID(this);....
39d0: 09 69 66 20 28 6d 5f 70 48 61 73 68 54 61 62 6c .if (m_pHashTabl
39e0: 65 20 3d 3d 20 4e 55 4c 4c 29 0d 0a 09 09 72 65 e == NULL)....re
39f0: 74 75 72 6e 20 46 41 4c 53 45 3b 20 20 2f 2f 20 turn FALSE; //
3a00: 6e 6f 74 68 69 6e 67 20 69 6e 20 74 68 65 20 74 nothing in the t
3a10: 61 62 6c 65 0d 0a 0d 0a 09 55 49 4e 54 20 6e 46 able.....UINT nF
3a20: 75 6c 6c 48 61 73 68 20 3d 20 48 61 73 68 4b 65 ullHash = HashKe
3a30: 79 28 6b 65 79 29 3b 0d 0a 09 55 49 4e 54 20 6e y(key);...UINT n
3a40: 48 61 73 68 20 3d 20 6e 46 75 6c 6c 48 61 73 68 Hash = nFullHash
3a50: 20 25 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 % m_nHashTableS
3a60: 69 7a 65 3b 0d 0a 09 43 41 73 73 6f 63 2a 2a 20 ize;...CAssoc**
3a70: 70 70 41 73 73 6f 63 50 72 65 76 20 3d 20 26 6d ppAssocPrev = &m
3a80: 5f 70 48 61 73 68 54 61 62 6c 65 5b 6e 48 61 73 _pHashTable[nHas
3a90: 68 5d 3b 0d 0a 0d 0a 09 43 41 73 73 6f 63 2a 20 h];.....CAssoc*
3aa0: 70 41 73 73 6f 63 3b 0d 0a 09 66 6f 72 20 28 70 pAssoc;...for (p
3ab0: 41 73 73 6f 63 20 3d 20 2a 70 70 41 73 73 6f 63 Assoc = *ppAssoc
3ac0: 50 72 65 76 3b 20 70 41 73 73 6f 63 20 21 3d 20 Prev; pAssoc !=
3ad0: 4e 55 4c 4c 3b 20 70 41 73 73 6f 63 20 3d 20 70 NULL; pAssoc = p
3ae0: 41 73 73 6f 63 2d 3e 70 4e 65 78 74 29 0d 0a 09 Assoc->pNext)...
3af0: 7b 0d 0a 09 09 69 66 20 28 70 41 73 73 6f 63 2d {....if (pAssoc-
3b00: 3e 6e 48 61 73 68 56 61 6c 75 65 20 3d 3d 20 6e >nHashValue == n
3b10: 46 75 6c 6c 48 61 73 68 29 0d 0a 09 09 7b 0d 0a FullHash)....{..
3b20: 09 09 09 69 66 20 28 21 43 6f 6d 70 61 72 65 28 ...if (!Compare(
3b30: 70 41 73 73 6f 63 2d 3e 6b 65 79 2c 20 6b 65 79 pAssoc->key, key
3b40: 29 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 2f 2f )).....{......//
3b50: 20 72 65 6d 6f 76 65 20 69 74 0d 0a 09 09 09 09 remove it......
3b60: 2a 70 70 41 73 73 6f 63 50 72 65 76 20 3d 20 70 *ppAssocPrev = p
3b70: 41 73 73 6f 63 2d 3e 70 4e 65 78 74 3b 20 20 2f Assoc->pNext; /
3b80: 2f 20 72 65 6d 6f 76 65 20 66 72 6f 6d 20 6c 69 / remove from li
3b90: 73 74 0d 0a 09 09 09 09 46 72 65 65 41 73 73 6f st......FreeAsso
3ba0: 63 28 70 41 73 73 6f 63 29 3b 0d 0a 0d 0a 09 09 c(pAssoc);......
3bb0: 09 09 2f 2f 20 f3 ec e5 ed fc f8 e5 ed e8 e5 20 ..// ..........
3bc0: f0 e0 e7 ec e5 f0 e0 20 68 61 73 68 20 74 61 62 ....... hash tab
3bd0: 6c 65 0d 0a 09 09 09 09 69 66 20 28 20 28 6d 5f le......if ( (m_
3be0: 6e 48 61 73 68 54 61 62 6c 65 53 69 7a 65 20 3e nHashTableSize >
3bf0: 20 44 45 46 41 55 4c 54 5f 48 41 53 48 5f 54 41 DEFAULT_HASH_TA
3c00: 42 4c 45 5f 53 49 5a 45 29 20 26 26 20 28 6d 5f BLE_SIZE) && (m_
3c10: 6e 43 6f 75 6e 74 20 2a 20 38 20 3c 20 6d 5f 6e nCount * 8 < m_n
3c20: 48 61 73 68 54 61 62 6c 65 53 69 7a 65 29 20 29 HashTableSize) )
3c30: 0d 0a 09 09 09 09 7b 0d 0a 09 09 09 09 09 49 6e ......{.......In
3c40: 69 74 48 61 73 68 54 61 62 6c 65 28 20 6d 5f 6e itHashTable( m_n
3c50: 48 61 73 68 54 61 62 6c 65 53 69 7a 65 20 2f 20 HashTableSize /
3c60: 32 20 29 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 2 );......}.....
3c70: 09 72 65 74 75 72 6e 20 54 52 55 45 3b 0d 0a 09 .return TRUE;...
3c80: 09 09 7d 0d 0a 09 09 7d 0d 0a 09 09 70 70 41 73 ..}....}....ppAs
3c90: 73 6f 63 50 72 65 76 20 3d 20 26 70 41 73 73 6f socPrev = &pAsso
3ca0: 63 2d 3e 70 4e 65 78 74 3b 0d 0a 09 7d 0d 0a 09 c->pNext;...}...
3cb0: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 20 20 2f return FALSE; /
3cc0: 2f 20 6e 6f 74 20 66 6f 75 6e 64 0d 0a 7d 0d 0a / not found..}..
3cd0: 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 ..template<class
3ce0: 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 VALUE, class AR
3cf0: 47 5f 56 41 4c 55 45 3e 0d 0a 76 6f 69 64 20 43 G_VALUE>..void C
3d00: 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 IStringMap<VALUE
3d10: 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 47 65 , ARG_VALUE>::Ge
3d20: 74 4e 65 78 74 41 73 73 6f 63 28 50 4f 53 49 54 tNextAssoc(POSIT
3d30: 49 4f 4e 26 20 72 4e 65 78 74 50 6f 73 69 74 69 ION& rNextPositi
3d40: 6f 6e 2c 0d 0a 09 4c 50 43 53 54 52 26 20 72 4b on,...LPCSTR& rK
3d50: 65 79 2c 20 56 41 4c 55 45 26 20 72 56 61 6c 75 ey, VALUE& rValu
3d60: 65 29 20 63 6f 6e 73 74 0d 0a 7b 0d 0a 09 41 53 e) const..{...AS
3d70: 53 45 52 54 5f 56 41 4c 49 44 28 74 68 69 73 29 SERT_VALID(this)
3d80: 3b 0d 0a 09 41 53 53 45 52 54 28 6d 5f 70 48 61 ;...ASSERT(m_pHa
3d90: 73 68 54 61 62 6c 65 20 21 3d 20 4e 55 4c 4c 29 shTable != NULL)
3da0: 3b 20 20 2f 2f 20 6e 65 76 65 72 20 63 61 6c 6c ; // never call
3db0: 20 6f 6e 20 65 6d 70 74 79 20 6d 61 70 0d 0a 0d on empty map...
3dc0: 0a 09 43 41 73 73 6f 63 2a 20 70 41 73 73 6f 63 ..CAssoc* pAssoc
3dd0: 52 65 74 20 3d 20 28 43 41 73 73 6f 63 2a 29 72 Ret = (CAssoc*)r
3de0: 4e 65 78 74 50 6f 73 69 74 69 6f 6e 3b 0d 0a 09 NextPosition;...
3df0: 41 53 53 45 52 54 28 70 41 73 73 6f 63 52 65 74 ASSERT(pAssocRet
3e00: 20 21 3d 20 4e 55 4c 4c 29 3b 0d 0a 0d 0a 09 69 != NULL);.....i
3e10: 66 20 28 70 41 73 73 6f 63 52 65 74 20 3d 3d 20 f (pAssocRet ==
3e20: 28 43 41 73 73 6f 63 2a 29 20 42 45 46 4f 52 45 (CAssoc*) BEFORE
3e30: 5f 53 54 41 52 54 5f 50 4f 53 49 54 49 4f 4e 29 _START_POSITION)
3e40: 0d 0a 09 7b 0d 0a 09 09 2f 2f 20 66 69 6e 64 20 ...{....// find
3e50: 74 68 65 20 66 69 72 73 74 20 61 73 73 6f 63 69 the first associ
3e60: 61 74 69 6f 6e 0d 0a 09 09 66 6f 72 20 28 55 49 ation....for (UI
3e70: 4e 54 20 6e 42 75 63 6b 65 74 20 3d 20 30 3b 20 NT nBucket = 0;
3e80: 6e 42 75 63 6b 65 74 20 3c 20 6d 5f 6e 48 61 73 nBucket < m_nHas
3e90: 68 54 61 62 6c 65 53 69 7a 65 3b 20 2b 2b 6e 42 hTableSize; ++nB
3ea0: 75 63 6b 65 74 29 0d 0a 09 09 09 69 66 20 28 28 ucket).....if ((
3eb0: 70 41 73 73 6f 63 52 65 74 20 3d 20 6d 5f 70 48 pAssocRet = m_pH
3ec0: 61 73 68 54 61 62 6c 65 5b 6e 42 75 63 6b 65 74 ashTable[nBucket
3ed0: 5d 29 20 21 3d 20 4e 55 4c 4c 29 0d 0a 09 09 09 ]) != NULL).....
3ee0: 09 62 72 65 61 6b 3b 0d 0a 09 09 41 53 53 45 52 .break;....ASSER
3ef0: 54 28 70 41 73 73 6f 63 52 65 74 20 21 3d 20 4e T(pAssocRet != N
3f00: 55 4c 4c 29 3b 20 20 2f 2f 20 6d 75 73 74 20 66 ULL); // must f
3f10: 69 6e 64 20 73 6f 6d 65 74 68 69 6e 67 0d 0a 09 ind something...
3f20: 7d 0d 0a 0d 0a 09 2f 2f 20 66 69 6e 64 20 6e 65 }.....// find ne
3f30: 78 74 20 61 73 73 6f 63 69 61 74 69 6f 6e 0d 0a xt association..
3f40: 09 41 53 53 45 52 54 28 41 66 78 49 73 56 61 6c .ASSERT(AfxIsVal
3f50: 69 64 41 64 64 72 65 73 73 28 70 41 73 73 6f 63 idAddress(pAssoc
3f60: 52 65 74 2c 20 73 69 7a 65 6f 66 28 43 41 73 73 Ret, sizeof(CAss
3f70: 6f 63 29 29 29 3b 0d 0a 09 43 41 73 73 6f 63 2a oc)));...CAssoc*
3f80: 20 70 41 73 73 6f 63 4e 65 78 74 3b 0d 0a 09 69 pAssocNext;...i
3f90: 66 20 28 28 70 41 73 73 6f 63 4e 65 78 74 20 3d f ((pAssocNext =
3fa0: 20 70 41 73 73 6f 63 52 65 74 2d 3e 70 4e 65 78 pAssocRet->pNex
3fb0: 74 29 20 3d 3d 20 4e 55 4c 4c 29 0d 0a 09 7b 0d t) == NULL)...{.
3fc0: 0a 09 09 2f 2f 20 67 6f 20 74 6f 20 6e 65 78 74 ...// go to next
3fd0: 20 62 75 63 6b 65 74 0d 0a 09 09 66 6f 72 20 28 bucket....for (
3fe0: 55 49 4e 54 20 6e 42 75 63 6b 65 74 20 3d 20 70 UINT nBucket = p
3ff0: 41 73 73 6f 63 52 65 74 2d 3e 6e 48 61 73 68 56 AssocRet->nHashV
4000: 61 6c 75 65 20 25 20 6d 5f 6e 48 61 73 68 54 61 alue % m_nHashTa
4010: 62 6c 65 53 69 7a 65 20 2b 20 31 3b 0d 0a 09 09 bleSize + 1;....
4020: 6e 42 75 63 6b 65 74 20 3c 20 6d 5f 6e 48 61 73 nBucket < m_nHas
4030: 68 54 61 62 6c 65 53 69 7a 65 3b 20 2b 2b 6e 42 hTableSize; ++nB
4040: 75 63 6b 65 74 29 0d 0a 09 09 09 69 66 20 28 28 ucket).....if ((
4050: 70 41 73 73 6f 63 4e 65 78 74 20 3d 20 6d 5f 70 pAssocNext = m_p
4060: 48 61 73 68 54 61 62 6c 65 5b 6e 42 75 63 6b 65 HashTable[nBucke
4070: 74 5d 29 20 21 3d 20 4e 55 4c 4c 29 0d 0a 09 09 t]) != NULL)....
4080: 09 09 62 72 65 61 6b 3b 0d 0a 09 7d 0d 0a 0d 0a ..break;...}....
4090: 09 72 4e 65 78 74 50 6f 73 69 74 69 6f 6e 20 3d .rNextPosition =
40a0: 20 28 50 4f 53 49 54 49 4f 4e 29 20 70 41 73 73 (POSITION) pAss
40b0: 6f 63 4e 65 78 74 3b 0d 0a 0d 0a 09 2f 2f 20 66 ocNext;.....// f
40c0: 69 6c 6c 20 69 6e 20 72 65 74 75 72 6e 20 64 61 ill in return da
40d0: 74 61 0d 0a 09 72 4b 65 79 20 3d 20 70 41 73 73 ta...rKey = pAss
40e0: 6f 63 52 65 74 2d 3e 6b 65 79 3b 0d 0a 09 72 56 ocRet->key;...rV
40f0: 61 6c 75 65 20 3d 20 70 41 73 73 6f 63 52 65 74 alue = pAssocRet
4100: 2d 3e 76 61 6c 75 65 3b 0d 0a 7d 0d 0a 0d 0a 74 ->value;..}....t
4110: 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 20 56 41 emplate<class VA
4120: 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 47 5f 56 LUE, class ARG_V
4130: 41 4c 55 45 3e 0d 0a 76 6f 69 64 20 43 49 53 74 ALUE>..void CISt
4140: 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 ringMap<VALUE, A
4150: 52 47 5f 56 41 4c 55 45 3e 3a 3a 47 65 74 4e 65 RG_VALUE>::GetNe
4160: 78 74 41 73 73 6f 63 28 50 4f 53 49 54 49 4f 4e xtAssoc(POSITION
4170: 26 20 72 4e 65 78 74 50 6f 73 69 74 69 6f 6e 2c & rNextPosition,
4180: 0d 0a 09 43 53 74 72 69 6e 67 26 20 72 4b 65 79 ...CString& rKey
4190: 2c 20 56 41 4c 55 45 26 20 72 56 61 6c 75 65 29 , VALUE& rValue)
41a0: 20 63 6f 6e 73 74 0d 0a 7b 0d 0a 09 4c 50 53 54 const..{...LPST
41b0: 52 20 6c 70 73 74 72 4b 65 79 20 3d 20 4e 55 4c R lpstrKey = NUL
41c0: 4c 3b 0d 0a 0d 0a 09 47 65 74 4e 65 78 74 41 73 L;.....GetNextAs
41d0: 73 6f 63 28 72 4e 65 78 74 50 6f 73 69 74 69 6f soc(rNextPositio
41e0: 6e 2c 20 6c 70 73 74 72 4b 65 79 2c 20 72 56 61 n, lpstrKey, rVa
41f0: 6c 75 65 29 3b 0d 0a 09 72 4b 65 79 20 3d 20 6c lue);...rKey = l
4200: 70 73 74 72 4b 65 79 3b 0d 0a 7d 0d 0a 0d 0a 74 pstrKey;..}....t
4210: 65 6d 70 6c 61 74 65 3c 63 6c 61 73 73 20 56 41 emplate<class VA
4220: 4c 55 45 2c 20 63 6c 61 73 73 20 41 52 47 5f 56 LUE, class ARG_V
4230: 41 4c 55 45 3e 0d 0a 76 6f 69 64 20 43 49 53 74 ALUE>..void CISt
4240: 72 69 6e 67 4d 61 70 3c 56 41 4c 55 45 2c 20 41 ringMap<VALUE, A
4250: 52 47 5f 56 41 4c 55 45 3e 3a 3a 53 65 72 69 61 RG_VALUE>::Seria
4260: 6c 69 7a 65 28 43 41 72 63 68 69 76 65 26 20 61 lize(CArchive& a
4270: 72 29 0d 0a 7b 0d 0a 09 41 53 53 45 52 54 5f 56 r)..{...ASSERT_V
4280: 41 4c 49 44 28 74 68 69 73 29 3b 0d 0a 0d 0a 09 ALID(this);.....
4290: 43 4f 62 6a 65 63 74 3a 3a 53 65 72 69 61 6c 69 CObject::Seriali
42a0: 7a 65 28 61 72 29 3b 0d 0a 0d 0a 09 69 66 20 28 ze(ar);.....if (
42b0: 61 72 2e 49 73 53 74 6f 72 69 6e 67 28 29 29 0d ar.IsStoring()).
42c0: 0a 09 7b 0d 0a 09 09 61 72 2e 57 72 69 74 65 43 ..{....ar.WriteC
42d0: 6f 75 6e 74 28 6d 5f 6e 43 6f 75 6e 74 29 3b 0d ount(m_nCount);.
42e0: 0a 09 09 69 66 20 28 6d 5f 6e 43 6f 75 6e 74 20 ...if (m_nCount
42f0: 3d 3d 20 30 29 0d 0a 09 09 09 72 65 74 75 72 6e == 0).....return
4300: 3b 20 20 2f 2f 20 6e 6f 74 68 69 6e 67 20 6d 6f ; // nothing mo
4310: 72 65 20 74 6f 20 64 6f 0d 0a 0d 0a 09 09 41 53 re to do......AS
4320: 53 45 52 54 28 6d 5f 70 48 61 73 68 54 61 62 6c SERT(m_pHashTabl
4330: 65 20 21 3d 20 4e 55 4c 4c 29 3b 0d 0a 09 09 66 e != NULL);....f
4340: 6f 72 20 28 55 49 4e 54 20 6e 48 61 73 68 20 3d or (UINT nHash =
4350: 20 30 3b 20 6e 48 61 73 68 20 3c 20 6d 5f 6e 48 0; nHash < m_nH
4360: 61 73 68 54 61 62 6c 65 53 69 7a 65 3b 20 2b 2b ashTableSize; ++
4370: 6e 48 61 73 68 29 0d 0a 09 09 7b 0d 0a 09 09 09 nHash)....{.....
4380: 43 41 73 73 6f 63 2a 20 70 41 73 73 6f 63 3b 0d CAssoc* pAssoc;.
4390: 0a 09 09 09 66 6f 72 20 28 70 41 73 73 6f 63 20 ....for (pAssoc
43a0: 3d 20 6d 5f 70 48 61 73 68 54 61 62 6c 65 5b 6e = m_pHashTable[n
43b0: 48 61 73 68 5d 3b 20 70 41 73 73 6f 63 20 21 3d Hash]; pAssoc !=
43c0: 20 4e 55 4c 4c 3b 0d 0a 09 09 09 20 20 70 41 73 NULL;..... pAs
43d0: 73 6f 63 20 3d 20 70 41 73 73 6f 63 2d 3e 70 4e soc = pAssoc->pN
43e0: 65 78 74 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 ext).....{......
43f0: 43 53 74 72 69 6e 67 20 6b 65 79 28 70 41 73 73 CString key(pAss
4400: 6f 63 2d 3e 6b 65 79 29 3b 0d 0a 09 09 09 09 53 oc->key);......S
4410: 65 72 69 61 6c 69 7a 65 45 6c 65 6d 65 6e 74 73 erializeElements
4420: 3c 43 53 74 72 69 6e 67 3e 28 61 72 2c 20 26 6b <CString>(ar, &k
4430: 65 79 2c 20 31 29 3b 0d 0a 09 09 09 09 53 65 72 ey, 1);......Ser
4440: 69 61 6c 69 7a 65 45 6c 65 6d 65 6e 74 73 3c 56 ializeElements<V
4450: 41 4c 55 45 3e 28 61 72 2c 20 26 70 41 73 73 6f ALUE>(ar, &pAsso
4460: 63 2d 3e 76 61 6c 75 65 2c 20 31 29 3b 0d 0a 09 c->value, 1);...
4470: 09 09 7d 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 09 65 ..}....}...}...e
4480: 6c 73 65 0d 0a 09 7b 0d 0a 09 09 44 57 4f 52 44 lse...{....DWORD
4490: 20 6e 4e 65 77 43 6f 75 6e 74 20 3d 20 61 72 2e nNewCount = ar.
44a0: 52 65 61 64 43 6f 75 6e 74 28 29 3b 0d 0a 09 09 ReadCount();....
44b0: 77 68 69 6c 65 20 28 6e 4e 65 77 43 6f 75 6e 74 while (nNewCount
44c0: 2d 2d 29 0d 0a 09 09 7b 0d 0a 09 09 09 43 53 74 --)....{.....CSt
44d0: 72 69 6e 67 20 6e 65 77 4b 65 79 3b 0d 0a 09 09 ring newKey;....
44e0: 09 56 41 4c 55 45 20 6e 65 77 56 61 6c 75 65 3b .VALUE newValue;
44f0: 0d 0a 09 09 09 53 65 72 69 61 6c 69 7a 65 45 6c .....SerializeEl
4500: 65 6d 65 6e 74 73 3c 43 53 74 72 69 6e 67 3e 28 ements<CString>(
4510: 61 72 2c 20 26 6e 65 77 4b 65 79 2c 20 31 29 3b ar, &newKey, 1);
4520: 0d 0a 09 09 09 53 65 72 69 61 6c 69 7a 65 45 6c .....SerializeEl
4530: 65 6d 65 6e 74 73 3c 56 41 4c 55 45 3e 28 61 72 ements<VALUE>(ar
4540: 2c 20 26 6e 65 77 56 61 6c 75 65 2c 20 31 29 3b , &newValue, 1);
4550: 0d 0a 09 09 09 53 65 74 41 74 28 72 65 69 6e 74 .....SetAt(reint
4560: 65 72 70 72 65 74 5f 63 61 73 74 3c 4c 50 43 53 erpret_cast<LPCS
4570: 54 52 3e 28 6e 65 77 4b 65 79 2e 47 65 74 42 75 TR>(newKey.GetBu
4580: 66 66 65 72 28 30 29 29 2c 20 6e 65 77 56 61 6c ffer(0)), newVal
4590: 75 65 29 3b 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 7d ue);....}...}..}
45a0: 0d 0a 0d 0a 23 69 66 64 65 66 20 5f 44 45 42 55 ....#ifdef _DEBU
45b0: 47 0d 0a 74 65 6d 70 6c 61 74 65 3c 63 6c 61 73 G..template<clas
45c0: 73 20 56 41 4c 55 45 2c 20 63 6c 61 73 73 20 41 s VALUE, class A
45d0: 52 47 5f 56 41 4c 55 45 3e 0d 0a 76 6f 69 64 20 RG_VALUE>..void
45e0: 43 49 53 74 72 69 6e 67 4d 61 70 3c 56 41 4c 55 CIStringMap<VALU
45f0: 45 2c 20 41 52 47 5f 56 41 4c 55 45 3e 3a 3a 44 E, ARG_VALUE>::D
4600: 75 6d 70 28 43 44 75 6d 70 43 6f 6e 74 65 78 74 ump(CDumpContext
4610: 26 20 64 63 29 20 63 6f 6e 73 74 0d 0a 7b 0d 0a & dc) const..{..
4620: 09 43 4f 62 6a 65 63 74 3a 3a 44 75 6d 70 28 64 .CObject::Dump(d
4630: 63 29 3b 0d 0a 0d 0a 09 64 63 20 3c 3c 20 22 77 c);.....dc << "w
4640: 69 74 68 20 22 20 3c 3c 20 6d 5f 6e 43 6f 75 6e ith " << m_nCoun
4650: 74 20 3c 3c 20 22 20 65 6c 65 6d 65 6e 74 73 22 t << " elements"
4660: 3b 0d 0a 09 69 66 20 28 64 63 2e 47 65 74 44 65 ;...if (dc.GetDe
4670: 70 74 68 28 29 20 3e 20 30 29 0d 0a 09 7b 0d 0a pth() > 0)...{..
4680: 09 09 2f 2f 20 44 75 6d 70 20 69 6e 20 66 6f 72 ..// Dump in for
4690: 6d 61 74 20 22 5b 6b 65 79 5d 20 2d 3e 20 76 61 mat "[key] -> va
46a0: 6c 75 65 22 0d 0a 09 09 43 53 74 72 69 6e 67 20 lue"....CString
46b0: 6b 65 79 3b 0d 0a 09 09 56 41 4c 55 45 20 76 61 key;....VALUE va
46c0: 6c 3b 0d 0a 0d 0a 09 09 50 4f 53 49 54 49 4f 4e l;......POSITION
46d0: 20 70 6f 73 20 3d 20 47 65 74 53 74 61 72 74 50 pos = GetStartP
46e0: 6f 73 69 74 69 6f 6e 28 29 3b 0d 0a 09 09 77 68 osition();....wh
46f0: 69 6c 65 20 28 70 6f 73 20 21 3d 20 4e 55 4c 4c ile (pos != NULL
4700: 29 0d 0a 09 09 7b 0d 0a 09 09 09 47 65 74 4e 65 )....{.....GetNe
4710: 78 74 41 73 73 6f 63 28 70 6f 73 2c 20 6b 65 79 xtAssoc(pos, key
4720: 2c 20 76 61 6c 29 3b 0d 0a 09 09 09 64 63 20 3c , val);.....dc <
4730: 3c 20 22 5c 6e 5c 74 5b 22 3b 0d 0a 09 09 09 44 < "\n\t[";.....D
4740: 75 6d 70 45 6c 65 6d 65 6e 74 73 3c 43 53 74 72 umpElements<CStr
4750: 69 6e 67 3e 28 64 63 2c 20 26 6b 65 79 2c 20 31 ing>(dc, &key, 1
4760: 29 3b 0d 0a 09 09 09 64 63 20 3c 3c 20 22 5d 20 );.....dc << "]
4770: 3d 20 22 3b 0d 0a 09 09 09 44 75 6d 70 45 6c 65 = ";.....DumpEle
4780: 6d 65 6e 74 73 3c 56 41 4c 55 45 3e 28 64 63 2c ments<VALUE>(dc,
4790: 20 26 76 61 6c 2c 20 31 29 3b 0d 0a 09 09 7d 0d &val, 1);....}.
47a0: 0a 09 7d 0d 0a 0d 0a 09 64 63 20 3c 3c 20 22 5c ..}.....dc << "\
47b0: 6e 22 3b 0d 0a 7d 0d 0a 0d 0a 74 65 6d 70 6c 61 n";..}....templa
47c0: 74 65 3c 63 6c 61 73 73 20 56 41 4c 55 45 2c 20 te<class VALUE,
47d0: 63 6c 61 73 73 20 41 52 47 5f 56 41 4c 55 45 3e class ARG_VALUE>
47e0: 0d 0a 76 6f 69 64 20 43 49 53 74 72 69 6e 67 4d ..void CIStringM
47f0: 61 70 3c 56 41 4c 55 45 2c 20 41 52 47 5f 56 41 ap<VALUE, ARG_VA
4800: 4c 55 45 3e 3a 3a 41 73 73 65 72 74 56 61 6c 69 LUE>::AssertVali
4810: 64 28 29 20 63 6f 6e 73 74 0d 0a 7b 0d 0a 09 43 d() const..{...C
4820: 4f 62 6a 65 63 74 3a 3a 41 73 73 65 72 74 56 61 Object::AssertVa
4830: 6c 69 64 28 29 3b 0d 0a 0d 0a 09 41 53 53 45 52 lid();.....ASSER
4840: 54 28 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 T(m_nHashTableSi
4850: 7a 65 20 3e 20 30 29 3b 0d 0a 09 41 53 53 45 52 ze > 0);...ASSER
4860: 54 28 6d 5f 6e 43 6f 75 6e 74 20 3d 3d 20 30 20 T(m_nCount == 0
4870: 7c 7c 20 6d 5f 70 48 61 73 68 54 61 62 6c 65 20 || m_pHashTable
4880: 21 3d 20 4e 55 4c 4c 29 3b 0d 0a 09 09 2f 2f 20 != NULL);....//
4890: 6e 6f 6e 2d 65 6d 70 74 79 20 6d 61 70 20 73 68 non-empty map sh
48a0: 6f 75 6c 64 20 68 61 76 65 20 68 61 73 68 20 74 ould have hash t
48b0: 61 62 6c 65 0d 0a 7d 0d 0a 23 65 6e 64 69 66 20 able..}..#endif
48c0: 2f 2f 5f 44 45 42 55 47 0d 0a 0d 0a 74 79 70 65 //_DEBUG....type
48d0: 64 65 66 20 43 49 53 74 72 69 6e 67 4d 61 70 3c def CIStringMap<
48e0: 43 53 74 72 69 6e 67 2c 20 43 53 74 72 69 6e 67 CString, CString
48f0: 26 3e 20 43 49 53 74 72 69 6e 67 4d 61 70 54 6f &> CIStringMapTo
4900: 53 74 72 69 6e 67 3b 0d 0a 74 79 70 65 64 65 66 String;..typedef
4910: 20 43 49 53 74 72 69 6e 67 4d 61 70 3c 43 4f 62 CIStringMap<COb
4920: 6a 65 63 74 2a 2c 20 43 4f 62 6a 65 63 74 2a 3e ject*, CObject*>
4930: 20 43 49 53 74 72 69 6e 67 4d 61 70 54 6f 4f 62 CIStringMapToOb
4940: 3b 0d 0a 74 79 70 65 64 65 66 20 43 49 53 74 72 ;..typedef CIStr
4950: 69 6e 67 4d 61 70 3c 69 6e 74 2c 20 69 6e 74 3e ingMap<int, int>
4960: 20 43 49 53 74 72 69 6e 67 4d 61 70 54 6f 49 6e CIStringMapToIn
4970: 74 3b 0d 0a 74 79 70 65 64 65 66 20 43 49 53 74 t;..typedef CISt
4980: 72 69 6e 67 4d 61 70 3c 76 6f 69 64 2a 2c 20 76 ringMap<void*, v
4990: 6f 69 64 2a 3e 20 43 49 53 74 72 69 6e 67 4d 61 oid*> CIStringMa
49a0: 70 54 6f 50 74 72 3b 0d 0a 0d 0a 2f 2f ca eb e0 pToPtr;....//...
49b0: f1 f1 20 e4 eb ff 20 f1 e2 ff e7 e8 20 f1 f2 f0 .. ... ..... ...
49c0: ee ea 20 f1 20 5f ed e5 ef f0 e5 f0 fb e2 ed fb .. . _..........
49d0: ec 5f 20 e8 ed e4 e5 ea f1 ee ec 2e 0d 0a 63 6c ._ ...........cl
49e0: 61 73 73 20 43 49 53 74 72 69 6e 67 4d 61 70 54 ass CIStringMapT
49f0: 6f 49 6e 64 65 78 20 3a 20 70 75 62 6c 69 63 20 oIndex : public
4a00: 43 49 53 74 72 69 6e 67 4d 61 70 54 6f 49 6e 74 CIStringMapToInt
4a10: 0d 0a 7b 0d 0a 70 72 69 76 61 74 65 3a 0d 0a 09 ..{..private:...
4a20: 76 6f 69 64 20 53 68 69 66 74 49 6e 64 65 78 65 void ShiftIndexe
4a30: 73 28 69 6e 74 20 6e 53 74 61 72 74 49 6e 64 65 s(int nStartInde
4a40: 78 2c 20 69 6e 74 20 6e 44 65 6c 74 61 29 3b 0d x, int nDelta);.
4a50: 0a 0d 0a 70 75 62 6c 69 63 3a 0d 0a 09 43 49 53 ...public:...CIS
4a60: 74 72 69 6e 67 4d 61 70 54 6f 49 6e 64 65 78 28 tringMapToIndex(
4a70: 62 6f 6f 6c 20 62 55 73 65 45 78 74 65 72 6e 61 bool bUseExterna
4a80: 6c 4b 65 79 73 20 3d 20 66 61 6c 73 65 29 3b 0d lKeys = false);.
4a90: 0a 09 69 6e 74 20 41 64 64 28 4c 50 43 53 54 52 ..int Add(LPCSTR
4aa0: 20 73 7a 4b 65 79 29 3b 20 2f 2f 72 65 74 75 72 szKey); //retur
4ab0: 6e 73 20 6e 65 77 20 69 6e 64 65 78 20 76 61 6c ns new index val
4ac0: 75 65 2e 20 49 66 20 73 7a 4b 65 79 20 61 6c 72 ue. If szKey alr
4ad0: 65 61 64 79 20 69 6e 20 68 61 73 68 20 2d 20 72 eady in hash - r
4ae0: 65 74 75 72 6e 73 20 2d 31 0d 0a 09 76 6f 69 64 eturns -1...void
4af0: 20 49 6e 73 65 72 74 28 69 6e 74 20 6e 49 6e 64 Insert(int nInd
4b00: 65 78 2c 20 4c 50 43 53 54 52 20 73 7a 4b 65 79 ex, LPCSTR szKey
4b10: 29 3b 0d 0a 09 69 6e 74 20 52 65 6d 6f 76 65 28 );...int Remove(
4b20: 4c 50 43 53 54 52 20 73 7a 4b 65 79 29 3b 20 2f LPCSTR szKey); /
4b30: 2f 72 65 74 75 72 6e 73 20 69 6e 64 65 78 20 6f /returns index o
4b40: 66 20 72 65 6d 6f 76 65 64 20 6b 65 79 0d 0a 09 f removed key...
4b50: 76 6f 69 64 20 52 65 6d 6f 76 65 28 69 6e 74 20 void Remove(int
4b60: 6e 49 6e 64 65 78 29 3b 0d 0a 09 76 6f 69 64 20 nIndex);...void
4b70: 4d 6f 76 65 28 69 6e 74 20 6e 49 6e 64 65 78 2c Move(int nIndex,
4b80: 20 69 6e 74 20 6e 4f 66 66 73 65 74 29 3b 0d 0a int nOffset);..
4b90: 7d 3b 0d 0a 0d 0a 0d 0a 63 6c 61 73 73 20 43 43 };......class CC
4ba0: 6f 6c 6c 65 63 74 69 6f 6e 3b 0d 0a 0d 0a 63 6c ollection;....cl
4bb0: 61 73 73 20 43 43 6f 6c 6c 65 63 74 69 6f 6e 49 ass CCollectionI
4bc0: 74 65 6d 0d 0a 7b 0d 0a 20 20 20 20 66 72 69 65 tem..{.. frie
4bd0: 6e 64 20 63 6c 61 73 73 20 43 43 6f 6c 6c 65 63 nd class CCollec
4be0: 74 69 6f 6e 3b 0d 0a 70 75 62 6c 69 63 3a 0d 0a tion;..public:..
4bf0: 20 20 20 20 43 43 6f 6c 6c 65 63 74 69 6f 6e 49 CCollectionI
4c00: 74 65 6d 28 29 3b 0d 0a 20 20 20 20 7e 43 43 6f tem();.. ~CCo
4c10: 6c 6c 65 63 74 69 6f 6e 49 74 65 6d 28 29 3b 0d llectionItem();.
4c20: 0a 20 20 20 20 4c 50 43 53 54 52 20 47 65 74 4e . LPCSTR GetN
4c30: 61 6d 65 28 29 20 63 6f 6e 73 74 3b 0d 0a 20 20 ame() const;..
4c40: 20 20 76 6f 69 64 20 53 65 74 4e 61 6d 65 28 4c void SetName(L
4c50: 50 43 53 54 52 20 73 7a 4e 61 6d 65 29 3b 0d 0a PCSTR szName);..
4c60: 70 72 6f 74 65 63 74 65 64 3a 0d 0a 20 20 20 20 protected:..
4c70: 69 6e 6c 69 6e 65 20 43 43 6f 6c 6c 65 63 74 69 inline CCollecti
4c80: 6f 6e 2a 20 47 65 74 43 6f 6c 6c 65 63 74 69 6f on* GetCollectio
4c90: 6e 28 29 20 63 6f 6e 73 74 20 7b 20 72 65 74 75 n() const { retu
4ca0: 72 6e 20 6d 5f 70 43 6f 6c 6c 65 63 74 69 6f 6e rn m_pCollection
4cb0: 3b 20 7d 3b 0d 0a 20 20 20 20 69 6e 6c 69 6e 65 ; };.. inline
4cc0: 20 76 6f 69 64 20 53 65 74 43 6f 6c 6c 65 63 74 void SetCollect
4cd0: 69 6f 6e 28 20 43 43 6f 6c 6c 65 63 74 69 6f 6e ion( CCollection
4ce0: 20 2a 70 43 6f 6c 6c 65 63 74 69 6f 6e 20 29 20 *pCollection )
4cf0: 7b 20 6d 5f 70 43 6f 6c 6c 65 63 74 69 6f 6e 20 { m_pCollection
4d00: 3d 20 70 43 6f 6c 6c 65 63 74 69 6f 6e 3b 20 7d = pCollection; }
4d10: 3b 0d 0a 70 72 69 76 61 74 65 3a 0d 0a 09 4c 50 ;..private:...LP
4d20: 53 54 52 20 6d 5f 4e 61 6d 65 3b 0d 0a 20 20 20 STR m_Name;..
4d30: 20 43 43 6f 6c 6c 65 63 74 69 6f 6e 2a 20 6d 5f CCollection* m_
4d40: 70 43 6f 6c 6c 65 63 74 69 6f 6e 3b 0d 0a 7d 3b pCollection;..};
4d50: 0d 0a 0d 0a 63 6c 61 73 73 20 43 43 6f 6c 6c 65 ....class CColle
4d60: 63 74 69 6f 6e 0d 0a 7b 0d 0a 20 20 20 20 66 72 ction..{.. fr
4d70: 69 65 6e 64 20 43 43 6f 6c 6c 65 63 74 69 6f 6e iend CCollection
4d80: 49 74 65 6d 3b 0d 0a 70 75 62 6c 69 63 3a 0d 0a Item;..public:..
4d90: 09 43 43 6f 6c 6c 65 63 74 69 6f 6e 28 29 3b 0d .CCollection();.
4da0: 0a 09 7e 43 43 6f 6c 6c 65 63 74 69 6f 6e 28 29 ..~CCollection()
4db0: 3b 0d 0a 0d 0a 20 20 20 20 69 6e 74 20 47 65 74 ;.... int Get
4dc0: 43 6f 75 6e 74 28 29 20 63 6f 6e 73 74 3b 0d 0a Count() const;..
4dd0: 20 20 20 20 69 6e 74 20 47 65 74 55 70 70 65 72 int GetUpper
4de0: 42 6f 75 6e 64 28 29 20 63 6f 6e 73 74 3b 0d 0a Bound() const;..
4df0: 20 20 20 20 76 6f 69 64 20 41 64 64 28 43 43 6f void Add(CCo
4e00: 6c 6c 65 63 74 69 6f 6e 49 74 65 6d 2a 20 70 49 llectionItem* pI
4e10: 74 65 6d 29 3b 0d 0a 20 20 20 20 76 6f 69 64 20 tem);.. void
4e20: 49 6e 73 65 72 74 28 69 6e 74 20 6e 49 6e 64 65 Insert(int nInde
4e30: 78 2c 20 43 43 6f 6c 6c 65 63 74 69 6f 6e 49 74 x, CCollectionIt
4e40: 65 6d 2a 20 70 49 74 65 6d 29 3b 0d 0a 20 20 20 em* pItem);..
4e50: 20 76 6f 69 64 20 52 65 6d 6f 76 65 28 69 6e 74 void Remove(int
4e60: 20 6e 49 6e 64 65 78 29 3b 0d 0a 20 20 20 20 76 nIndex);.. v
4e70: 6f 69 64 20 43 6c 65 61 72 28 29 3b 0d 0a 20 20 oid Clear();..
4e80: 20 20 43 43 6f 6c 6c 65 63 74 69 6f 6e 49 74 65 CCollectionIte
4e90: 6d 2a 20 6f 70 65 72 61 74 6f 72 20 5b 5d 28 69 m* operator [](i
4ea0: 6e 74 20 6e 49 6e 64 65 78 29 20 63 6f 6e 73 74 nt nIndex) const
4eb0: 3b 0d 0a 20 20 20 20 43 43 6f 6c 6c 65 63 74 69 ;.. CCollecti
4ec0: 6f 6e 49 74 65 6d 2a 20 6f 70 65 72 61 74 6f 72 onItem* operator
4ed0: 20 5b 5d 28 4c 50 43 53 54 52 20 73 7a 4e 61 6d [](LPCSTR szNam
4ee0: 65 29 20 63 6f 6e 73 74 3b 0d 0a 20 20 20 20 69 e) const;.. i
4ef0: 6e 6c 69 6e 65 20 43 43 6f 6c 6c 65 63 74 69 6f nline CCollectio
4f00: 6e 49 74 65 6d 2a 20 47 65 74 49 74 65 6d 28 69 nItem* GetItem(i
4f10: 6e 74 20 6e 49 6e 64 65 78 29 20 63 6f 6e 73 74 nt nIndex) const
4f20: 20 7b 72 65 74 75 72 6e 20 28 2a 74 68 69 73 29 {return (*this)
4f30: 5b 6e 49 6e 64 65 78 5d 3b 7d 3b 0d 0a 20 20 20 [nIndex];};..
4f40: 20 69 6e 6c 69 6e 65 20 43 43 6f 6c 6c 65 63 74 inline CCollect
4f50: 69 6f 6e 49 74 65 6d 2a 20 47 65 74 49 74 65 6d ionItem* GetItem
4f60: 28 4c 50 43 53 54 52 20 73 7a 4e 61 6d 65 29 20 (LPCSTR szName)
4f70: 63 6f 6e 73 74 20 7b 72 65 74 75 72 6e 20 28 2a const {return (*
4f80: 74 68 69 73 29 5b 73 7a 4e 61 6d 65 5d 3b 7d 3b this)[szName];};
4f90: 0d 0a 20 20 20 20 69 6e 74 20 47 65 74 49 6e 64 .. int GetInd
4fa0: 65 78 28 43 43 6f 6c 6c 65 63 74 69 6f 6e 49 74 ex(CCollectionIt
4fb0: 65 6d 2a 20 70 49 74 65 6d 29 20 63 6f 6e 73 74 em* pItem) const
4fc0: 3b 0d 0a 20 20 20 20 69 6e 74 20 47 65 74 49 6e ;.. int GetIn
4fd0: 64 65 78 28 4c 50 43 53 54 52 20 73 7a 4e 61 6d dex(LPCSTR szNam
4fe0: 65 29 20 63 6f 6e 73 74 3b 0d 0a 20 20 20 20 43 e) const;.. C
4ff0: 43 6f 6c 6c 65 63 74 69 6f 6e 49 74 65 6d 2a 2a CollectionItem**
5000: 20 47 65 74 44 61 74 61 28 29 20 63 6f 6e 73 74 GetData() const
5010: 3b 0d 0a 20 20 20 20 76 6f 69 64 20 4d 6f 76 65 ;.. void Move
5020: 28 69 6e 74 20 6e 49 6e 64 65 78 2c 20 69 6e 74 (int nIndex, int
5030: 20 6e 4f 66 66 73 65 74 29 3b 0d 0a 70 72 6f 74 nOffset);..prot
5040: 65 63 74 65 64 3a 0d 0a 20 20 20 20 76 69 72 74 ected:.. virt
5050: 75 61 6c 20 76 6f 69 64 20 4f 6e 41 64 64 28 43 ual void OnAdd(C
5060: 43 6f 6c 6c 65 63 74 69 6f 6e 49 74 65 6d 2a 20 CollectionItem*
5070: 70 49 74 65 6d 29 3b 0d 0a 20 20 20 20 76 69 72 pItem);.. vir
5080: 74 75 61 6c 20 76 6f 69 64 20 4f 6e 52 65 6d 6f tual void OnRemo
5090: 76 65 28 43 43 6f 6c 6c 65 63 74 69 6f 6e 49 74 ve(CCollectionIt
50a0: 65 6d 2a 20 70 49 74 65 6d 2c 20 69 6e 74 20 6e em* pItem, int n
50b0: 49 6e 64 65 78 57 61 73 29 3b 20 2f 2f 57 61 72 IndexWas); //War
50c0: 6e 69 6e 67 21 20 57 68 65 6e 20 63 61 6c 6c 69 ning! When calli
50d0: 6e 67 20 66 72 6f 6d 20 43 6c 65 61 72 28 29 2c ng from Clear(),
50e0: 20 64 6f 6e 27 74 20 75 73 65 0d 0a 20 20 20 20 don't use..
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f //
5130: 6f 74 68 65 72 20 6d 65 6d 62 65 72 73 20 6f 66 other members of
5140: 20 74 68 69 73 20 63 6f 6c 6c 65 63 74 69 6f 6e this collection
5150: 20 28 74 68 65 79 20 77 69 6c 6c 0d 0a 20 20 20 (they will..
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
51a0: 2f 77 6f 72 6b 20 77 72 6f 6e 67 29 20 61 6e 64 /work wrong) and
51b0: 20 6e 49 6e 64 65 78 57 61 73 20 69 73 20 65 71 nIndexWas is eq
51c0: 75 61 6c 20 2d 31 2e 0d 0a 20 20 20 20 76 69 72 ual -1... vir
51d0: 74 75 61 6c 20 76 6f 69 64 20 4f 6e 52 65 6e 61 tual void OnRena
51e0: 6d 65 28 43 43 6f 6c 6c 65 63 74 69 6f 6e 49 74 me(CCollectionIt
51f0: 65 6d 2a 20 70 49 74 65 6d 29 3b 0d 0a 70 72 69 em* pItem);..pri
5200: 76 61 74 65 3a 0d 0a 20 20 20 20 43 54 79 70 65 vate:.. CType
5210: 64 50 74 72 41 72 72 61 79 3c 43 50 74 72 41 72 dPtrArray<CPtrAr
5220: 72 61 79 2c 20 43 43 6f 6c 6c 65 63 74 69 6f 6e ray, CCollection
5230: 49 74 65 6d 2a 3e 20 6d 5f 49 74 65 6d 73 3b 0d Item*> m_Items;.
5240: 0a 09 43 49 53 74 72 69 6e 67 4d 61 70 54 6f 49 ..CIStringMapToI
5250: 6e 64 65 78 20 6d 5f 49 74 65 6d 73 48 61 73 68 ndex m_ItemsHash
5260: 3b 0d 0a 7d 3b 0d 0a ;..};..