/*
 *  n-tuple.c - the next n-tuple algorithm
 *  Copyright (C) 2010 Martin Broadhurst
 *  www.martinbroadhurst.com
 */


#include <n-tuple.h>

unsigned int MBnext_n_tuple(unsigned int *ar, size_t len, const size_t *sizes)
{
    unsigned int changed = 0;
    unsigned int finished = 0;
    unsigned int i;

    for (i = len - 1; !changed && !finished; i--) {
        if (ar[i] < sizes[i] - 1) {
            /* Increment */
            ar[i]++;
            changed = 1;
        }
        else {
            /* Roll over */
            ar[i] = 0;
        }
        finished = i == 0;
    }

    return changed;
}