Changeset 3733


Ignore:
Timestamp:
09/13/03 23:40:54 (19 years ago)
Author:
piso
Message:

Work in progress.

File:
1 edited

Legend:

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

    r3631 r3733  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: DisplacedArray.java,v 1.3 2003-09-08 18:28:06 piso Exp $
     5 * $Id: DisplacedArray.java,v 1.4 2003-09-13 23:40:54 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2424public final class DisplacedArray extends AbstractArray
    2525{
     26    private final int[] dimv;
     27    private final int size;
    2628    private final AbstractArray array;
    2729    private final int offset;
    2830
    29     public DisplacedArray(AbstractArray array, int offset)
     31    public DisplacedArray(int[] dimv, AbstractArray array, int offset)
    3032    {
     33        this.dimv = dimv;
     34        size = computeTotalSize(dimv);
    3135        this.array = array;
    3236        this.offset = offset;
     37    }
     38
     39    private static int computeTotalSize(int[] dimensions)
     40    {
     41        int size = 1;
     42        for (int i = dimensions.length; i-- > 0;)
     43            size *= dimensions[i];
     44        return size;
     45    }
     46
     47    public LispObject typeOf()
     48    {
     49        if (getRank() == 1) {
     50            if (array instanceof LispString)
     51                return Symbol.STRING;
     52            return list3(Symbol.VECTOR, T, new Fixnum(size));
     53        }
     54        return list3(Symbol.ARRAY, T, getDimensions());
    3355    }
    3456
     
    3759        if (typeSpecifier == Symbol.ARRAY)
    3860            return T;
     61        if (typeSpecifier == Symbol.VECTOR)
     62            return getRank() == 1 ? T : NIL;
    3963        if (typeSpecifier instanceof LispClass) {
    4064            final String name = typeSpecifier.getName();
     
    5074    {
    5175        if (getRank() == 1)
    52             return array.getDimension(0) - offset;
     76            return size;
    5377        throw new TypeError(this, "sequence");
    5478    }
     
    6690    public int getRank()
    6791    {
    68         return array.getRank();
     92        return dimv.length;
    6993    }
    7094
    7195    public LispObject getDimensions()
    7296    {
    73         return array.getDimensions();
     97        LispObject result = NIL;
     98        for (int i = dimv.length; i-- > 0;)
     99            result = new Cons(new Fixnum(dimv[i]), result);
     100        return result;
    74101    }
    75102
    76103    public int getDimension(int n) throws LispError
    77104    {
    78         return array.getDimension(n);
     105        try {
     106            return dimv[n];
     107        }
     108        catch (ArrayIndexOutOfBoundsException e) {
     109            throw new TypeError("bad array dimension");
     110        }
    79111    }
    80112
     
    86118    public int getTotalSize()
    87119    {
    88         return array.getTotalSize() - offset;
     120        return size;
    89121    }
    90122
    91123    public LispObject getRowMajor(int index) throws LispError
    92124    {
    93         return array.getRowMajor(index + offset);
     125        if (index >= 0 && index < size)
     126            return array.getRowMajor(index + offset);
     127        throw new TypeError("bad row major index " + index);
    94128    }
    95129
    96130    public void setRowMajor(int index, LispObject newValue) throws LispError
    97131    {
    98         array.setRowMajor(index + offset, newValue);
     132        if (index >= 0 && index < size)
     133            array.setRowMajor(index + offset, newValue);
     134        throw new TypeError("bad row major index " + index);
    99135    }
    100136
Note: See TracChangeset for help on using the changeset viewer.