/***************************************************************************
 *
 * 26.class.gslice.cpp - tests exercising class std::gslice
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 **************************************************************************/

#include <cstdlib>    // for strtoul(), size_t
#include <valarray>   // for gslice, valarray

#include <driver.h>

/**************************************************************************/

// returns a valarray constructed from a string of comma-separated values
static std::valarray<std::size_t>
make_array (const char *s)
{
    if (0 == s)
        return std::valarray<std::size_t>();

    std::size_t buf [256];

    for (std::size_t i = 0; ; ++i) {

        char *end;
        unsigned long val = std::strtoul (s, &end, 10);

        RW_ASSERT ('\0' == *end || ',' == *end);

        buf [i] = std::size_t (val);

        if ('\0' == *end)
            return std::valarray<std::size_t>(buf, i + 1);

        s = end + 1;
    }
}

/**************************************************************************/

// returns the size of the index array represented by the genreralized slice
static std::size_t
get_array_size (const std::gslice &gsl)
{
    const std::valarray<std::size_t> sizes = gsl.size ();

    std::size_t asize = sizes.size () ? 1 : 0;

    for (std::size_t i = 0; i != sizes.size (); ++i) {
        asize *= sizes [i];
    }

    return asize;
}

/**************************************************************************/

static std::size_t
next_index (const std::gslice &gsl, std::valarray<std::size_t> &factors)
{
    const std::size_t                start    = gsl.start ();
    const std::valarray<std::size_t> asizes   = gsl.size ();
    const std::valarray<std::size_t> astrides = gsl.stride ();

    const std::size_t ndims = asizes.size ();

    std::size_t inx = ndims;

    if (0 == factors.size ()) {
        factors.resize (ndims);

        return start;
    }

    while (inx && factors [inx - 1] == asizes [inx - 1] - 1)
        --inx;

    if (0 == inx) {
        factors = 0;

        return start;
    }

    ++factors [inx - 1];

    if (inx < factors.size ()) {
        for (std::size_t i = inx; i != ndims; ++i)
            factors [i] = 0;
    }
    else
        inx = factors.size ();

    std::size_t index = start;

    for (std::size_t i = 0; i != inx; ++i)
        index += factors [i] * astrides [i];

    return index;
}

/**************************************************************************/

// returns a valarray of indices reprsented by the generalized slice
static std::valarray<std::size_t>
get_index_array (const std::gslice &gsl)
{
    const std::size_t size = get_array_size (gsl);

    std::valarray<std::size_t> indices (size);

    std::valarray<std::size_t> tmpstore;

    for (std::size_t i = 0; i != size; ++i)
        indices [i] = next_index (gsl, tmpstore);

    return indices;
}

/**************************************************************************/

static void
test_gslice (std::size_t  start,
             const char  *sizes,
             const char  *strides)
{
    const std::valarray<std::size_t> asizes (make_array (sizes));
    const std::valarray<std::size_t> astrides (make_array (strides));

    const std::gslice gsl (start, asizes, astrides);

    const std::valarray<std::size_t> indices = get_index_array (gsl);

    std::size_t maxinx = 0;

    for (std::size_t i = 0; i != indices.size (); ++i)
        if (maxinx < indices [i])
            maxinx = indices [i];

    std::valarray<std::size_t> va (maxinx + 1);
    for (std::size_t i = 0; i != va.size (); ++i)
        va [i] = i;

    for (int i = 0; i != 3; ++i) {
        // repeat each test three to verify that operator[](gslice)
        // doesn't change the observable state of its argument and
        // that the same result is obtained for a copy of gslice

        const std::valarray<std::size_t> array_slice =
            i < 2 ? va [gsl] : va [std::gslice (gsl)];

        bool equal = array_slice.size () == indices.size ();

        rw_assert (equal, 0, __LINE__,
                   "size() == %zu, got %zu\n",
                   indices.size (), array_slice.size ());

        if (equal) {
            for (std::size_t j = 0; j != array_slice.size (); ++j) {

                equal = array_slice [j] == va [indices [j]];

                rw_assert (equal, 0, __LINE__,
                           "mismatch at %u, index %u: expected %u, got %u\n",
                           j, indices [j], va [indices [j]],
                           array_slice [j]);
            }
        }
    }
}

/**************************************************************************/

static void
test_gslice (const char *sizes, const char *strides)
{
    for (std::size_t i = 0; i != 10; ++i)
        test_gslice (i, sizes, strides);
}

/**************************************************************************/

static int
run_test (int, char**)
{
    test_gslice ("1", "1");
    test_gslice ("1", "2");
    test_gslice ("2", "1");
    test_gslice ("2", "3");
    test_gslice ("3", "2");

    test_gslice ("1,1", "1,1");
    test_gslice ("1,1", "1,2");
    test_gslice ("1,1", "2,1");
    test_gslice ("1,9", "2,1");
    test_gslice ("9,1", "2,1");

    test_gslice ("1,1,1", "1,1,1");
    test_gslice ("1,2,3", "4,5,6");
    test_gslice ("6,5,4", "3,2,1");
    test_gslice ("10,11,12", "13,14,15");

    // includes example from class.gslice, p3
    test_gslice ("2,4,3", "19,4,1");

    // includes example of a degenerate gslice from p5
    test_gslice ("2,4,3", "19,4,1");

    return 0;
}

/**************************************************************************/

int main (int argc, char *argv[])
{
    return rw_test (argc, argv, __FILE__,
                    "lib.class.gslice",
                    0 /* no comment */,
                    run_test,
                    "",
                    (void*)0   /* sentinel */);
}
