grid: implement a memmove-sort-of function

grid_memmove() moves cell data from one index to another, taking the
grid offset into account.
This commit is contained in:
Daniel Eklöf 2019-07-01 19:18:52 +02:00
parent b45b492f41
commit 482f56b4a2
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 34 additions and 0 deletions

33
grid.c
View file

@ -40,3 +40,36 @@ grid_memset(struct grid *grid, size_t start, int c, size_t length)
start += count;
}
}
void
grid_memmove(struct grid *grid, size_t dst, size_t src, size_t length)
{
size_t left = length;
size_t copy_idx = 0;
struct cell copy[left];
while (left > 0) {
size_t count = left;
struct cell *src_cells = grid_get_range(grid, src, &count);
memcpy(&copy[copy_idx], src_cells, count * sizeof(copy[0]));
left -= count;
src += count;
copy_idx += count;
}
left = length;
copy_idx = 0;
while (left > 0) {
size_t count = left;
struct cell *dst_cells = grid_get_range(grid, dst, &count);
memcpy(dst_cells, &copy[copy_idx], count * sizeof(copy[0]));
left -= count;
dst += count;
copy_idx += count;
}
}

1
grid.h
View file

@ -5,3 +5,4 @@
struct cell *grid_get_range(struct grid *grid, size_t start, size_t *length);
void grid_memset(struct grid *grid, size_t start, int c, size_t length);
void grid_memmove(struct grid *grid, size_t dst, size_t src, size_t length);