Skip to content

Instantly share code, notes, and snippets.

@minagi-yu
Created January 11, 2020 14:52
Show Gist options
  • Save minagi-yu/e218c5103b4d10f2b64a1a71183d8536 to your computer and use it in GitHub Desktop.
Save minagi-yu/e218c5103b4d10f2b64a1a71183d8536 to your computer and use it in GitHub Desktop.
void swap(void *src, void *dst, size_t size)
{
char tmp;
char *sp = (char *)src;
char *dp = (char *)dst;
do {
tmp = *sp;
*sp++ = *dp;
*dp++ = tmp;
} while (--size);
}
void reverse(void *base, size_t nmemb, size_t size)
{
char *first = (char *)base;
char *last = (char *)base + (nmemb - 1) * size;
if (nmemb == 0)
return;
for (; first < last; first += size, last -= size) {
swap(first, last, size);
}
}
_Bool next_permutation(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))
{
char *first = (char *)base;
char *last = (char *)base + (nmemb - 1) * size;
char *i = last;
for (;;) {
i -= size;
if (compar(i, i + size) < 0) {
char *j = last;
while (compar(i, j) >= 0) {
j -= size;
}
swap(i, j, size);
reverse(i + size, (last - i) / size, size);
return 1;
}
if (i == first) {
reverse(base, nmemb, size);
return 0;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment