VecDeleteRange
Description
Delete count elements starting at start. Order of trailing elements is preserved.
Parameters
| Name | Direction | Description |
|---|---|---|
v |
in,out | Vector handle. |
start |
in | First deleted index. |
count |
in | Number of elements to delete. |
Success
Returns to the caller. The vector length shrinks by count; elements previously at indices >= start + count have shifted left by count. When copy_deinit is configured it is invoked on each dropped element.
Failure
Function cannot fail. start + count exceeding length is a caller bug and aborts via LOG_FATAL.
Usage example (Cross-references)
Usage examples (Cross-references)
- In
Remove.h:77:
/// TAGS: Str, Delete, Range
///
#define StrDeleteRange(str, start, count) VecDeleteRange((str), (start), (count))
///
- In
VecInt.c:206:
uint64_t len = VecLen(vec);
if (len > 0 && start < len && count > 0 && start + count <= len) {
VecDeleteRange(vec, start, count);
}
break;- In
VecCharPtr.c:257:
size_t index = extract_u32(data, offset, data_size) % VecLen(vec);
size_t count = extract_u32(data, offset, data_size) % (VecLen(vec) - index + 1);
VecDeleteRange(vec, index, count);
}
break;- In
VecStr.c:266:
size_t index = extract_u32(data, offset, data_size) % VecLen(vec);
size_t count = extract_u32(data, offset, data_size) % (VecLen(vec) - index + 1);
VecDeleteRange(vec, index, count);
}
break;- In
Complex.c:534:
// Test VecDeleteRange (regular delete range)
VecDeleteRange(&vec, 0, 2); // Delete 10 and 20
// Check vector length after range deletion
- In
Remove.c:299:
// Test VecDeleteRange function
bool test_vec_delete_range(void) {
WriteFmtLn("Testing VecDeleteRange");
// Create a vector of integers
- In
Remove.c:316:
// Delete range from index 2 to 4 (values 30, 40, 50)
VecDeleteRange(&vec, 2, 3);
// Check new length
- In
Remove.c:704:
int start_index = 2;
int count = 3;
VecDeleteRange(&vec, start_index, count); // Delete 30, 40, 50
// Check vector after L-value range deletion
- In
Remove.c:739:
// Test R-value delete range operation
VecDeleteRange(&vec, 2, 3); // Delete 30, 40, 50
// Check vector after R-value range deletion
- In
Remove.c:1263:
// start large, count small: real move = N - start - 2; mutant move adds
// 2*start ~= 40000 elements (~160 KB) of over-read/over-write past the end.
VecDeleteRange(&vec, 20000, 2);
bool result = (VecLen(&vec) == (u64)(N - 2)) && (VecAt(&vec, 0) == 0) && (VecAt(&vec, 19999) == 19999) &&- In
Remove.c:1287:
// 2*K ~= 40000 elements (~160 KB) of over-read/over-write past the end.
const u64 K = 20000;
VecDeleteRange(&vec, 0, K);
bool result = (VecLen(&vec) == (u64)N - K) && (VecAt(&vec, 0) == (int)K) && (VecAt(&vec, 19999) == (int)(N - 1));- In
Remove.c:1307:
}
VecDeleteRange(&vec, 1, 2); // real move ~ (N-3)*4 bytes; mutant ~ (N-3)*42 (~1.5 MB)
bool result = (VecLen(&vec) == (u64)(N - 2)) && (VecAt(&vec, 0) == 0) && (VecAt(&vec, 1) == 3) &&- In
Remove.c:1326:
}
VecDeleteRange(&vec, 3, 2); // length becomes 8
// Dead slot 9 (previously a duplicate of 9) must be zeroed.
- In
Remove.c:1345:
}
VecDeleteRange(&vec, 3, 2); // length becomes 8
// Dead slot 9 must be zeroed, not left as a stale duplicate.
- In
Remove.c:1370:
// from vec_ptr_at(length-count), running well past the end of the buffer.
const u64 K = 30000;
VecDeleteRange(&vec, 0, K); // length becomes N-K
bool result = (VecLen(&vec) == (u64)N - K) && (VecAt(&vec, 0) == (int)K);- In
Remove.c:1415:
// Remove the final element. Real move size = length - (length-1) - 1 = 0.
// Mutant size = length + (length-1) - 1 = 2*length - 2 elements -> overrun.
VecDeleteRange(&vec, old_len - 1, 1);
bool result = (VecLen(&vec) == old_len - 1);- In
Remove.c:1452:
// length - 0 - (length-1) = 1. Mutant size = length - 0 + (length-1) =
// 2*length - 1 elements -> overrun far past the buffer.
VecDeleteRange(&vec, 0, old_len - 1);
bool result = (VecLen(&vec) == 1);- In
Foreach.c:517:
// When we reach idx=3, delete several elements
if (idx == 3) {
VecDeleteRange(&vec, 0, 6); // Remove first 6 elements
WriteFmt("Deleted first 6 elements, new length={}, idx = {}\n", VecLen(&vec), original_length, idx);
}
Last updated on