#include "gr_vec.h"
#include "perm.h"
void
_gr_vec_permute(gr_ptr vec, slong * perm, slong len, gr_ctx_t ctx)
{
for (slong base = 0; base < len; base++)
{
slong k = base;
while (perm[k] != k)
{
gr_swap(GR_ENTRY(vec, base, ctx->sizeof_elem),
GR_ENTRY(vec, k, ctx->sizeof_elem),
ctx);
FLINT_SWAP(slong, perm[k], k);
}
}
}
int
gr_vec_permute(gr_vec_t dest, gr_vec_t src, slong * perm, gr_ctx_t ctx)
{
if (dest != src)
{
int status = gr_vec_set(dest, src, ctx);
if (status != GR_SUCCESS)
return status;
}
slong * _perm = _perm_init(src->length);
_perm_set(_perm, perm, src->length);
_gr_vec_permute(dest->entries, _perm, dest->length, ctx);
_perm_clear(_perm);
return GR_SUCCESS;
}