001    /*
002     * Copyright (C) 2008-2010 by Holger Arndt
003     *
004     * This file is part of the Universal Java Matrix Package (UJMP).
005     * See the NOTICE file distributed with this work for additional
006     * information regarding copyright ownership and licensing.
007     *
008     * UJMP is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU Lesser General Public License as
010     * published by the Free Software Foundation; either version 2
011     * of the License, or (at your option) any later version.
012     *
013     * UJMP is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016     * GNU Lesser General Public License for more details.
017     *
018     * You should have received a copy of the GNU Lesser General Public
019     * License along with UJMP; if not, write to the
020     * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
021     * Boston, MA  02110-1301  USA
022     */
023    
024    package org.ujmp.core.util;
025    
026    import java.util.Iterator;
027    
028    import org.ujmp.core.Matrix;
029    import org.ujmp.core.exceptions.MatrixException;
030    
031    public class CoordinateIterator2D implements Iterable<long[]> {
032    
033            private static final int ROW = Matrix.ROW;
034    
035            private static final int COLUMN = Matrix.COLUMN;
036    
037            private long[] size = null;
038    
039            public CoordinateIterator2D(long... size) {
040                    this.size = size;
041                    if (size.length > 2) {
042                            new Exception(
043                                            "warning: using a 2d iterator on a matrix or calculation that has more than 2 dimensions, results may be wrong")
044                                            .printStackTrace();
045                    }
046            }
047    
048            public Iterator<long[]> iterator() {
049                    return new Iterator<long[]>() {
050    
051                            long[] cursor = new long[] { 0, -1 };
052    
053                            long columnCount = size[COLUMN];
054    
055                            long rowCount = size[ROW];
056    
057                            long rowMinus1 = rowCount - 1;
058    
059                            long columnMinus1 = columnCount - 1;
060    
061                            boolean isNotEmpty = columnCount != 0 && rowCount != 0;
062    
063                            public boolean hasNext() {
064                                    return (cursor[ROW] != rowMinus1 || cursor[COLUMN] != columnMinus1) && isNotEmpty;
065                            }
066    
067                            public long[] next() {
068                                    return ++cursor[COLUMN] == columnCount && (cursor[COLUMN] = 0) == ++cursor[ROW] ? cursor
069                                                    : cursor;
070                            }
071    
072                            public void remove() {
073                                    throw new MatrixException("not implemented");
074                            }
075                    };
076            }
077    
078    }