/************************************************************************
*                                                                       *
*   Name:       D2ARRAY.T (Version 1.0)                                 *
*                                                                       *
*   Function:   Simulates a two dimensional array using a list.         *
*                                                                       *
*   Author:     John Baker (baker-j@ix.netcom.com)                      *
*               (if address becomes invalid in the future,              *
*                post to rec.arts.int-fiction)                          *
*                                                                       *
*   Notes:      This code is public domain.  Do with it as you see      *
*               fit.  No warranties whatsoever apply.                  *
*                                                                       *
*               This wasn't especially hard to write, nor did it take   *
*               very long, but hey if it's already done you may as well *
*               save yourself some time and use it. :)                  *
*                                                                       *
************************************************************************/

d2Array: object
    myContents = []
    maxX = 0
    maxY = 0

    dimension (x, y) =
        {
        local scratch, i, j;

        /* Array must have positive size */
        if ((x <= 0) or (y <= 0))
            return (nil);

        /* If this is an existing array, all previous information is lost */
        while (car (self.myContents))
            self.myContents := cdr (self.myContents);

        /* Set dimensions */
        self.maxX := x;
        self.maxY := y;

        /* Initialize all array postions to nil */
        for (i := 1; i <= x; i++)
            for (j := 1; j <= y; j++)
                self.myContents := self.myContents + nil;

        /* Let calling function know we completed happily */
        return (true);
        }

    isDimensioned () =
        {
        if (self.maxX = 0)
            return (nil);
        return (true);
        }

    /* If we were being strict about OOP, we'd include GetMaxX and      */
    /* GetMaxY functions, but we'll let other routines just access the  */
    /* properties to get these values.                                  */

    get (x, y) =
        {
        /* Make sure we have happy params */
        if ((x <= 0) or (x > self.maxX) or (y <= 0) or (y > self.maxY))
            return (nil);

        return (self.myContents [((x - 1) * self.maxY) + y]);
        }

    put (x, y, source) =
        {
        /* Make sure we have happy params */
        if ((x <= 0) or (x > self.maxX) or (y <= 0) or (y > self.maxY))
            return (nil);

        self.myContents [((x - 1) * self.maxY) + y] := source;
        return (true);
        }
;
