001/*-
002 *******************************************************************************
003 * Copyright (c) 2011, 2016 Diamond Light Source Ltd.
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the Eclipse Public License v1.0
006 * which accompanies this distribution, and is available at
007 * http://www.eclipse.org/legal/epl-v10.html
008 *
009 * Contributors:
010 *    Peter Chang - initial API and implementation and/or initial documentation
011 *******************************************************************************/
012
013package org.eclipse.january.dataset;
014
015/**
016 * Class to run over an iterator and visits positions where items in selection dataset are true 
017 */
018public class BooleanIterator extends IndexIterator {
019        final private BooleanDataset b;
020        final private IndexIterator iterb;
021        final private IndexIterator iterd;
022        final private boolean v;
023        final private int[] pos; // position in dataset
024
025        /**
026         * Constructor for an iterator over the items of a boolean dataset that are
027         * true
028         *
029         * @param iter dataset iterator
030         * @param selection boolean dataset
031         */
032        public BooleanIterator(final IndexIterator iter, final Dataset selection) {
033                this(iter, selection, true);
034        }
035
036        /**
037         * Constructor for an iterator over the items of a boolean dataset that match
038         * given value
039         *
040         * @param iter dataset iterator
041         * @param selection boolean dataset
042         * @param value
043         */
044        public BooleanIterator(final IndexIterator iter, final Dataset selection, boolean value) {
045                b = (BooleanDataset) DatasetUtils.cast(selection, Dataset.BOOL);
046
047                iterb = selection.getIterator();
048                iterd = iter;
049                pos = iterd.getPos();
050                v = value;
051        }
052
053        @Override
054        public boolean hasNext() {
055                while (iterb.hasNext() && iterd.hasNext()) {
056                        if (b.getAbs(iterb.index) == v) {
057                                index = iterd.index;
058                                return true;
059                        }
060                }
061                return false;
062        }
063
064        @Override
065        public int[] getPos() {
066                return pos;
067        }
068
069        @Override
070        public void reset() {
071                iterb.reset();
072                iterd.reset();
073        }
074}