Changeset 5995


Ignore:
Timestamp:
02/26/04 19:51:04 (17 years ago)
Author:
piso
Message:

Work in progress.

Location:
trunk/j/src/org/armedbear/lisp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/SimpleArray.java

    r5991 r5995  
    33 *
    44 * Copyright (C) 2003-2004 Peter Graves
    5  * $Id: SimpleArray.java,v 1.2 2004-02-26 02:12:25 piso Exp $
     5 * $Id: SimpleArray.java,v 1.3 2004-02-26 19:50:39 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2626    private final int[] dimv;
    2727    private final LispObject elementType;
     28    private final int totalSize;
    2829    private final LispObject[] data;
    2930
     
    3233        this.dimv = dimv;
    3334        this.elementType = elementType;
    34         int size = computeTotalSize(dimv);
    35         data = new LispObject[size];
    36         for (int i = 0; i < size; i++)
     35        totalSize = computeTotalSize(dimv);
     36        data = new LispObject[totalSize];
     37        for (int i = totalSize; i-- > 0;)
    3738            data[i] = NIL;
    3839    }
     
    5152            rest = rest.elt(0);
    5253        }
    53         int size = computeTotalSize(dimv);
    54         data = new LispObject[size];
     54        totalSize = computeTotalSize(dimv);
     55        data = new LispObject[totalSize];
    5556        setInitialContents(0, dimv, initialContents, 0);
    5657    }
     
    6970            rest = rest.elt(0);
    7071        }
    71         int size = computeTotalSize(dimv);
    72         data = new LispObject[size];
     72        totalSize = computeTotalSize(dimv);
     73        data = new LispObject[totalSize];
    7374        setInitialContents(0, dimv, initialContents, 0);
    7475    }
     
    164165    public int getTotalSize()
    165166    {
    166         return data.length;
     167        return totalSize;
     168    }
     169
     170    public boolean isAdjustable()
     171    {
     172        return false;
    167173    }
    168174
     
    189195    public void fill(LispObject obj)
    190196    {
    191         for (int i = data.length; i-- > 0;)
     197        for (int i = totalSize; i-- > 0;)
    192198            data[i] = obj;
    193199    }
     
    203209    }
    204210
     211    public AbstractArray adjustArray(int[] dimv, LispObject initialElement,
     212                                     LispObject initialContents)
     213        throws ConditionThrowable
     214    {
     215        if (initialContents != NIL)
     216            return new SimpleArray(dimv, elementType, initialContents);
     217        for (int i = 0; i < dimv.length; i++) {
     218            if (dimv[i] != this.dimv[i]) {
     219                SimpleArray newArray = new SimpleArray(dimv, elementType);
     220                newArray.fill(initialElement);
     221                copyArray(this, newArray);
     222                return newArray;
     223            }
     224        }
     225        // New dimensions are identical to old dimensions.
     226        return this;
     227    }
     228
     229    // Copy a1 to a2 for index tuples that are valid for both arrays.
     230    private static void copyArray(AbstractArray a1, AbstractArray a2)
     231        throws ConditionThrowable
     232    {
     233        Debug.assertTrue(a1.getRank() == a2.getRank());
     234        int[] subscripts = new int[a1.getRank()];
     235        int axis = 0;
     236        copySubArray(a1, a2, subscripts, axis);
     237    }
     238
     239    private static void copySubArray(AbstractArray a1, AbstractArray a2,
     240                                     int[] subscripts, int axis)
     241        throws ConditionThrowable
     242    {
     243        if (axis < subscripts.length) {
     244            final int limit =
     245                Math.min(a1.getDimension(axis), a2.getDimension(axis));
     246            for (int i = 0; i < limit; i++) {
     247                subscripts[axis] = i;
     248                copySubArray(a1, a2, subscripts, axis + 1);
     249            }
     250        } else {
     251            int i1 = a1.getRowMajorIndex(subscripts);
     252            int i2 = a2.getRowMajorIndex(subscripts);
     253            a2.setRowMajor(i2, a1.getRowMajor(i1));
     254        }
     255    }
     256
    205257    public AbstractArray adjustArray(int[] dimv, AbstractArray displacedTo,
    206258                                     int displacement)
  • trunk/j/src/org/armedbear/lisp/adjust_array.java

    r5991 r5995  
    33 *
    44 * Copyright (C) 2004 Peter Graves
    5  * $Id: adjust_array.java,v 1.11 2004-02-26 02:13:57 piso Exp $
     5 * $Id: adjust_array.java,v 1.12 2004-02-26 19:51:04 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    109109                                     checkArray(displacedTo),
    110110                                     displacement);
     111            } else {
     112                return a.adjustArray(dimv,
     113                                     initialElement,
     114                                     initialContents);
    111115            }
    112116        }
Note: See TracChangeset for help on using the changeset viewer.