Skip to content

Instantly share code, notes, and snippets.

@LukaHorvat
Created December 29, 2016 10:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LukaHorvat/0945ba34a72f80cde30806c4157105de to your computer and use it in GitHub Desktop.
Save LukaHorvat/0945ba34a72f80cde30806c4157105de to your computer and use it in GitHub Desktop.
arr.c
pure_array* write_arr(int idx, elem x, pure_array* arr,
void (*io_write)(int, elem, io_vector),
io_vector (*io_clone)(io_vector),
elem (*io_read)(int, io_vector))
{
elem old_val;
pure_array* new_arr = (pure_array*)malloc(sizeof(pure_array));
switch (arr->rep.tag)
{
case 0:
{
old_val = io_read(idx, arr->rep.uni.head.vector);
io_write(idx, x, arr->rep.uni.head.vector);
memcpy(new_arr, arr, sizeof(pure_array));
break;
}
case 1:
{
io_vector vec = to_vector(arr, io_write, io_clone);
old_val = io_read(idx, vec);
io_write(idx, x, vec);
new_arr->size = arr->size;
new_arr->rep.tag = 0;
new_arr->rep.uni.head.vector = vec;
break;
}
default:
exit(122);
}
arr->rep.tag = 1;
arr->rep.uni.log.index = idx;
arr->rep.uni.log.new_value = old_val;
arr->rep.uni.log.new_array = new_arr;
return new_arr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment