Changeset 5993


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

getRowMajorIndex()

File:
1 edited

Legend:

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

    r5988 r5993  
    33 *
    44 * Copyright (C) 2003-2004 Peter Graves
    5  * $Id: AbstractArray.java,v 1.19 2004-02-26 01:36:34 piso Exp $
     5 * $Id: AbstractArray.java,v 1.20 2004-02-26 19:28:52 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    106106    }
    107107
     108    public final int getRowMajorIndex(LispObject[] subscripts)
     109        throws ConditionThrowable
     110    {
     111        int[] subs = new int[subscripts.length];
     112        for (int i = 0; i < subscripts.length; i++) {
     113            LispObject subscript = subscripts[i];
     114            if (subscript instanceof Fixnum)
     115                subs[i] = ((Fixnum)subscript).value;
     116            else
     117                signal(new TypeError(subscript, Symbol.FIXNUM));
     118        }
     119        return getRowMajorIndex(subs);
     120    }
     121
     122    public final int getRowMajorIndex(int[] subscripts)
     123        throws ConditionThrowable
     124    {
     125        final int rank = getRank();
     126        if (rank != subscripts.length) {
     127            StringBuffer sb = new StringBuffer("Wrong number of subscripts (");
     128            sb.append(subscripts.length);
     129            sb.append(") for array of rank ");
     130            sb.append(rank);
     131            sb.append('.');
     132            signal(new ProgramError(sb.toString()));
     133        }
     134        if (rank == 0)
     135            return 0;
     136        int sum = 0;
     137        int size = 1;
     138        for (int i = rank; i-- > 0;) {
     139            int dim = getDimension(i);
     140            int lastSize = size;
     141            size *= dim;
     142            int n = subscripts[i];
     143            if (n < 0 || n >= getDimension(i))
     144                signal(new ProgramError());
     145            sum += n * lastSize;
     146        }
     147        return sum;
     148    }
     149
    108150    // Helper for toString().
    109151    protected void appendContents(int[] dimensions, int index, StringBuffer sb)
Note: See TracChangeset for help on using the changeset viewer.