0000: 2f 2a 0d 0a 6e 6f 63 61 73 65 6d 61 70 2e 68 70 /*..nocasemap.hp
0010: 70 0d 0a 28 63 29 20 c0 eb e5 ea f1 e0 ed e4 f0 p..(c) .........
0020: 20 ce f0 e5 f4 ea ee e2 0d 0a d8 e0 e1 eb ee ed ...............
0030: 20 f5 e5 f8 2d f2 e0 e1 eb e8 f6 fb 20 e4 eb ff ...-....... ...
0040: 20 f1 f2 f0 ee ea ee e2 fb f5 20 ea eb fe f7 e5 ......... .....
0050: e9 20 e1 e5 e7 20 f3 f7 e5 f2 e0 20 f0 e5 e3 e8 . ... ..... ....
0060: f1 f2 f0 e0 0d 0a 2a 2f 0d 0a 0d 0a 23 70 72 61 ......*/....#pra
0070: 67 6d 61 20 6f 6e 63 65 0d 0a 23 70 72 61 67 6d gma once..#pragm
0080: 61 20 77 61 72 6e 69 6e 67 28 64 69 73 61 62 6c a warning(disabl
0090: 65 3a 20 34 37 38 36 29 09 2f 2f 20 cf f0 e5 e4 e: 4786).// ....
00a0: f3 ef f0 e5 e6 e4 e5 ed e8 ff 20 ee 20 e4 eb e8 .......... . ...
00b0: ed ed fb f5 20 e8 ec e5 ed e0 f5 0d 0a 0d 0a 6e .... ..........n
00c0: 61 6d 65 73 70 61 63 65 20 6e 63 6d 5f 73 79 6d amespace ncm_sym
00d0: 62 7b 0d 0a 5f 5f 66 6f 72 63 65 69 6e 6c 69 6e b{..__forceinlin
00e0: 65 20 44 57 4f 52 44 20 73 79 6d 62 6f 6c 28 4c e DWORD symbol(L
00f0: 50 43 53 54 52 20 70 74 72 29 7b 72 65 74 75 72 PCSTR ptr){retur
0100: 6e 20 73 74 61 74 69 63 5f 63 61 73 74 3c 44 57 n static_cast<DW
0110: 4f 52 44 3e 28 73 74 61 74 69 63 5f 63 61 73 74 ORD>(static_cast
0120: 3c 42 59 54 45 3e 28 2a 70 74 72 29 29 3b 7d 0d <BYTE>(*ptr));}.
0130: 0a 7d 0d 0a 0d 0a 2f 2f 20 c1 e0 e7 ee e2 fb e9 .}....// .......
0140: 20 ea eb e0 f1 f1 2c 20 f0 e5 e0 eb e8 e7 f3 fe ....., ........
0150: f9 e8 e9 20 ee e1 f9 f3 fe 20 f4 f3 ed ea f6 e8 ... ..... ......
0160: ee ed e0 eb fc ed ee f1 f2 fc 20 f5 e5 f8 2d f2 .......... ...-.
0170: e0 e1 eb e8 f6 fb 0d 0a 63 6c 61 73 73 20 43 4e ........class CN
0180: 6f 43 61 73 65 4d 61 70 42 61 73 65 0d 0a 7b 0d oCaseMapBase..{.
0190: 0a 70 75 62 6c 69 63 3a 0d 0a 09 69 6e 74 20 47 .public:...int G
01a0: 65 74 43 6f 75 6e 74 28 29 20 63 6f 6e 73 74 0d etCount() const.
01b0: 0a 09 09 7b 72 65 74 75 72 6e 20 6d 5f 6e 43 6f ...{return m_nCo
01c0: 75 6e 74 3b 7d 0d 0a 09 42 4f 4f 4c 20 49 73 45 unt;}...BOOL IsE
01d0: 6d 70 74 79 28 29 20 63 6f 6e 73 74 0d 0a 09 09 mpty() const....
01e0: 7b 72 65 74 75 72 6e 20 6d 5f 6e 43 6f 75 6e 74 {return m_nCount
01f0: 21 3d 30 3b 7d 0d 0a 09 50 4f 53 49 54 49 4f 4e !=0;}...POSITION
0200: 20 47 65 74 53 74 61 72 74 50 6f 73 69 74 69 6f GetStartPositio
0210: 6e 28 29 20 63 6f 6e 73 74 0d 0a 09 09 7b 72 65 n() const....{re
0220: 74 75 72 6e 20 6d 5f 6e 43 6f 75 6e 74 20 3f 20 turn m_nCount ?
0230: 42 45 46 4f 52 45 5f 53 54 41 52 54 5f 50 4f 53 BEFORE_START_POS
0240: 49 54 49 4f 4e 20 3a 20 4e 55 4c 4c 3b 7d 0d 0a ITION : NULL;}..
0250: 09 55 49 4e 54 20 47 65 74 48 61 73 68 54 61 62 .UINT GetHashTab
0260: 6c 65 53 69 7a 65 28 29 20 63 6f 6e 73 74 0d 0a leSize() const..
0270: 09 09 7b 72 65 74 75 72 6e 20 6d 5f 6e 48 61 73 ..{return m_nHas
0280: 68 54 61 62 6c 65 53 69 7a 65 3b 7d 0d 0a 0d 0a hTableSize;}....
0290: 09 76 6f 69 64 20 50 72 65 70 65 61 72 65 48 61 .void PrepeareHa
02a0: 73 68 54 61 62 6c 65 28 44 57 4f 52 44 20 6e 43 shTable(DWORD nC
02b0: 6f 75 6e 74 29 3b 0d 0a 0d 0a 09 73 74 72 75 63 ount);.....struc
02c0: 74 20 43 41 73 73 6f 63 0d 0a 09 7b 0d 0a 09 09 t CAssoc...{....
02d0: 43 41 73 73 6f 63 28 44 57 4f 52 44 20 6e 48 61 CAssoc(DWORD nHa
02e0: 73 68 2c 20 43 41 73 73 6f 63 2a 26 20 70 29 3a sh, CAssoc*& p):
02f0: 6e 48 61 73 68 56 61 6c 75 65 28 6e 48 61 73 68 nHashValue(nHash
0300: 29 2c 20 70 4e 65 78 74 28 70 29 7b 70 3d 74 68 ), pNext(p){p=th
0310: 69 73 3b 7d 0d 0a 09 09 43 41 73 73 6f 63 2a 20 is;}....CAssoc*
0320: 70 4e 65 78 74 3b 0d 0a 09 09 44 57 4f 52 44 20 pNext;....DWORD
0330: 6e 48 61 73 68 56 61 6c 75 65 3b 0d 0a 09 7d 3b nHashValue;...};
0340: 0d 0a 09 73 74 61 74 69 63 20 44 57 4f 52 44 20 ...static DWORD
0350: 6d 5f 6c 6f 74 61 62 6c 65 5b 32 35 36 5d 3b 0d m_lotable[256];.
0360: 0a 70 72 6f 74 65 63 74 65 64 3a 0d 0a 09 43 41 .protected:...CA
0370: 73 73 6f 63 2a 2a 20 6d 5f 70 48 61 73 68 54 61 ssoc** m_pHashTa
0380: 62 6c 65 3b 0d 0a 09 44 57 4f 52 44 20 6d 5f 6e ble;...DWORD m_n
0390: 48 61 73 68 54 61 62 6c 65 53 69 7a 65 3b 0d 0a HashTableSize;..
03a0: 0d 0a 09 44 57 4f 52 44 20 6d 5f 6e 43 6f 75 6e ...DWORD m_nCoun
03b0: 74 3b 0d 0a 09 43 41 73 73 6f 63 2a 20 6d 5f 70 t;...CAssoc* m_p
03c0: 46 72 65 65 4c 69 73 74 3b 0d 0a 09 73 74 72 75 FreeList;...stru
03d0: 63 74 20 43 50 6c 65 78 2a 20 6d 5f 70 42 6c 6f ct CPlex* m_pBlo
03e0: 63 6b 73 3b 0d 0a 0d 0a 09 73 74 72 75 63 74 20 cks;.....struct
03f0: 69 6e 69 74 0d 0a 09 7b 0d 0a 09 09 69 6e 69 74 init...{....init
0400: 28 29 0d 0a 09 09 7b 0d 0a 09 09 09 66 6f 72 28 ()....{.....for(
0410: 44 57 4f 52 44 20 69 3d 30 3b 69 3c 32 35 36 3b DWORD i=0;i<256;
0420: 69 2b 2b 29 0d 0a 09 09 09 09 6d 5f 6c 6f 74 61 i++)......m_lota
0430: 62 6c 65 5b 69 5d 3d 28 44 57 4f 52 44 29 43 68 ble[i]=(DWORD)Ch
0440: 61 72 4c 6f 77 65 72 28 28 4c 50 53 54 52 29 69 arLower((LPSTR)i
0450: 29 3b 0d 0a 09 09 7d 0d 0a 09 7d 3b 0d 0a 09 73 );....}...};...s
0460: 74 61 74 69 63 20 69 6e 69 74 20 6d 5f 6c 6f 74 tatic init m_lot
0470: 61 62 6c 65 69 6e 69 74 3b 0d 0a 09 66 72 69 65 ableinit;...frie
0480: 6e 64 20 73 74 72 75 63 74 20 69 6e 69 74 3b 0d nd struct init;.
0490: 0a 0d 0a 09 43 4e 6f 43 61 73 65 4d 61 70 42 61 ....CNoCaseMapBa
04a0: 73 65 28 29 3a 0d 0a 09 09 6d 5f 70 48 61 73 68 se():....m_pHash
04b0: 54 61 62 6c 65 28 4e 55 4c 4c 29 2c 20 6d 5f 6e Table(NULL), m_n
04c0: 43 6f 75 6e 74 28 30 29 2c 20 6d 5f 6e 48 61 73 Count(0), m_nHas
04d0: 68 54 61 62 6c 65 53 69 7a 65 28 30 29 2c 0d 0a hTableSize(0),..
04e0: 09 09 6d 5f 70 46 72 65 65 4c 69 73 74 28 4e 55 ..m_pFreeList(NU
04f0: 4c 4c 29 2c 20 6d 5f 70 42 6c 6f 63 6b 73 28 4e LL), m_pBlocks(N
0500: 55 4c 4c 29 7b 7d 0d 0a 0d 0a 09 76 6f 69 64 20 ULL){}.....void
0510: 44 65 6c 65 74 65 41 6c 6c 28 29 0d 0a 09 7b 0d DeleteAll()...{.
0520: 0a 09 09 64 65 6c 65 74 65 20 5b 5d 20 6d 5f 70 ...delete [] m_p
0530: 48 61 73 68 54 61 62 6c 65 3b 0d 0a 09 09 6d 5f HashTable;....m_
0540: 70 48 61 73 68 54 61 62 6c 65 20 3d 20 4e 55 4c pHashTable = NUL
0550: 4c 3b 0d 0a 09 09 6d 5f 6e 48 61 73 68 54 61 62 L;....m_nHashTab
0560: 6c 65 53 69 7a 65 20 3d 20 30 3b 0d 0a 09 09 6d leSize = 0;....m
0570: 5f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0d 0a 09 09 _nCount = 0;....
0580: 6d 5f 70 46 72 65 65 4c 69 73 74 20 3d 20 4e 55 m_pFreeList = NU
0590: 4c 4c 3b 0d 0a 09 09 69 66 28 6d 5f 70 42 6c 6f LL;....if(m_pBlo
05a0: 63 6b 73 29 0d 0a 09 09 7b 0d 0a 09 09 09 6d 5f cks)....{.....m_
05b0: 70 42 6c 6f 63 6b 73 2d 3e 46 72 65 65 44 61 74 pBlocks->FreeDat
05c0: 61 43 68 61 69 6e 28 29 3b 0d 0a 09 09 09 6d 5f aChain();.....m_
05d0: 70 42 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0d pBlocks = NULL;.
05e0: 0a 09 09 7d 0d 0a 09 7d 0d 0a 0d 0a 0d 0a 09 43 ...}...}.......C
05f0: 41 73 73 6f 63 2a 20 4e 65 77 41 73 73 6f 63 28 Assoc* NewAssoc(
0600: 73 69 7a 65 5f 74 20 41 73 73 6f 63 53 69 7a 65 size_t AssocSize
0610: 29 0d 0a 09 7b 0d 0a 09 09 69 66 28 6d 5f 70 46 )...{....if(m_pF
0620: 72 65 65 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 reeList == NULL)
0630: 0d 0a 09 09 7b 0d 0a 09 09 09 2f 2f 20 61 64 64 ....{.....// add
0640: 20 61 6e 6f 74 68 65 72 20 62 6c 6f 63 6b 0d 0a another block..
0650: 09 09 09 43 50 6c 65 78 2a 20 6e 65 77 42 6c 6f ...CPlex* newBlo
0660: 63 6b 20 3d 20 43 50 6c 65 78 3a 3a 43 72 65 61 ck = CPlex::Crea
0670: 74 65 28 6d 5f 70 42 6c 6f 63 6b 73 2c 20 39 2c te(m_pBlocks, 9,
0680: 20 41 73 73 6f 63 53 69 7a 65 29 3b 0d 0a 09 09 AssocSize);....
0690: 09 2f 2f 20 63 68 61 69 6e 20 74 68 65 6d 20 69 .// chain them i
06a0: 6e 74 6f 20 66 72 65 65 20 6c 69 73 74 0d 0a 09 nto free list...
06b0: 09 09 63 68 61 72 2a 20 70 41 73 73 6f 63 20 3d ..char* pAssoc =
06c0: 20 73 74 61 74 69 63 5f 63 61 73 74 3c 63 68 61 static_cast<cha
06d0: 72 2a 3e 28 6e 65 77 42 6c 6f 63 6b 2d 3e 64 61 r*>(newBlock->da
06e0: 74 61 28 29 29 3b 0d 0a 09 09 09 2f 2f 20 66 72 ta());.....// fr
06f0: 65 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 ee in reverse or
0700: 64 65 72 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 der to make it e
0710: 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 0d 0a asier to debug..
0720: 09 09 09 70 41 73 73 6f 63 20 2b 3d 20 28 38 20 ...pAssoc += (8
0730: 2a 20 41 73 73 6f 63 53 69 7a 65 29 3b 0d 0a 09 * AssocSize);...
0740: 09 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 38 ..for (int i = 8
0750: 3b 20 69 20 3e 3d 20 30 3b 20 2d 2d 69 2c 20 70 ; i >= 0; --i, p
0760: 41 73 73 6f 63 2d 3d 41 73 73 6f 63 53 69 7a 65 Assoc-=AssocSize
0770: 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 72 65 69 ).....{......rei
0780: 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 43 41 nterpret_cast<CA
0790: 73 73 6f 63 2a 3e 28 70 41 73 73 6f 63 29 2d 3e ssoc*>(pAssoc)->
07a0: 70 4e 65 78 74 20 3d 20 6d 5f 70 46 72 65 65 4c pNext = m_pFreeL
07b0: 69 73 74 3b 0d 0a 09 09 09 09 6d 5f 70 46 72 65 ist;......m_pFre
07c0: 65 4c 69 73 74 20 3d 20 72 65 69 6e 74 65 72 70 eList = reinterp
07d0: 72 65 74 5f 63 61 73 74 3c 43 41 73 73 6f 63 2a ret_cast<CAssoc*
07e0: 3e 28 70 41 73 73 6f 63 29 3b 0d 0a 09 09 09 7d >(pAssoc);.....}
07f0: 0d 0a 09 09 7d 0d 0a 09 09 2b 2b 6d 5f 6e 43 6f ....}....++m_nCo
0800: 75 6e 74 3b 0d 0a 09 09 43 41 73 73 6f 63 2a 20 unt;....CAssoc*
0810: 70 41 73 73 6f 63 20 3d 20 6d 5f 70 46 72 65 65 pAssoc = m_pFree
0820: 4c 69 73 74 3b 0d 0a 09 09 6d 5f 70 46 72 65 65 List;....m_pFree
0830: 4c 69 73 74 20 3d 20 6d 5f 70 46 72 65 65 4c 69 List = m_pFreeLi
0840: 73 74 2d 3e 70 4e 65 78 74 3b 0d 0a 09 09 72 65 st->pNext;....re
0850: 74 75 72 6e 20 70 41 73 73 6f 63 3b 0d 0a 09 7d turn pAssoc;...}
0860: 0d 0a 09 76 6f 69 64 20 46 72 65 65 41 73 73 6f ...void FreeAsso
0870: 63 28 43 41 73 73 6f 63 2a 20 70 41 73 73 6f 63 c(CAssoc* pAssoc
0880: 29 0d 0a 09 7b 0d 0a 09 09 70 41 73 73 6f 63 2d )...{....pAssoc-
0890: 3e 70 4e 65 78 74 20 3d 20 6d 5f 70 46 72 65 65 >pNext = m_pFree
08a0: 4c 69 73 74 3b 0d 0a 09 09 6d 5f 70 46 72 65 65 List;....m_pFree
08b0: 4c 69 73 74 20 3d 20 70 41 73 73 6f 63 3b 0d 0a List = pAssoc;..
08c0: 09 09 2d 2d 6d 5f 6e 43 6f 75 6e 74 3b 0d 0a 09 ..--m_nCount;...
08d0: 7d 0d 0a 0d 0a 09 44 57 4f 52 44 20 43 61 6c 63 }.....DWORD Calc
08e0: 48 61 73 68 53 69 7a 65 28 44 57 4f 52 44 20 6e HashSize(DWORD n
08f0: 43 6f 75 6e 74 29 0d 0a 09 7b 0d 0a 09 09 44 57 Count)...{....DW
0900: 4f 52 44 20 68 73 20 3d 20 28 6e 43 6f 75 6e 74 ORD hs = (nCount
0910: 20 2b 20 28 6e 43 6f 75 6e 74 3e 3e 31 29 29 20 + (nCount>>1))
0920: 7c 20 31 3b 0d 0a 09 09 69 66 28 68 73 3e 31 30 | 1;....if(hs>10
0930: 31 29 0d 0a 09 09 7b 0d 0a 09 09 09 66 6f 72 28 1)....{.....for(
0940: 44 57 4f 52 44 20 69 3d 33 3b 20 69 20 2a 20 69 DWORD i=3; i * i
0950: 20 3c 3d 20 68 73 3b 20 69 2b 3d 32 29 0d 0a 09 <= hs; i+=2)...
0960: 09 09 7b 0d 0a 09 09 09 09 69 66 28 68 73 20 25 ..{......if(hs %
0970: 20 69 20 3d 3d 20 30 29 0d 0a 09 09 09 09 7b 0d i == 0)......{.
0980: 0a 09 09 09 09 09 68 73 2b 3d 32 3b 0d 0a 09 09 ......hs+=2;....
0990: 09 09 09 69 3d 31 3b 0d 0a 09 09 09 09 7d 0d 0a ...i=1;......}..
09a0: 09 09 09 7d 0d 0a 09 09 09 72 65 74 75 72 6e 20 ...}.....return
09b0: 68 73 3b 0d 0a 09 09 7d 0d 0a 09 09 65 6c 73 65 hs;....}....else
09c0: 20 69 66 28 68 73 20 3c 3d 20 31 33 29 0d 0a 09 if(hs <= 13)...
09d0: 09 09 72 65 74 75 72 6e 20 31 33 3b 0d 0a 09 09 ..return 13;....
09e0: 65 6c 73 65 20 69 66 28 68 73 20 3c 3d 20 32 33 else if(hs <= 23
09f0: 29 0d 0a 09 09 09 72 65 74 75 72 6e 20 32 33 3b ).....return 23;
0a00: 0d 0a 09 09 65 6c 73 65 20 69 66 28 68 73 20 3c ....else if(hs <
0a10: 3d 20 33 37 29 0d 0a 09 09 09 72 65 74 75 72 6e = 37).....return
0a20: 20 33 37 3b 0d 0a 09 09 65 6c 73 65 20 69 66 28 37;....else if(
0a30: 68 73 20 3c 3d 20 35 33 29 0d 0a 09 09 09 72 65 hs <= 53).....re
0a40: 74 75 72 6e 20 35 33 3b 0d 0a 09 09 65 6c 73 65 turn 53;....else
0a50: 20 69 66 28 68 73 20 3c 3d 20 37 31 29 0d 0a 09 if(hs <= 71)...
0a60: 09 09 72 65 74 75 72 6e 20 37 31 3b 0d 0a 09 09 ..return 71;....
0a70: 65 6c 73 65 0d 0a 09 09 09 72 65 74 75 72 6e 20 else.....return
0a80: 31 30 31 3b 0d 0a 09 7d 0d 0a 0d 0a 09 73 74 61 101;...}.....sta
0a90: 74 69 63 20 42 4f 4f 4c 20 49 73 53 74 72 45 71 tic BOOL IsStrEq
0aa0: 75 61 6c 28 4c 50 43 53 54 52 20 70 74 72 31 2c ual(LPCSTR ptr1,
0ab0: 20 4c 50 43 53 54 52 20 70 74 72 32 29 0d 0a 09 LPCSTR ptr2)...
0ac0: 7b 0d 0a 09 09 66 6f 72 28 44 57 4f 52 44 20 73 {....for(DWORD s
0ad0: 31 3d 6e 63 6d 5f 73 79 6d 62 3a 3a 73 79 6d 62 1=ncm_symb::symb
0ae0: 6f 6c 28 70 74 72 31 29 2c 20 73 32 3d 6e 63 6d ol(ptr1), s2=ncm
0af0: 5f 73 79 6d 62 3a 3a 73 79 6d 62 6f 6c 28 70 74 _symb::symbol(pt
0b00: 72 32 29 3b 20 3b 73 31 3d 6e 63 6d 5f 73 79 6d r2); ;s1=ncm_sym
0b10: 62 3a 3a 73 79 6d 62 6f 6c 28 2b 2b 70 74 72 31 b::symbol(++ptr1
0b20: 29 2c 20 73 32 3d 6e 63 6d 5f 73 79 6d 62 3a 3a ), s2=ncm_symb::
0b30: 73 79 6d 62 6f 6c 28 2b 2b 70 74 72 32 29 29 0d symbol(++ptr2)).
0b40: 0a 09 09 7b 0d 0a 09 09 09 69 66 28 6d 5f 6c 6f ...{.....if(m_lo
0b50: 74 61 62 6c 65 5b 73 31 5d 20 21 3d 20 6d 5f 6c table[s1] != m_l
0b60: 6f 74 61 62 6c 65 5b 73 32 5d 29 0d 0a 09 09 09 otable[s2]).....
0b70: 09 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0d 0a .return FALSE;..
0b80: 09 09 09 69 66 28 21 73 32 29 0d 0a 09 09 09 09 ...if(!s2)......
0b90: 72 65 74 75 72 6e 20 21 73 31 3b 0d 0a 09 09 7d return !s1;....}
0ba0: 0d 0a 09 7d 0d 0a 0d 0a 09 73 74 61 74 69 63 20 ...}.....static
0bb0: 44 57 4f 52 44 20 47 65 74 48 61 73 68 28 4c 50 DWORD GetHash(LP
0bc0: 43 53 54 52 20 6b 65 79 29 0d 0a 09 7b 0d 0a 09 CSTR key)...{...
0bd0: 09 2f 2f 20 c8 f1 ef ee eb fc e7 f3 e5 f2 f1 ff .// ............
0be0: 20 46 4e 56 2d 31 61 20 e0 eb e3 ee f0 e8 f2 ec FNV-1a ........
0bf0: 0d 0a 09 09 2f 2f 20 68 74 74 70 3a 2f 2f 77 77 ....// http://ww
0c00: 77 2e 69 73 74 68 65 2e 63 6f 6d 2f 63 68 6f 6e w.isthe.com/chon
0c10: 67 6f 2f 74 65 63 68 2f 63 6f 6d 70 2f 66 6e 76 go/tech/comp/fnv
0c20: 2f 0d 0a 09 09 44 57 4f 52 44 20 68 3d 32 31 36 /....DWORD h=216
0c30: 36 31 33 36 32 36 31 75 6c 3b 0d 0a 09 09 77 68 6136261ul;....wh
0c40: 69 6c 65 28 44 57 4f 52 44 20 73 79 6d 62 3d 6d ile(DWORD symb=m
0c50: 5f 6c 6f 74 61 62 6c 65 5b 6e 63 6d 5f 73 79 6d _lotable[ncm_sym
0c60: 62 3a 3a 73 79 6d 62 6f 6c 28 6b 65 79 2b 2b 29 b::symbol(key++)
0c70: 5d 29 0d 0a 09 09 09 68 20 3d 20 28 68 20 5e 20 ]).....h = (h ^
0c80: 73 79 6d 62 29 20 2a 20 31 36 37 37 37 36 31 39 symb) * 16777619
0c90: 75 6c 3b 0d 0a 09 09 72 65 74 75 72 6e 20 68 3b ul;....return h;
0ca0: 0d 0a 09 7d 0d 0a 7d 3b 0d 0a 0d 0a 2f 2f 20 ce ...}..};....// .
0cb0: ef e8 f1 e0 ed e8 e5 20 f1 f2 f0 e0 f2 e5 e3 e8 ....... ........
0cc0: e9 20 f5 f0 e0 ed e5 ed e8 ff 2c 20 f3 f1 f2 e0 . ........, ....
0cd0: ed ee e2 ea e8 2c 20 ef ee eb f3 f7 e5 ed e8 ff ....., .........
0ce0: 20 ea eb fe f7 e5 e9 0d 0a 2f 2f 20 d1 f2 f0 e0 ........// ....
0cf0: f2 e5 e3 e8 ff 20 ef ee 20 f3 ec ee eb f7 e0 ed ..... .. .......
0d00: e8 fe 2e 0d 0a 73 74 72 75 63 74 20 64 65 66 61 .....struct defa
0d10: 75 6c 74 5f 6d 61 70 0d 0a 7b 0d 0a 09 74 79 70 ult_map..{...typ
0d20: 65 64 65 66 20 43 53 74 72 69 6e 67 20 6b 65 79 edef CString key
0d30: 5f 74 79 70 65 3b 09 09 09 09 2f 2f 20 d2 e8 ef _type;....// ...
0d40: 20 f5 f0 e0 ed e5 ed e8 ff 20 ea eb fe f7 e0 20 ........ .....
0d50: e2 20 43 41 73 73 6f 63 20 28 c4 ee eb e6 e5 ed . CAssoc (......
0d60: 20 ef f0 e8 e2 ee e4 e8 f2 f1 ff 20 ea 20 4c 50 .......... . LP
0d70: 43 53 54 52 29 0d 0a 09 74 79 70 65 64 65 66 20 CSTR)...typedef
0d80: 63 6f 6e 73 74 20 43 53 74 72 69 6e 67 26 20 6b const CString& k
0d90: 65 79 73 72 63 5f 74 79 70 65 3b 09 09 2f 2f 20 eysrc_type;..//
0da0: d2 e8 ef 20 ef e5 f0 e5 e4 e0 f7 e8 20 ea eb fe ... ........ ...
0db0: f7 e0 20 ef f0 e8 20 e7 e0 ed e5 f1 e5 ed e8 e8 .. ... .........
0dc0: 20 ef e0 f0 20 28 c4 ee eb e6 e5 ed 20 ef f0 e8 ... (...... ...
0dd0: e2 ee e4 e8 f2 f1 ff 20 ea 20 4c 50 43 53 54 52 ....... . LPCSTR
0de0: 29 0d 0a 09 74 79 70 65 64 65 66 20 43 53 74 72 )...typedef CStr
0df0: 69 6e 67 20 6b 65 79 64 73 74 5f 74 79 70 65 3b ing keydst_type;
0e00: 09 09 09 2f 2f 20 d2 e8 ef 20 ef f0 e8 e5 ec ed ...// ... ......
0e10: e8 ea e0 20 ea eb fe f7 e0 20 ef f0 e8 20 ee e1 ... ..... ... ..
0e20: f5 ee e4 e5 20 ea e0 f0 f2 fb 2e 20 28 c4 ee eb .... ...... (...
0e30: e6 e5 ed 20 ef f0 e8 f1 e2 e0 e8 e2 e0 f2 fc f1 ... ............
0e40: ff 20 e8 e7 20 6b 65 79 5f 74 79 70 65 29 0d 0a . .. key_type)..
0e50: 7d 3b 0d 0a 0d 0a 2f 2f 20 d5 f0 e0 ed e5 ed e8 };....// .......
0e60: e5 20 f7 e8 f1 f2 ee 20 f1 f1 fb eb ee ea 20 ed . ..... ...... .
0e70: e0 20 e2 ed e5 f8 ed e8 e5 20 ea eb fe f7 e8 0d . ....... ......
0e80: 0a 73 74 72 75 63 74 20 72 65 66 6b 65 79 5f 6d .struct refkey_m
0e90: 61 70 0d 0a 7b 0d 0a 09 74 79 70 65 64 65 66 20 ap..{...typedef
0ea0: 4c 50 43 53 54 52 20 6b 65 79 5f 74 79 70 65 3b LPCSTR key_type;
0eb0: 0d 0a 09 74 79 70 65 64 65 66 20 4c 50 43 53 54 ...typedef LPCST
0ec0: 52 20 6b 65 79 73 72 63 5f 74 79 70 65 3b 0d 0a R keysrc_type;..
0ed0: 09 74 79 70 65 64 65 66 20 4c 50 43 53 54 52 20 .typedef LPCSTR
0ee0: 6b 65 79 64 73 74 5f 74 79 70 65 3b 0d 0a 7d 3b keydst_type;..};
0ef0: 0d 0a 0d 0a 2f 2f 20 d5 f0 e0 ed e5 ed e8 e5 20 ....// ........
0f00: ea ee ef e8 e8 20 ea eb fe f7 e0 20 e1 e5 e7 20 ..... ..... ...
0f10: 43 53 74 72 69 6e 67 0d 0a 73 74 72 75 63 74 20 CString..struct
0f20: 63 68 61 72 63 6f 70 79 5f 6d 61 70 0d 0a 7b 0d charcopy_map..{.
0f30: 0a 09 73 74 72 75 63 74 20 6b 65 79 0d 0a 09 7b ..struct key...{
0f40: 0d 0a 09 09 6b 65 79 28 4c 50 43 53 54 52 20 70 ....key(LPCSTR p
0f50: 29 0d 0a 09 09 7b 0d 0a 09 09 09 69 6e 74 20 6c )....{.....int l
0f60: 65 6e 3d 73 74 72 6c 65 6e 28 70 29 3b 0d 0a 09 en=strlen(p);...
0f70: 09 09 70 74 72 3d 6e 65 77 20 63 68 61 72 5b 6c ..ptr=new char[l
0f80: 65 6e 2b 31 5d 3b 0d 0a 09 09 09 6d 65 6d 63 70 en+1];.....memcp
0f90: 79 28 70 74 72 2c 20 70 2c 20 6c 65 6e 29 3b 0d y(ptr, p, len);.
0fa0: 0a 09 09 09 70 74 72 5b 6c 65 6e 5d 3d 30 3b 0d ....ptr[len]=0;.
0fb0: 0a 09 09 7d 0d 0a 09 09 7e 6b 65 79 28 29 7b 64 ...}....~key(){d
0fc0: 65 6c 65 74 65 20 5b 5d 20 70 74 72 3b 7d 0d 0a elete [] ptr;}..
0fd0: 09 09 6f 70 65 72 61 74 6f 72 20 4c 50 43 53 54 ..operator LPCST
0fe0: 52 28 29 7b 72 65 74 75 72 6e 20 70 74 72 3b 7d R(){return ptr;}
0ff0: 0d 0a 09 09 4c 50 53 54 52 20 70 74 72 3b 0d 0a ....LPSTR ptr;..
1000: 09 7d 3b 0d 0a 09 74 79 70 65 64 65 66 20 6b 65 .};...typedef ke
1010: 79 20 6b 65 79 5f 74 79 70 65 3b 0d 0a 09 74 79 y key_type;...ty
1020: 70 65 64 65 66 20 4c 50 43 53 54 52 20 6b 65 79 pedef LPCSTR key
1030: 73 72 63 5f 74 79 70 65 3b 0d 0a 09 74 79 70 65 src_type;...type
1040: 64 65 66 20 4c 50 43 53 54 52 20 6b 65 79 64 73 def LPCSTR keyds
1050: 74 5f 74 79 70 65 3b 0d 0a 7d 3b 0d 0a 0d 0a 0d t_type;..};.....
1060: 0a 2f 2f 20 d1 ee e1 f1 f2 e2 e5 ed ed ee 2c 20 .// ..........,
1070: f1 e0 ec 20 f8 e0 e1 eb ee ed 2e 0d 0a 74 65 6d ... .........tem
1080: 70 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 20 54 plate<typename T
1090: 56 61 6c 2c 20 74 79 70 65 6e 61 6d 65 20 54 41 Val, typename TA
10a0: 72 67 3d 54 56 61 6c 2c 20 74 79 70 65 6e 61 6d rg=TVal, typenam
10b0: 65 20 53 3d 64 65 66 61 75 6c 74 5f 6d 61 70 3e e S=default_map>
10c0: 0d 0a 63 6c 61 73 73 20 43 4e 6f 43 61 73 65 4d ..class CNoCaseM
10d0: 61 70 20 3a 20 70 75 62 6c 69 63 20 43 4e 6f 43 ap : public CNoC
10e0: 61 73 65 4d 61 70 42 61 73 65 0d 0a 7b 0d 0a 70 aseMapBase..{..p
10f0: 75 62 6c 69 63 3a 0d 0a 09 74 79 70 65 64 65 66 ublic:...typedef
1100: 20 54 56 61 6c 20 76 61 6c 75 65 5f 74 79 70 65 TVal value_type
1110: 3b 0d 0a 09 74 79 70 65 64 65 66 20 54 41 72 67 ;...typedef TArg
1120: 20 76 61 6c 75 65 61 72 67 5f 74 79 70 65 3b 0d valuearg_type;.
1130: 0a 09 74 79 70 65 64 65 66 20 53 20 6d 61 70 5f ..typedef S map_
1140: 73 74 72 61 74 65 67 79 3b 0d 0a 09 74 79 70 65 strategy;...type
1150: 64 65 66 20 74 79 70 65 6e 61 6d 65 20 6d 61 70 def typename map
1160: 5f 73 74 72 61 74 65 67 79 3a 3a 6b 65 79 5f 74 _strategy::key_t
1170: 79 70 65 20 6b 65 79 5f 74 79 70 65 3b 0d 0a 09 ype key_type;...
1180: 74 79 70 65 64 65 66 20 74 79 70 65 6e 61 6d 65 typedef typename
1190: 20 6d 61 70 5f 73 74 72 61 74 65 67 79 3a 3a 6b map_strategy::k
11a0: 65 79 73 72 63 5f 74 79 70 65 20 6b 65 79 73 72 eysrc_type keysr
11b0: 63 5f 74 79 70 65 3b 0d 0a 09 74 79 70 65 64 65 c_type;...typede
11c0: 66 20 74 79 70 65 6e 61 6d 65 20 6d 61 70 5f 73 f typename map_s
11d0: 74 72 61 74 65 67 79 3a 3a 6b 65 79 64 73 74 5f trategy::keydst_
11e0: 74 79 70 65 20 6b 65 79 64 73 74 5f 74 79 70 65 type keydst_type
11f0: 3b 0d 0a 0d 0a 09 43 4e 6f 43 61 73 65 4d 61 70 ;.....CNoCaseMap
1200: 28 29 20 3a 20 43 4e 6f 43 61 73 65 4d 61 70 42 () : CNoCaseMapB
1210: 61 73 65 28 29 7b 7d 0d 0a 09 7e 43 4e 6f 43 61 ase(){}...~CNoCa
1220: 73 65 4d 61 70 28 29 7b 52 65 6d 6f 76 65 41 6c seMap(){RemoveAl
1230: 6c 28 29 3b 7d 0d 0a 0d 0a 09 42 4f 4f 4c 20 49 l();}.....BOOL I
1240: 73 45 78 69 73 74 28 4c 50 43 53 54 52 20 6b 65 sExist(LPCSTR ke
1250: 79 29 20 63 6f 6e 73 74 0d 0a 09 7b 0d 0a 09 09 y) const...{....
1260: 44 57 4f 52 44 20 6e 46 75 6c 6c 48 61 73 68 3b DWORD nFullHash;
1270: 0d 0a 09 09 61 73 73 6f 63 2a 20 70 41 73 73 6f ....assoc* pAsso
1280: 63 20 3d 20 47 65 74 41 73 73 6f 63 41 74 28 6b c = GetAssocAt(k
1290: 65 79 2c 20 6e 46 75 6c 6c 48 61 73 68 29 3b 0d ey, nFullHash);.
12a0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 20 21 ...return NULL !
12b0: 3d 20 70 41 73 73 6f 63 3b 0d 0a 09 7d 0d 0a 0d = pAssoc;...}...
12c0: 0a 09 42 4f 4f 4c 20 4c 6f 6f 6b 75 70 28 4c 50 ..BOOL Lookup(LP
12d0: 43 53 54 52 20 6b 65 79 2c 20 76 61 6c 75 65 5f CSTR key, value_
12e0: 74 79 70 65 26 20 72 56 61 6c 75 65 29 20 63 6f type& rValue) co
12f0: 6e 73 74 0d 0a 09 7b 0d 0a 09 09 44 57 4f 52 44 nst...{....DWORD
1300: 20 6e 46 75 6c 6c 48 61 73 68 3b 0d 0a 09 09 61 nFullHash;....a
1310: 73 73 6f 63 2a 20 70 41 73 73 6f 63 20 3d 20 47 ssoc* pAssoc = G
1320: 65 74 41 73 73 6f 63 41 74 28 6b 65 79 2c 20 6e etAssocAt(key, n
1330: 46 75 6c 6c 48 61 73 68 29 3b 0d 0a 09 09 69 66 FullHash);....if
1340: 28 21 70 41 73 73 6f 63 29 0d 0a 09 09 09 72 65 (!pAssoc).....re
1350: 74 75 72 6e 20 46 41 4c 53 45 3b 0d 0a 09 09 72 turn FALSE;....r
1360: 56 61 6c 75 65 20 3d 20 70 41 73 73 6f 63 2d 3e Value = pAssoc->
1370: 76 61 6c 75 65 3b 0d 0a 09 09 72 65 74 75 72 6e value;....return
1380: 20 54 52 55 45 3b 0d 0a 09 7d 0d 0a 09 0d 0a 09 TRUE;...}......
1390: 42 4f 4f 4c 20 4c 6f 6f 6b 75 70 4b 65 79 28 4c BOOL LookupKey(L
13a0: 50 43 53 54 52 20 6b 65 79 2c 20 6b 65 79 64 73 PCSTR key, keyds
13b0: 74 5f 74 79 70 65 26 20 72 4b 65 79 29 20 63 6f t_type& rKey) co
13c0: 6e 73 74 0d 0a 09 7b 0d 0a 09 09 44 57 4f 52 44 nst...{....DWORD
13d0: 20 6e 46 75 6c 6c 48 61 73 68 3b 0d 0a 09 09 61 nFullHash;....a
13e0: 73 73 6f 63 2a 20 70 41 73 73 6f 63 20 3d 20 47 ssoc* pAssoc = G
13f0: 65 74 41 73 73 6f 63 41 74 28 6b 65 79 2c 20 6e etAssocAt(key, n
1400: 46 75 6c 6c 48 61 73 68 29 3b 0d 0a 09 09 69 66 FullHash);....if
1410: 28 21 70 41 73 73 6f 63 29 0d 0a 09 09 09 72 65 (!pAssoc).....re
1420: 74 75 72 6e 20 46 41 4c 53 45 3b 0d 0a 09 09 72 turn FALSE;....r
1430: 4b 65 79 20 3d 20 70 41 73 73 6f 63 2d 3e 6b 65 Key = pAssoc->ke
1440: 79 3b 0d 0a 09 09 72 65 74 75 72 6e 20 54 52 55 y;....return TRU
1450: 45 3b 0d 0a 09 7d 0d 0a 0d 0a 09 76 61 6c 75 65 E;...}.....value
1460: 5f 74 79 70 65 26 20 6f 70 65 72 61 74 6f 72 5b _type& operator[
1470: 5d 28 6b 65 79 73 72 63 5f 74 79 70 65 20 6b 65 ](keysrc_type ke
1480: 79 29 0d 0a 09 7b 0d 0a 09 09 44 57 4f 52 44 20 y)...{....DWORD
1490: 6e 46 75 6c 6c 48 61 73 68 3b 0d 0a 09 09 61 73 nFullHash;....as
14a0: 73 6f 63 2a 20 70 41 73 73 6f 63 3b 0d 0a 09 09 soc* pAssoc;....
14b0: 69 66 28 21 28 70 41 73 73 6f 63 20 3d 20 47 65 if(!(pAssoc = Ge
14c0: 74 41 73 73 6f 63 41 74 28 6b 65 79 2c 20 6e 46 tAssocAt(key, nF
14d0: 75 6c 6c 48 61 73 68 29 29 29 0d 0a 09 09 7b 0d ullHash)))....{.
14e0: 0a 09 09 09 69 66 28 21 6d 5f 70 48 61 73 68 54 ....if(!m_pHashT
14f0: 61 62 6c 65 20 7c 7c 20 6d 5f 6e 43 6f 75 6e 74 able || m_nCount
1500: 20 3e 3d 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 >= m_nHashTable
1510: 53 69 7a 65 20 2a 20 33 20 2f 20 34 29 0d 0a 09 Size * 3 / 4)...
1520: 09 09 09 50 72 65 70 65 61 72 65 48 61 73 68 54 ...PrepeareHashT
1530: 61 62 6c 65 28 6d 5f 6e 43 6f 75 6e 74 2b 31 29 able(m_nCount+1)
1540: 3b 0d 0a 09 09 09 2f 2f 20 69 74 20 64 6f 65 73 ;.....// it does
1550: 6e 27 74 20 65 78 69 73 74 2c 20 61 64 64 20 61 n't exist, add a
1560: 20 6e 65 77 20 41 73 73 6f 63 69 61 74 69 6f 6e new Association
1570: 0d 0a 09 09 09 70 41 73 73 6f 63 20 3d 20 73 74 .....pAssoc = st
1580: 61 74 69 63 5f 63 61 73 74 3c 61 73 73 6f 63 2a atic_cast<assoc*
1590: 3e 28 4e 65 77 41 73 73 6f 63 28 73 69 7a 65 6f >(NewAssoc(sizeo
15a0: 66 28 61 73 73 6f 63 29 29 29 3b 0d 0a 09 09 09 f(assoc)));.....
15b0: 70 41 73 73 6f 63 2d 3e 61 73 73 6f 63 3a 3a 61 pAssoc->assoc::a
15c0: 73 73 6f 63 28 6e 46 75 6c 6c 48 61 73 68 2c 20 ssoc(nFullHash,
15d0: 6d 5f 70 48 61 73 68 54 61 62 6c 65 5b 6e 46 75 m_pHashTable[nFu
15e0: 6c 6c 48 61 73 68 20 25 20 6d 5f 6e 48 61 73 68 llHash % m_nHash
15f0: 54 61 62 6c 65 53 69 7a 65 5d 2c 20 6b 65 79 29 TableSize], key)
1600: 3b 0d 0a 09 09 7d 0d 0a 09 09 72 65 74 75 72 6e ;....}....return
1610: 20 70 41 73 73 6f 63 2d 3e 76 61 6c 75 65 3b 20 pAssoc->value;
1620: 20 2f 2f 20 72 65 74 75 72 6e 20 6e 65 77 20 72 // return new r
1630: 65 66 65 72 65 6e 63 65 0d 0a 09 7d 0d 0a 09 76 eference...}...v
1640: 6f 69 64 20 53 65 74 41 74 28 6b 65 79 73 72 63 oid SetAt(keysrc
1650: 5f 74 79 70 65 20 6b 65 79 2c 20 76 61 6c 75 65 _type key, value
1660: 61 72 67 5f 74 79 70 65 20 6e 65 77 56 61 6c 75 arg_type newValu
1670: 65 29 7b 28 2a 74 68 69 73 29 5b 6b 65 79 5d 3d e){(*this)[key]=
1680: 6e 65 77 56 61 6c 75 65 3b 7d 0d 0a 0d 0a 09 2f newValue;}...../
1690: 2f 20 cf ee e7 e2 ee eb ff e5 f2 20 e2 f1 f2 e0 / ......... ....
16a0: e2 e8 f2 fc 20 e7 ed e0 f7 e5 ed e8 e5 20 e8 20 .... ........ .
16b0: e2 ee e7 e2 f0 e0 f9 e0 e5 f2 20 54 52 55 45 2c .......... TRUE,
16c0: 20 e5 f1 eb e8 20 f2 e0 ea ee e9 20 ea eb fe f7 .... ..... ....
16d0: 20 f3 e6 e5 20 f1 f3 f9 e5 f1 f2 e2 ee e2 e0 eb ... ...........
16e0: 2c 0d 0a 09 2f 2f 20 e8 20 46 41 4c 53 45 2c 20 ,...// . FALSE,
16f0: e5 f1 eb e8 20 f2 e0 ea ee e3 ee 20 ea eb fe f7 .... ...... ....
1700: e0 20 ed e5 20 e1 fb eb ee 0d 0a 09 42 4f 4f 4c . .. .......BOOL
1710: 20 49 6e 73 65 72 74 45 78 69 73 74 28 6b 65 79 InsertExist(key
1720: 73 72 63 5f 74 79 70 65 20 6b 65 79 2c 20 76 61 src_type key, va
1730: 6c 75 65 61 72 67 5f 74 79 70 65 20 6e 65 77 56 luearg_type newV
1740: 61 6c 75 65 2c 20 42 4f 4f 4c 20 62 52 65 70 6c alue, BOOL bRepl
1750: 61 63 65 3d 46 41 4c 53 45 29 0d 0a 09 7b 0d 0a ace=FALSE)...{..
1760: 09 09 44 57 4f 52 44 20 6e 46 75 6c 6c 48 61 73 ..DWORD nFullHas
1770: 68 3b 0d 0a 09 09 61 73 73 6f 63 2a 20 70 41 73 h;....assoc* pAs
1780: 73 6f 63 3b 0d 0a 09 09 42 4f 4f 4c 20 62 52 65 soc;....BOOL bRe
1790: 74 3b 0d 0a 09 09 69 66 28 70 41 73 73 6f 63 20 t;....if(pAssoc
17a0: 3d 20 47 65 74 41 73 73 6f 63 41 74 28 6b 65 79 = GetAssocAt(key
17b0: 2c 20 6e 46 75 6c 6c 48 61 73 68 29 29 0d 0a 09 , nFullHash))...
17c0: 09 7b 0d 0a 09 09 09 69 66 28 21 62 52 65 70 6c .{.....if(!bRepl
17d0: 61 63 65 29 0d 0a 09 09 09 09 72 65 74 75 72 6e ace)......return
17e0: 20 54 52 55 45 3b 0d 0a 09 09 09 62 52 65 74 3d TRUE;.....bRet=
17f0: 54 52 55 45 3b 0d 0a 09 09 7d 0d 0a 09 09 65 6c TRUE;....}....el
1800: 73 65 0d 0a 09 09 7b 0d 0a 09 09 09 62 52 65 74 se....{.....bRet
1810: 3d 46 41 4c 53 45 3b 0d 0a 09 09 09 69 66 28 21 =FALSE;.....if(!
1820: 6d 5f 70 48 61 73 68 54 61 62 6c 65 20 7c 7c 20 m_pHashTable ||
1830: 6d 5f 6e 43 6f 75 6e 74 20 3e 3d 20 6d 5f 6e 48 m_nCount >= m_nH
1840: 61 73 68 54 61 62 6c 65 53 69 7a 65 20 2f 20 33 ashTableSize / 3
1850: 20 2a 20 32 29 0d 0a 09 09 09 09 50 72 65 70 65 * 2)......Prepe
1860: 61 72 65 48 61 73 68 54 61 62 6c 65 28 6d 5f 6e areHashTable(m_n
1870: 43 6f 75 6e 74 2b 31 29 3b 0d 0a 09 09 09 70 41 Count+1);.....pA
1880: 73 73 6f 63 20 3d 20 73 74 61 74 69 63 5f 63 61 ssoc = static_ca
1890: 73 74 3c 61 73 73 6f 63 2a 3e 28 4e 65 77 41 73 st<assoc*>(NewAs
18a0: 73 6f 63 28 73 69 7a 65 6f 66 28 61 73 73 6f 63 soc(sizeof(assoc
18b0: 29 29 29 3b 0d 0a 09 09 09 70 41 73 73 6f 63 2d )));.....pAssoc-
18c0: 3e 61 73 73 6f 63 3a 3a 61 73 73 6f 63 28 6e 46 >assoc::assoc(nF
18d0: 75 6c 6c 48 61 73 68 2c 20 6d 5f 70 48 61 73 68 ullHash, m_pHash
18e0: 54 61 62 6c 65 5b 6e 46 75 6c 6c 48 61 73 68 20 Table[nFullHash
18f0: 25 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 % m_nHashTableSi
1900: 7a 65 5d 2c 20 6b 65 79 29 3b 0d 0a 09 09 7d 0d ze], key);....}.
1910: 0a 09 09 70 41 73 73 6f 63 2d 3e 76 61 6c 75 65 ...pAssoc->value
1920: 3d 6e 65 77 56 61 6c 75 65 3b 0d 0a 09 09 72 65 =newValue;....re
1930: 74 75 72 6e 20 62 52 65 74 3b 0d 0a 09 7d 0d 0a turn bRet;...}..
1940: 0d 0a 09 42 4f 4f 4c 20 52 65 6d 6f 76 65 4b 65 ...BOOL RemoveKe
1950: 79 28 4c 50 43 53 54 52 20 6b 65 79 29 0d 0a 09 y(LPCSTR key)...
1960: 7b 0d 0a 09 09 69 66 28 21 6d 5f 70 48 61 73 68 {....if(!m_pHash
1970: 54 61 62 6c 65 20 7c 7c 20 21 6d 5f 6e 43 6f 75 Table || !m_nCou
1980: 6e 74 29 0d 0a 09 09 09 72 65 74 75 72 6e 20 46 nt).....return F
1990: 41 4c 53 45 3b 0d 0a 09 09 44 57 4f 52 44 20 6e ALSE;....DWORD n
19a0: 46 75 6c 6c 48 61 73 68 20 3d 20 47 65 74 48 61 FullHash = GetHa
19b0: 73 68 28 6b 65 79 29 3b 0d 0a 09 09 43 41 73 73 sh(key);....CAss
19c0: 6f 63 2a 2a 20 70 70 41 73 73 6f 63 50 72 65 76 oc** ppAssocPrev
19d0: 20 3d 20 26 6d 5f 70 48 61 73 68 54 61 62 6c 65 = &m_pHashTable
19e0: 5b 6e 46 75 6c 6c 48 61 73 68 20 25 20 6d 5f 6e [nFullHash % m_n
19f0: 48 61 73 68 54 61 62 6c 65 53 69 7a 65 5d 3b 0d HashTableSize];.
1a00: 0a 0d 0a 09 09 61 73 73 6f 63 2a 20 70 41 73 73 .....assoc* pAss
1a10: 6f 63 3b 0d 0a 09 09 66 6f 72 28 70 41 73 73 6f oc;....for(pAsso
1a20: 63 20 3d 20 73 74 61 74 69 63 5f 63 61 73 74 3c c = static_cast<
1a30: 61 73 73 6f 63 2a 3e 28 2a 70 70 41 73 73 6f 63 assoc*>(*ppAssoc
1a40: 50 72 65 76 29 3b 20 70 41 73 73 6f 63 20 3b 20 Prev); pAssoc ;
1a50: 70 41 73 73 6f 63 20 3d 20 73 74 61 74 69 63 5f pAssoc = static_
1a60: 63 61 73 74 3c 61 73 73 6f 63 2a 3e 28 70 41 73 cast<assoc*>(pAs
1a70: 73 6f 63 2d 3e 70 4e 65 78 74 29 29 0d 0a 09 09 soc->pNext))....
1a80: 7b 0d 0a 09 09 09 69 66 28 70 41 73 73 6f 63 2d {.....if(pAssoc-
1a90: 3e 6e 48 61 73 68 56 61 6c 75 65 20 3d 3d 20 6e >nHashValue == n
1aa0: 46 75 6c 6c 48 61 73 68 20 26 26 20 49 73 53 74 FullHash && IsSt
1ab0: 72 45 71 75 61 6c 28 70 41 73 73 6f 63 2d 3e 6b rEqual(pAssoc->k
1ac0: 65 79 2c 20 6b 65 79 29 29 0d 0a 09 09 09 7b 0d ey, key)).....{.
1ad0: 0a 09 09 09 09 2a 70 70 41 73 73 6f 63 50 72 65 .....*ppAssocPre
1ae0: 76 20 3d 20 70 41 73 73 6f 63 2d 3e 70 4e 65 78 v = pAssoc->pNex
1af0: 74 3b 0d 0a 09 09 09 09 70 41 73 73 6f 63 2d 3e t;......pAssoc->
1b00: 7e 61 73 73 6f 63 28 29 3b 0d 0a 09 09 09 09 46 ~assoc();......F
1b10: 72 65 65 41 73 73 6f 63 28 70 41 73 73 6f 63 29 reeAssoc(pAssoc)
1b20: 3b 0d 0a 09 09 09 09 69 66 28 6d 5f 6e 43 6f 75 ;......if(m_nCou
1b30: 6e 74 20 3c 20 6d 5f 6e 48 61 73 68 54 61 62 6c nt < m_nHashTabl
1b40: 65 53 69 7a 65 2f 32 29 0d 0a 09 09 09 09 09 50 eSize/2).......P
1b50: 72 65 70 65 61 72 65 48 61 73 68 54 61 62 6c 65 repeareHashTable
1b60: 28 6d 5f 6e 43 6f 75 6e 74 29 3b 0d 0a 09 09 09 (m_nCount);.....
1b70: 09 72 65 74 75 72 6e 20 54 52 55 45 3b 0d 0a 09 .return TRUE;...
1b80: 09 09 7d 0d 0a 09 09 09 70 70 41 73 73 6f 63 50 ..}.....ppAssocP
1b90: 72 65 76 20 3d 20 26 70 41 73 73 6f 63 2d 3e 70 rev = &pAssoc->p
1ba0: 4e 65 78 74 3b 0d 0a 09 09 7d 0d 0a 09 09 72 65 Next;....}....re
1bb0: 74 75 72 6e 20 46 41 4c 53 45 3b 0d 0a 09 7d 0d turn FALSE;...}.
1bc0: 0a 09 0d 0a 09 42 4f 4f 4c 20 52 65 6d 6f 76 65 .....BOOL Remove
1bd0: 50 61 69 72 28 4c 50 43 53 54 52 20 6b 65 79 2c Pair(LPCSTR key,
1be0: 20 76 61 6c 75 65 61 72 67 5f 74 79 70 65 20 76 valuearg_type v
1bf0: 61 6c 75 65 29 0d 0a 09 7b 0d 0a 09 09 69 66 28 alue)...{....if(
1c00: 21 6d 5f 70 48 61 73 68 54 61 62 6c 65 20 7c 7c !m_pHashTable ||
1c10: 20 21 6d 5f 6e 43 6f 75 6e 74 29 0d 0a 09 09 09 !m_nCount).....
1c20: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0d 0a 09 return FALSE;...
1c30: 09 44 57 4f 52 44 20 6e 46 75 6c 6c 48 61 73 68 .DWORD nFullHash
1c40: 20 3d 20 47 65 74 48 61 73 68 28 6b 65 79 29 3b = GetHash(key);
1c50: 0d 0a 09 09 43 41 73 73 6f 63 2a 2a 20 70 70 41 ....CAssoc** ppA
1c60: 73 73 6f 63 50 72 65 76 20 3d 20 26 6d 5f 70 48 ssocPrev = &m_pH
1c70: 61 73 68 54 61 62 6c 65 5b 6e 46 75 6c 6c 48 61 ashTable[nFullHa
1c80: 73 68 20 25 20 6d 5f 6e 48 61 73 68 54 61 62 6c sh % m_nHashTabl
1c90: 65 53 69 7a 65 5d 3b 0d 0a 0d 0a 09 09 61 73 73 eSize];......ass
1ca0: 6f 63 2a 20 70 41 73 73 6f 63 3b 0d 0a 09 09 66 oc* pAssoc;....f
1cb0: 6f 72 28 70 41 73 73 6f 63 20 3d 20 73 74 61 74 or(pAssoc = stat
1cc0: 69 63 5f 63 61 73 74 3c 61 73 73 6f 63 2a 3e 28 ic_cast<assoc*>(
1cd0: 2a 70 70 41 73 73 6f 63 50 72 65 76 29 3b 20 70 *ppAssocPrev); p
1ce0: 41 73 73 6f 63 20 3b 20 70 41 73 73 6f 63 20 3d Assoc ; pAssoc =
1cf0: 20 73 74 61 74 69 63 5f 63 61 73 74 3c 61 73 73 static_cast<ass
1d00: 6f 63 2a 3e 28 70 41 73 73 6f 63 2d 3e 70 4e 65 oc*>(pAssoc->pNe
1d10: 78 74 29 29 0d 0a 09 09 7b 0d 0a 09 09 09 69 66 xt))....{.....if
1d20: 28 70 41 73 73 6f 63 2d 3e 6e 48 61 73 68 56 61 (pAssoc->nHashVa
1d30: 6c 75 65 20 3d 3d 20 6e 46 75 6c 6c 48 61 73 68 lue == nFullHash
1d40: 20 26 26 20 49 73 53 74 72 45 71 75 61 6c 28 70 && IsStrEqual(p
1d50: 41 73 73 6f 63 2d 3e 6b 65 79 2c 20 6b 65 79 29 Assoc->key, key)
1d60: 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 69 66 28 ).....{......if(
1d70: 70 41 73 73 6f 63 2d 3e 76 61 6c 75 65 20 3d 3d pAssoc->value ==
1d80: 20 76 61 6c 75 65 29 0d 0a 09 09 09 09 7b 0d 0a value)......{..
1d90: 09 09 09 09 09 2a 70 70 41 73 73 6f 63 50 72 65 .....*ppAssocPre
1da0: 76 20 3d 20 70 41 73 73 6f 63 2d 3e 70 4e 65 78 v = pAssoc->pNex
1db0: 74 3b 0d 0a 09 09 09 09 09 70 41 73 73 6f 63 2d t;.......pAssoc-
1dc0: 3e 7e 61 73 73 6f 63 28 29 3b 0d 0a 09 09 09 09 >~assoc();......
1dd0: 09 46 72 65 65 41 73 73 6f 63 28 70 41 73 73 6f .FreeAssoc(pAsso
1de0: 63 29 3b 0d 0a 09 09 09 09 09 69 66 28 6d 5f 6e c);.......if(m_n
1df0: 43 6f 75 6e 74 20 3c 20 6d 5f 6e 48 61 73 68 54 Count < m_nHashT
1e00: 61 62 6c 65 53 69 7a 65 2f 32 29 0d 0a 09 09 09 ableSize/2).....
1e10: 09 09 09 50 72 65 70 65 61 72 65 48 61 73 68 54 ...PrepeareHashT
1e20: 61 62 6c 65 28 6d 5f 6e 43 6f 75 6e 74 29 3b 0d able(m_nCount);.
1e30: 0a 09 09 09 09 09 72 65 74 75 72 6e 20 54 52 55 ......return TRU
1e40: 45 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 09 72 E;......}......r
1e50: 65 74 75 72 6e 20 46 41 4c 53 45 3b 0d 0a 09 09 eturn FALSE;....
1e60: 09 7d 0d 0a 09 09 09 70 70 41 73 73 6f 63 50 72 .}.....ppAssocPr
1e70: 65 76 20 3d 20 26 70 41 73 73 6f 63 2d 3e 70 4e ev = &pAssoc->pN
1e80: 65 78 74 3b 0d 0a 09 09 7d 0d 0a 09 09 72 65 74 ext;....}....ret
1e90: 75 72 6e 20 46 41 4c 53 45 3b 0d 0a 09 7d 0d 0a urn FALSE;...}..
1ea0: 09 0d 0a 09 76 6f 69 64 20 52 65 6d 6f 76 65 41 ....void RemoveA
1eb0: 6c 6c 28 29 0d 0a 09 7b 0d 0a 09 09 69 66 28 44 ll()...{....if(D
1ec0: 57 4f 52 44 20 63 6f 75 6e 74 3d 6d 5f 6e 43 6f WORD count=m_nCo
1ed0: 75 6e 74 29 0d 0a 09 09 7b 0d 0a 09 09 09 61 73 unt)....{.....as
1ee0: 73 6f 63 20 2a 2a 70 70 41 73 73 6f 63 3d 72 65 soc **ppAssoc=re
1ef0: 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c 61 interpret_cast<a
1f00: 73 73 6f 63 2a 2a 3e 28 6d 5f 70 48 61 73 68 54 ssoc**>(m_pHashT
1f10: 61 62 6c 65 29 2c 20 2a 70 41 73 73 6f 63 3d 2a able), *pAssoc=*
1f20: 70 70 41 73 73 6f 63 3b 0d 0a 09 09 09 77 68 69 ppAssoc;.....whi
1f30: 6c 65 28 21 70 41 73 73 6f 63 29 0d 0a 09 09 09 le(!pAssoc).....
1f40: 09 70 41 73 73 6f 63 3d 2a 2b 2b 70 70 41 73 73 .pAssoc=*++ppAss
1f50: 6f 63 3b 0d 0a 09 09 09 66 6f 72 28 3b 3b 29 0d oc;.....for(;;).
1f60: 0a 09 09 09 7b 0d 0a 09 09 09 09 61 73 73 6f 63 ....{......assoc
1f70: 2a 20 70 4e 65 78 74 3d 73 74 61 74 69 63 5f 63 * pNext=static_c
1f80: 61 73 74 3c 61 73 73 6f 63 2a 3e 28 70 41 73 73 ast<assoc*>(pAss
1f90: 6f 63 2d 3e 70 4e 65 78 74 29 3b 0d 0a 09 09 09 oc->pNext);.....
1fa0: 09 70 41 73 73 6f 63 2d 3e 7e 61 73 73 6f 63 28 .pAssoc->~assoc(
1fb0: 29 3b 0d 0a 09 09 09 09 69 66 28 21 2d 2d 63 6f );......if(!--co
1fc0: 75 6e 74 29 0d 0a 09 09 09 09 09 62 72 65 61 6b unt).......break
1fd0: 3b 0d 0a 09 09 09 09 77 68 69 6c 65 28 21 70 4e ;......while(!pN
1fe0: 65 78 74 29 0d 0a 09 09 09 09 09 70 4e 65 78 74 ext).......pNext
1ff0: 3d 2a 2b 2b 70 70 41 73 73 6f 63 3b 0d 0a 09 09 =*++ppAssoc;....
2000: 09 09 70 41 73 73 6f 63 3d 70 4e 65 78 74 3b 0d ..pAssoc=pNext;.
2010: 0a 09 09 09 7d 0d 0a 09 09 7d 0d 0a 09 09 44 65 ....}....}....De
2020: 6c 65 74 65 41 6c 6c 28 29 3b 0d 0a 09 7d 0d 0a leteAll();...}..
2030: 0d 0a 09 76 6f 69 64 20 47 65 74 4e 65 78 74 41 ...void GetNextA
2040: 73 73 6f 63 28 50 4f 53 49 54 49 4f 4e 26 20 72 ssoc(POSITION& r
2050: 4e 65 78 74 50 6f 73 69 74 69 6f 6e 2c 20 6b 65 NextPosition, ke
2060: 79 64 73 74 5f 74 79 70 65 26 20 72 4b 65 79 2c ydst_type& rKey,
2070: 20 76 61 6c 75 65 5f 74 79 70 65 26 20 72 56 61 value_type& rVa
2080: 6c 75 65 29 20 63 6f 6e 73 74 0d 0a 09 7b 0d 0a lue) const...{..
2090: 09 09 61 73 73 6f 63 2a 20 70 41 73 73 6f 63 52 ..assoc* pAssocR
20a0: 65 74 20 3d 20 72 65 69 6e 74 65 72 70 72 65 74 et = reinterpret
20b0: 5f 63 61 73 74 3c 61 73 73 6f 63 2a 3e 28 72 4e _cast<assoc*>(rN
20c0: 65 78 74 50 6f 73 69 74 69 6f 6e 29 3b 0d 0a 09 extPosition);...
20d0: 09 69 66 28 70 41 73 73 6f 63 52 65 74 20 3d 3d .if(pAssocRet ==
20e0: 20 72 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 reinterpret_cas
20f0: 74 3c 61 73 73 6f 63 2a 3e 28 42 45 46 4f 52 45 t<assoc*>(BEFORE
2100: 5f 53 54 41 52 54 5f 50 4f 53 49 54 49 4f 4e 29 _START_POSITION)
2110: 29 0d 0a 09 09 7b 0d 0a 09 09 09 43 41 73 73 6f )....{.....CAsso
2120: 63 2a 2a 20 70 70 41 73 73 6f 63 3d 6d 5f 70 48 c** ppAssoc=m_pH
2130: 61 73 68 54 61 62 6c 65 3b 0d 0a 09 09 09 77 68 ashTable;.....wh
2140: 69 6c 65 28 21 28 70 41 73 73 6f 63 52 65 74 3d ile(!(pAssocRet=
2150: 73 74 61 74 69 63 5f 63 61 73 74 3c 61 73 73 6f static_cast<asso
2160: 63 2a 3e 28 2a 70 70 41 73 73 6f 63 2b 2b 29 29 c*>(*ppAssoc++))
2170: 29 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 43 41 73 );....}......CAs
2180: 73 6f 63 2a 20 70 41 73 73 6f 63 4e 65 78 74 3d soc* pAssocNext=
2190: 70 41 73 73 6f 63 52 65 74 2d 3e 70 4e 65 78 74 pAssocRet->pNext
21a0: 3b 0d 0a 09 09 69 66 28 21 70 41 73 73 6f 63 4e ;....if(!pAssocN
21b0: 65 78 74 29 0d 0a 09 09 7b 0d 0a 09 09 09 66 6f ext)....{.....fo
21c0: 72 28 44 57 4f 52 44 20 69 64 78 20 3d 20 70 41 r(DWORD idx = pA
21d0: 73 73 6f 63 52 65 74 2d 3e 6e 48 61 73 68 56 61 ssocRet->nHashVa
21e0: 6c 75 65 20 25 20 6d 5f 6e 48 61 73 68 54 61 62 lue % m_nHashTab
21f0: 6c 65 53 69 7a 65 20 2b 20 31 3b 0d 0a 09 09 09 leSize + 1;.....
2200: 09 69 64 78 20 3c 20 6d 5f 6e 48 61 73 68 54 61 .idx < m_nHashTa
2210: 62 6c 65 53 69 7a 65 3b 20 2b 2b 69 64 78 29 0d bleSize; ++idx).
2220: 0a 09 09 09 09 69 66 28 70 41 73 73 6f 63 4e 65 .....if(pAssocNe
2230: 78 74 20 3d 20 6d 5f 70 48 61 73 68 54 61 62 6c xt = m_pHashTabl
2240: 65 5b 69 64 78 5d 29 0d 0a 09 09 09 09 09 62 72 e[idx]).......br
2250: 65 61 6b 3b 0d 0a 09 09 7d 0d 0a 0d 0a 09 09 72 eak;....}......r
2260: 4e 65 78 74 50 6f 73 69 74 69 6f 6e 20 3d 20 72 NextPosition = r
2270: 65 69 6e 74 65 72 70 72 65 74 5f 63 61 73 74 3c einterpret_cast<
2280: 50 4f 53 49 54 49 4f 4e 3e 28 70 41 73 73 6f 63 POSITION>(pAssoc
2290: 4e 65 78 74 29 3b 0d 0a 09 09 2f 2f 20 66 69 6c Next);....// fil
22a0: 6c 20 69 6e 20 72 65 74 75 72 6e 20 64 61 74 61 l in return data
22b0: 0d 0a 09 09 72 4b 65 79 20 3d 20 70 41 73 73 6f ....rKey = pAsso
22c0: 63 52 65 74 2d 3e 6b 65 79 3b 0d 0a 09 09 72 56 cRet->key;....rV
22d0: 61 6c 75 65 20 3d 20 70 41 73 73 6f 63 52 65 74 alue = pAssocRet
22e0: 2d 3e 76 61 6c 75 65 3b 0d 0a 09 7d 0d 0a 09 74 ->value;...}...t
22f0: 65 6d 70 6c 61 74 65 3c 74 79 70 65 6e 61 6d 65 emplate<typename
2300: 20 4f 70 3e 0d 0a 09 76 6f 69 64 20 46 6f 72 45 Op>...void ForE
2310: 61 63 68 56 61 6c 75 65 28 4f 70 20 6f 70 29 0d achValue(Op op).
2320: 0a 09 7b 0d 0a 09 09 69 66 28 44 57 4f 52 44 20 ..{....if(DWORD
2330: 63 6f 75 6e 74 3d 6d 5f 6e 43 6f 75 6e 74 29 0d count=m_nCount).
2340: 0a 09 09 7b 0d 0a 09 09 09 61 73 73 6f 63 20 2a ...{.....assoc *
2350: 2a 70 70 41 73 73 6f 63 3d 72 65 69 6e 74 65 72 *ppAssoc=reinter
2360: 70 72 65 74 5f 63 61 73 74 3c 61 73 73 6f 63 2a pret_cast<assoc*
2370: 2a 3e 28 6d 5f 70 48 61 73 68 54 61 62 6c 65 29 *>(m_pHashTable)
2380: 2c 20 2a 70 41 73 73 6f 63 3d 2a 70 70 41 73 73 , *pAssoc=*ppAss
2390: 6f 63 3b 0d 0a 09 09 09 77 68 69 6c 65 28 21 70 oc;.....while(!p
23a0: 41 73 73 6f 63 29 0d 0a 09 09 09 09 70 41 73 73 Assoc)......pAss
23b0: 6f 63 3d 2a 2b 2b 70 70 41 73 73 6f 63 3b 0d 0a oc=*++ppAssoc;..
23c0: 09 09 09 66 6f 72 28 3b 3b 29 0d 0a 09 09 09 7b ...for(;;).....{
23d0: 0d 0a 09 09 09 09 61 73 73 6f 63 2a 20 70 4e 65 ......assoc* pNe
23e0: 78 74 3d 73 74 61 74 69 63 5f 63 61 73 74 3c 61 xt=static_cast<a
23f0: 73 73 6f 63 2a 3e 28 70 41 73 73 6f 63 2d 3e 70 ssoc*>(pAssoc->p
2400: 4e 65 78 74 29 3b 0d 0a 09 09 09 09 6f 70 28 70 Next);......op(p
2410: 41 73 73 6f 63 2d 3e 76 61 6c 75 65 29 3b 0d 0a Assoc->value);..
2420: 09 09 09 09 69 66 28 21 2d 2d 63 6f 75 6e 74 29 ....if(!--count)
2430: 0d 0a 09 09 09 09 09 62 72 65 61 6b 3b 0d 0a 09 .......break;...
2440: 09 09 09 77 68 69 6c 65 28 21 70 4e 65 78 74 29 ...while(!pNext)
2450: 0d 0a 09 09 09 09 09 70 4e 65 78 74 3d 2a 2b 2b .......pNext=*++
2460: 70 70 41 73 73 6f 63 3b 0d 0a 09 09 09 09 70 41 ppAssoc;......pA
2470: 73 73 6f 63 3d 70 4e 65 78 74 3b 0d 0a 09 09 09 ssoc=pNext;.....
2480: 7d 0d 0a 09 09 7d 0d 0a 09 7d 0d 0a 09 0d 0a 09 }....}...}......
2490: 74 65 6d 70 6c 61 74 65 3c 74 79 70 65 6e 61 6d template<typenam
24a0: 65 20 4f 70 3e 0d 0a 09 76 6f 69 64 20 46 6f 72 e Op>...void For
24b0: 45 61 63 68 50 61 69 72 28 4f 70 20 6f 70 29 0d EachPair(Op op).
24c0: 0a 09 7b 0d 0a 09 09 69 66 28 44 57 4f 52 44 20 ..{....if(DWORD
24d0: 63 6f 75 6e 74 3d 6d 5f 6e 43 6f 75 6e 74 29 0d count=m_nCount).
24e0: 0a 09 09 7b 0d 0a 09 09 09 61 73 73 6f 63 20 2a ...{.....assoc *
24f0: 2a 70 70 41 73 73 6f 63 3d 72 65 69 6e 74 65 72 *ppAssoc=reinter
2500: 70 72 65 74 5f 63 61 73 74 3c 61 73 73 6f 63 2a pret_cast<assoc*
2510: 2a 3e 28 6d 5f 70 48 61 73 68 54 61 62 6c 65 29 *>(m_pHashTable)
2520: 2c 20 2a 70 41 73 73 6f 63 3d 2a 70 70 41 73 73 , *pAssoc=*ppAss
2530: 6f 63 3b 0d 0a 09 09 09 77 68 69 6c 65 28 21 70 oc;.....while(!p
2540: 41 73 73 6f 63 29 0d 0a 09 09 09 09 70 41 73 73 Assoc)......pAss
2550: 6f 63 3d 2a 2b 2b 70 70 41 73 73 6f 63 3b 0d 0a oc=*++ppAssoc;..
2560: 09 09 09 66 6f 72 28 3b 3b 29 0d 0a 09 09 09 7b ...for(;;).....{
2570: 0d 0a 09 09 09 09 61 73 73 6f 63 2a 20 70 4e 65 ......assoc* pNe
2580: 78 74 3d 73 74 61 74 69 63 5f 63 61 73 74 3c 61 xt=static_cast<a
2590: 73 73 6f 63 2a 3e 28 70 41 73 73 6f 63 2d 3e 70 ssoc*>(pAssoc->p
25a0: 4e 65 78 74 29 3b 0d 0a 09 09 09 09 6f 70 28 70 Next);......op(p
25b0: 41 73 73 6f 63 2d 3e 6b 65 79 2c 20 70 41 73 73 Assoc->key, pAss
25c0: 6f 63 2d 3e 76 61 6c 75 65 29 3b 0d 0a 09 09 09 oc->value);.....
25d0: 09 69 66 28 21 2d 2d 63 6f 75 6e 74 29 0d 0a 09 .if(!--count)...
25e0: 09 09 09 09 62 72 65 61 6b 3b 0d 0a 09 09 09 09 ....break;......
25f0: 77 68 69 6c 65 28 21 70 4e 65 78 74 29 0d 0a 09 while(!pNext)...
2600: 09 09 09 09 70 4e 65 78 74 3d 2a 2b 2b 70 70 41 ....pNext=*++ppA
2610: 73 73 6f 63 3b 0d 0a 09 09 09 09 70 41 73 73 6f ssoc;......pAsso
2620: 63 3d 70 4e 65 78 74 3b 0d 0a 09 09 09 7d 0d 0a c=pNext;.....}..
2630: 09 09 7d 0d 0a 09 7d 0d 0a 70 72 6f 74 65 63 74 ..}...}..protect
2640: 65 64 3a 0d 0a 09 2f 2f 20 41 73 73 6f 63 69 61 ed:...// Associa
2650: 74 69 6f 6e 0d 0a 09 73 74 72 75 63 74 20 61 73 tion...struct as
2660: 73 6f 63 20 3a 20 43 4e 6f 43 61 73 65 4d 61 70 soc : CNoCaseMap
2670: 42 61 73 65 3a 3a 43 41 73 73 6f 63 0d 0a 09 7b Base::CAssoc...{
2680: 0d 0a 09 09 61 73 73 6f 63 28 44 57 4f 52 44 20 ....assoc(DWORD
2690: 6e 48 61 73 68 2c 20 43 41 73 73 6f 63 2a 26 20 nHash, CAssoc*&
26a0: 70 48 61 73 68 54 2c 20 6b 65 79 73 72 63 5f 74 pHashT, keysrc_t
26b0: 79 70 65 20 6b 29 3a 43 41 73 73 6f 63 28 6e 48 ype k):CAssoc(nH
26c0: 61 73 68 2c 20 70 48 61 73 68 54 29 2c 20 6b 65 ash, pHashT), ke
26d0: 79 28 6b 29 7b 7d 0d 0a 09 09 6b 65 79 5f 74 79 y(k){}....key_ty
26e0: 70 65 20 6b 65 79 3b 0d 0a 09 09 76 61 6c 75 65 pe key;....value
26f0: 5f 74 79 70 65 20 76 61 6c 75 65 3b 0d 0a 09 7d _type value;...}
2700: 3b 0d 0a 09 0d 0a 09 61 73 73 6f 63 2a 20 47 65 ;......assoc* Ge
2710: 74 41 73 73 6f 63 41 74 28 4c 50 43 53 54 52 20 tAssocAt(LPCSTR
2720: 6b 65 79 2c 20 44 57 4f 52 44 26 20 6e 46 75 6c key, DWORD& nFul
2730: 6c 48 61 73 68 29 20 63 6f 6e 73 74 0d 0a 09 7b lHash) const...{
2740: 0d 0a 09 09 6e 46 75 6c 6c 48 61 73 68 20 3d 20 ....nFullHash =
2750: 47 65 74 48 61 73 68 28 6b 65 79 29 3b 0d 0a 09 GetHash(key);...
2760: 0d 0a 09 09 69 66 28 21 6d 5f 70 48 61 73 68 54 ....if(!m_pHashT
2770: 61 62 6c 65 29 0d 0a 09 09 09 72 65 74 75 72 6e able).....return
2780: 20 4e 55 4c 4c 3b 0d 0a 0d 0a 09 09 2f 2f 20 73 NULL;......// s
2790: 65 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0d ee if it exists.
27a0: 0a 09 09 66 6f 72 28 43 41 73 73 6f 63 2a 20 70 ...for(CAssoc* p
27b0: 41 73 73 6f 63 20 3d 20 6d 5f 70 48 61 73 68 54 Assoc = m_pHashT
27c0: 61 62 6c 65 5b 6e 46 75 6c 6c 48 61 73 68 20 25 able[nFullHash %
27d0: 20 6d 5f 6e 48 61 73 68 54 61 62 6c 65 53 69 7a m_nHashTableSiz
27e0: 65 5d 3b 20 70 41 73 73 6f 63 20 3b 20 70 41 73 e]; pAssoc ; pAs
27f0: 73 6f 63 20 3d 20 70 41 73 73 6f 63 2d 3e 70 4e soc = pAssoc->pN
2800: 65 78 74 29 0d 0a 09 09 7b 0d 0a 09 09 09 69 66 ext)....{.....if
2810: 28 70 41 73 73 6f 63 2d 3e 6e 48 61 73 68 56 61 (pAssoc->nHashVa
2820: 6c 75 65 20 3d 3d 20 6e 46 75 6c 6c 48 61 73 68 lue == nFullHash
2830: 20 26 26 20 49 73 53 74 72 45 71 75 61 6c 28 73 && IsStrEqual(s
2840: 74 61 74 69 63 5f 63 61 73 74 3c 61 73 73 6f 63 tatic_cast<assoc
2850: 2a 3e 28 70 41 73 73 6f 63 29 2d 3e 6b 65 79 2c *>(pAssoc)->key,
2860: 20 6b 65 79 29 29 0d 0a 09 09 09 09 72 65 74 75 key))......retu
2870: 72 6e 20 73 74 61 74 69 63 5f 63 61 73 74 3c 61 rn static_cast<a
2880: 73 73 6f 63 2a 3e 28 70 41 73 73 6f 63 29 3b 0d ssoc*>(pAssoc);.
2890: 0a 09 09 7d 0d 0a 09 09 72 65 74 75 72 6e 20 4e ...}....return N
28a0: 55 4c 4c 3b 0d 0a 09 7d 0d 0a 7d 3b 0d 0a ULL;...}..};..