/*
 * test_obj_incdec.2300 - test object increment/decrement for test 23dd
 *
 * Copyright (C) 1999,2023  Landon Curt Noll
 *
 * Calc is open software; you can redistribute it and/or modify it under
 * the terms of the version 2.1 of the GNU Lesser General Public License
 * as published by the Free Software Foundation.
 *
 * Calc is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
 * Public License for more details.
 *
 * A copy of version 2.1 of the GNU Lesser General Public License is
 * distributed with calc under the filename COPYING-LGPL.  You should have
 * received a copy with calc; if not, write to Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 *
 * Under source code control:   1995/07/09 06:12:13
 * File existed as early as:    1995
 *
 * chongo <was here> /\oo/\     http://www.isthe.com/chongo/
 * Share and enjoy!  :-)        http://www.isthe.com/chongo/tech/comp/calc/
 */


obj matrix {m}


/*
 * matrix_inc - increment the matrix inside the object
 */
define matrix_inc(a)
{
        local i;

        /* increment each matrix member */
        for (i= 0; i < size(a.m); i++)
                ++a.m[[i]];
        return a;
}

/*
 * matrix_dec - decrement the matrix inside the object
 */
define matrix_dec(a)
{
        local i;

        /* decrement each matrix member */
        for (i= 0; i < size(a.m); i++)
                --a.m[[i]];
        return a;
}

/*
 * mkmat - load the matrix inside the object
 */
define mkmat()
{
        local s, M, i, v;

        /* firewall */
        s = param(0);
        if (s == 0)
                quit "Need at least one argument";

        /* create the matrix */
        mat M[s];

        /* load the matrix with the args */
        for (i = 0; i < s; i++)
                M[i] = param(i + 1);

        /* create the object with the matrix */
        obj matrix v;
        v.m = M;
        return v;
}

/*
 * ckmat - check if the matrix inside an object has a set of given values
 */
define ckmat()
{
        local s, a, i;

        /* firewall */
        s = param(0);
        if (s < 2)
                quit "Need at least two arguments";

        /* get the object to test */
        a = param(1);

        /* verify the matrix in the object is the right size */
        if (size(a.m) != s-1) {
                return 0;
        }

        /* check each matrix element with the args passed */
        for (i = 2; i <= s; i++) {
                if (a.m[i-2] != param(i)) {
                        /* args do not match */
                        return 0;
                }
        }

        /* args match the matrix in the object */
        return 1;
}
