| 1160 | } |
| 1161 | |
| 1162 | void 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 | // } |
no test coverage detected