/*
 * 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;
}
