MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / fxResizeEntries

Function fxResizeEntries

xs/sources/xsMapSet.c:1162–1220  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1160}
1161
1162void fxResizeEntries(txMachine* the, txSlot* table, txSlot* list)
1163{
1164 txSize size = list->next->value.integer;
1165 txSize formerLength = table->value.table.length;
1166 txSize currentLength = formerLength;
1167 txSize high = mxTableThreshold(formerLength);
1168 txSize low = mxTableThreshold(formerLength) >> 1;
1169 if (high < size) {
1170 currentLength = formerLength << 1;
1171 if (currentLength > mxTableMaxLength)
1172 currentLength = mxTableMaxLength;
1173 }
1174 else if (low >= size) {
1175 currentLength = formerLength >> 1;
1176 if (currentLength < mxTableMinLength)
1177 currentLength = mxTableMinLength;
1178 }
1179 if (formerLength != currentLength) {
1180 txSlot** currentAddress = (txSlot**)fxNewChunk(the, currentLength * sizeof(txSlot*));
1181 if (currentAddress) {
1182 txSlot** formerAddress = table->value.table.address;
1183
1184 txSize currentMask = currentLength - 1;
1185 c_memset(currentAddress, 0, currentLength * sizeof(txSlot*));
1186 while (formerLength) {
1187 txSlot* entry;
1188 while ((entry = *formerAddress)) {
1189 txU4 index = entry->value.entry.sum & currentMask;
1190 *formerAddress = entry->next;
1191 entry->next = currentAddress[index];
1192 currentAddress[index] = entry;
1193 }
1194 formerLength--;
1195 formerAddress++;
1196 }
1197 table->value.table.address = currentAddress;
1198 table->value.table.length = currentLength;
1199 }
1200 }
1201// {
1202// txSize holes = 0;
1203// txSize collisions = 0;
1204// txSize i = 0;
1205// while (i < table->value.table.length) {
1206// txSize j = 0;
1207// txSlot* entry = table->value.table.address[i];
1208// while (entry) {
1209// j++;
1210// entry = entry->next;
1211// }
1212// if (j == 0)
1213// holes++;
1214// else if (collisions < j)
1215// collisions = j;
1216// i++;
1217// }
1218// fprintf(stderr, "# size %d capacity %d holes %d collisions <%d\n", size, table->value.table.length, holes, collisions);
1219// }

Callers 5

fxClearEntriesFunction · 0.85
fxDeleteEntryFunction · 0.85
fxSetEntryFunction · 0.85

Calls 1

fxNewChunkFunction · 0.85

Tested by

no test coverage detected