| 332 | */ |
| 333 | |
| 334 | int CPLHashSetInsert(CPLHashSet *set, void *elt) |
| 335 | { |
| 336 | CPLAssert(set != nullptr); |
| 337 | void **pElt = CPLHashSetFindPtr(set, elt); |
| 338 | if (pElt) |
| 339 | { |
| 340 | if (set->fnFreeEltFunc) |
| 341 | set->fnFreeEltFunc(*pElt); |
| 342 | |
| 343 | *pElt = elt; |
| 344 | return FALSE; |
| 345 | } |
| 346 | |
| 347 | if (set->nSize >= 2 * set->nAllocatedSize / 3 || |
| 348 | (set->bRehash && set->nIndiceAllocatedSize > 0 && |
| 349 | set->nSize <= set->nAllocatedSize / 2)) |
| 350 | { |
| 351 | set->nIndiceAllocatedSize++; |
| 352 | CPLHashSetRehash(set); |
| 353 | } |
| 354 | |
| 355 | const unsigned long nHashVal = set->fnHashFunc(elt) % set->nAllocatedSize; |
| 356 | #ifdef HASH_DEBUG |
| 357 | if (set->tabList[nHashVal]) |
| 358 | set->nCollisions++; |
| 359 | #endif |
| 360 | |
| 361 | CPLList *new_elt = CPLHashSetGetNewListElt(set); |
| 362 | new_elt->pData = elt; |
| 363 | new_elt->psNext = set->tabList[nHashVal]; |
| 364 | set->tabList[nHashVal] = new_elt; |
| 365 | set->nSize++; |
| 366 | |
| 367 | return TRUE; |
| 368 | } |
| 369 | |
| 370 | /************************************************************************/ |
| 371 | /* CPLHashSetLookup() */ |