diff options
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/dictutil.cpp | 128 |
1 files changed, 58 insertions, 70 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/dictutil.cpp b/src/libs/dutil/WixToolset.DUtil/dictutil.cpp index 0d0743eb..09b150df 100644 --- a/src/libs/dutil/WixToolset.DUtil/dictutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/dictutil.cpp | |||
@@ -72,6 +72,14 @@ struct STRINGDICT_STRUCT | |||
72 | 72 | ||
73 | const int STRINGDICT_HANDLE_BYTES = sizeof(STRINGDICT_STRUCT); | 73 | const int STRINGDICT_HANDLE_BYTES = sizeof(STRINGDICT_STRUCT); |
74 | 74 | ||
75 | static HRESULT CreateDict( | ||
76 | __out_bcount(STRINGDICT_HANDLE_BYTES) STRINGDICT_HANDLE* psdHandle, | ||
77 | __in DICT_TYPE dtType, | ||
78 | __in DWORD dwNumExpectedItems, | ||
79 | __in_opt void** ppvArray, | ||
80 | __in size_t cByteOffset, | ||
81 | __in DICT_FLAG dfFlags | ||
82 | ); | ||
75 | static HRESULT StringHash( | 83 | static HRESULT StringHash( |
76 | __in const STRINGDICT_STRUCT *psd, | 84 | __in const STRINGDICT_STRUCT *psd, |
77 | __in DWORD dwNumBuckets, | 85 | __in DWORD dwNumBuckets, |
@@ -135,41 +143,7 @@ extern "C" HRESULT DAPI DictCreateWithEmbeddedKey( | |||
135 | __in DICT_FLAG dfFlags | 143 | __in DICT_FLAG dfFlags |
136 | ) | 144 | ) |
137 | { | 145 | { |
138 | HRESULT hr = S_OK; | 146 | return CreateDict(psdHandle, DICT_EMBEDDED_KEY, dwNumExpectedItems, ppvArray, cByteOffset, dfFlags); |
139 | |||
140 | DictExitOnNull(psdHandle, hr, E_INVALIDARG, "Handle not specified while creating dict"); | ||
141 | |||
142 | // Allocate the handle | ||
143 | *psdHandle = static_cast<STRINGDICT_HANDLE>(MemAlloc(sizeof(STRINGDICT_STRUCT), FALSE)); | ||
144 | DictExitOnNull(*psdHandle, hr, E_OUTOFMEMORY, "Failed to allocate dictionary object"); | ||
145 | |||
146 | STRINGDICT_STRUCT *psd = static_cast<STRINGDICT_STRUCT *>(*psdHandle); | ||
147 | |||
148 | // Fill out the new handle's values | ||
149 | psd->dtType = DICT_EMBEDDED_KEY; | ||
150 | psd->dfFlags = dfFlags; | ||
151 | psd->cByteOffset = cByteOffset; | ||
152 | psd->dwBucketSizeIndex = 0; | ||
153 | psd->dwNumItems = 0; | ||
154 | psd->ppvItemList = NULL; | ||
155 | psd->ppvValueArray = ppvArray; | ||
156 | |||
157 | // Make psd->dwBucketSizeIndex point to the appropriate spot in the prime | ||
158 | // array based on expected number of items and items to buckets ratio | ||
159 | // Careful: the "-1" in "countof(MAX_BUCKET_SIZES)-1" ensures we don't end | ||
160 | // this loop past the end of the array! | ||
161 | while (psd->dwBucketSizeIndex < (countof(MAX_BUCKET_SIZES)-1) && | ||
162 | MAX_BUCKET_SIZES[psd->dwBucketSizeIndex] < dwNumExpectedItems * MAX_BUCKETS_TO_ITEMS_RATIO) | ||
163 | { | ||
164 | ++psd->dwBucketSizeIndex; | ||
165 | } | ||
166 | |||
167 | // Finally, allocate our initial buckets | ||
168 | psd->ppvBuckets = static_cast<void**>(MemAlloc(sizeof(void *) * MAX_BUCKET_SIZES[psd->dwBucketSizeIndex], TRUE)); | ||
169 | DictExitOnNull(psd->ppvBuckets, hr, E_OUTOFMEMORY, "Failed to allocate buckets for dictionary"); | ||
170 | |||
171 | LExit: | ||
172 | return hr; | ||
173 | } | 147 | } |
174 | 148 | ||
175 | // The dict will store a set of keys, with no values associated with them. Use DictAddKey() and DictKeyExists() with this dictionary type. | 149 | // The dict will store a set of keys, with no values associated with them. Use DictAddKey() and DictKeyExists() with this dictionary type. |
@@ -179,41 +153,7 @@ extern "C" HRESULT DAPI DictCreateStringList( | |||
179 | __in DICT_FLAG dfFlags | 153 | __in DICT_FLAG dfFlags |
180 | ) | 154 | ) |
181 | { | 155 | { |
182 | HRESULT hr = S_OK; | 156 | return CreateDict(psdHandle, DICT_STRING_LIST, dwNumExpectedItems, NULL, 0, dfFlags); |
183 | |||
184 | DictExitOnNull(psdHandle, hr, E_INVALIDARG, "Handle not specified while creating dict"); | ||
185 | |||
186 | // Allocate the handle | ||
187 | *psdHandle = static_cast<STRINGDICT_HANDLE>(MemAlloc(sizeof(STRINGDICT_STRUCT), FALSE)); | ||
188 | DictExitOnNull(*psdHandle, hr, E_OUTOFMEMORY, "Failed to allocate dictionary object"); | ||
189 | |||
190 | STRINGDICT_STRUCT *psd = static_cast<STRINGDICT_STRUCT *>(*psdHandle); | ||
191 | |||
192 | // Fill out the new handle's values | ||
193 | psd->dtType = DICT_STRING_LIST; | ||
194 | psd->dfFlags = dfFlags; | ||
195 | psd->cByteOffset = 0; | ||
196 | psd->dwBucketSizeIndex = 0; | ||
197 | psd->dwNumItems = 0; | ||
198 | psd->ppvItemList = NULL; | ||
199 | psd->ppvValueArray = NULL; | ||
200 | |||
201 | // Make psd->dwBucketSizeIndex point to the appropriate spot in the prime | ||
202 | // array based on expected number of items and items to buckets ratio | ||
203 | // Careful: the "-1" in "countof(MAX_BUCKET_SIZES)-1" ensures we don't end | ||
204 | // this loop past the end of the array! | ||
205 | while (psd->dwBucketSizeIndex < (countof(MAX_BUCKET_SIZES)-1) && | ||
206 | MAX_BUCKET_SIZES[psd->dwBucketSizeIndex] < dwNumExpectedItems * MAX_BUCKETS_TO_ITEMS_RATIO) | ||
207 | { | ||
208 | ++psd->dwBucketSizeIndex; | ||
209 | } | ||
210 | |||
211 | // Finally, allocate our initial buckets | ||
212 | psd->ppvBuckets = static_cast<void**>(MemAlloc(sizeof(void *) * MAX_BUCKET_SIZES[psd->dwBucketSizeIndex], TRUE)); | ||
213 | DictExitOnNull(psd->ppvBuckets, hr, E_OUTOFMEMORY, "Failed to allocate buckets for dictionary"); | ||
214 | |||
215 | LExit: | ||
216 | return hr; | ||
217 | } | 157 | } |
218 | 158 | ||
219 | extern "C" HRESULT DAPI DictCreateStringListFromArray( | 159 | extern "C" HRESULT DAPI DictCreateStringListFromArray( |
@@ -467,6 +407,54 @@ extern "C" void DAPI DictDestroy( | |||
467 | ReleaseMem(psd); | 407 | ReleaseMem(psd); |
468 | } | 408 | } |
469 | 409 | ||
410 | static HRESULT CreateDict( | ||
411 | __out_bcount(STRINGDICT_HANDLE_BYTES) STRINGDICT_HANDLE* psdHandle, | ||
412 | __in DICT_TYPE dtType, | ||
413 | __in DWORD dwNumExpectedItems, | ||
414 | __in_opt void** ppvArray, | ||
415 | __in size_t cByteOffset, | ||
416 | __in DICT_FLAG dfFlags | ||
417 | ) | ||
418 | { | ||
419 | HRESULT hr = S_OK; | ||
420 | |||
421 | DictExitOnNull(psdHandle, hr, E_INVALIDARG, "Handle not specified while creating dict."); | ||
422 | |||
423 | // Allocate the handle | ||
424 | *psdHandle = static_cast<STRINGDICT_HANDLE>(MemAlloc(sizeof(STRINGDICT_STRUCT), TRUE)); | ||
425 | DictExitOnNull(*psdHandle, hr, E_OUTOFMEMORY, "Failed to allocate dictionary object."); | ||
426 | |||
427 | STRINGDICT_STRUCT* psd = static_cast<STRINGDICT_STRUCT*>(*psdHandle); | ||
428 | |||
429 | // Fill out the new handle's values | ||
430 | psd->dtType = dtType; | ||
431 | psd->dfFlags = dfFlags; | ||
432 | psd->cByteOffset = cByteOffset; | ||
433 | psd->ppvValueArray = ppvArray; | ||
434 | |||
435 | // Make psd->dwBucketSizeIndex point to the appropriate spot in the prime | ||
436 | // array based on expected number of items and items to buckets ratio | ||
437 | // Careful: the "-1" in "countof(MAX_BUCKET_SIZES)-1" ensures we don't end | ||
438 | // this loop past the end of the array! | ||
439 | while (psd->dwBucketSizeIndex < (countof(MAX_BUCKET_SIZES) - 1) && | ||
440 | MAX_BUCKET_SIZES[psd->dwBucketSizeIndex] < dwNumExpectedItems * MAX_BUCKETS_TO_ITEMS_RATIO) | ||
441 | { | ||
442 | ++psd->dwBucketSizeIndex; | ||
443 | } | ||
444 | |||
445 | hr = MemAllocArray(reinterpret_cast<LPVOID*>(&psd->ppvBuckets), sizeof(void*), MAX_BUCKET_SIZES[psd->dwBucketSizeIndex]); | ||
446 | DictExitOnFailure(hr, "Failed to allocate buckets for dictionary."); | ||
447 | |||
448 | if (dwNumExpectedItems) | ||
449 | { | ||
450 | hr = MemAllocArray(reinterpret_cast<LPVOID*>(&psd->ppvItemList), sizeof(void*), dwNumExpectedItems); | ||
451 | DictExitOnFailure(hr, "Failed to pre-allocate item list for dictionary."); | ||
452 | } | ||
453 | |||
454 | LExit: | ||
455 | return hr; | ||
456 | } | ||
457 | |||
470 | static HRESULT StringHash( | 458 | static HRESULT StringHash( |
471 | __in const STRINGDICT_STRUCT *psd, | 459 | __in const STRINGDICT_STRUCT *psd, |
472 | __in DWORD dwNumBuckets, | 460 | __in DWORD dwNumBuckets, |