001/*- 002 * Copyright 2017 Diamond Light Source Ltd. 003 * 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 010package org.eclipse.january.dataset; 011 012/** 013 * Class to run over a pair of contiguous datasets 014 * @since 2.1 015 */ 016public class BooleanContiguousIterator extends BooleanIterator { 017 private final int cMax; // maximum index in array 018 private final int cStep; 019 020 /** 021 * Construct a boolean iterator that stops at the position in choice dataset where its value matches 022 * the given boolean 023 * @param v boolean value 024 * @param a primary dataset 025 * @param c choice dataset 026 * @param o output dataset, can be null 027 * @param createIfNull if true create the output dataset if that is null 028 */ 029 public BooleanContiguousIterator(boolean v, Dataset a, Dataset c, Dataset o, boolean createIfNull) { 030 super(v, a, c, o); 031 aMax = a.getSize() * aStep; 032 cStep = c.getElementsPerItem(); 033 cMax = c.getSize() * cStep; 034 if (outputA) { 035 oStep = aStep; 036 } else if (o != null) { 037 oStep = o.getElementsPerItem(); 038 } else if (createIfNull) { 039 oDataset = BroadcastUtils.createDataset(a, c, a.getShapeRef()); 040 oStep = oDataset.getElementsPerItem(); 041 } else { 042 oStep = 1; 043 } 044 maxShape = a.getShape(); 045 reset(); 046 } 047 048 @Override 049 public boolean hasNext() { 050 do { 051 index += aStep; 052 cIndex += cStep; 053 054 if (outputA) { 055 oIndex = index; 056 } else { 057 oIndex += oStep; 058 } 059 060 if (index >= aMax || cIndex >= cMax) { 061 return false; 062 } 063 } while (cDataset.getElementBooleanAbs(cIndex) != value); 064 065 return true; 066 } 067 068 @Override 069 public int[] getPos() { 070 return null; 071 } 072 073 @Override 074 public void reset() { 075 index = -aStep; 076 cIndex = -cStep; 077 oIndex = -oStep; 078 } 079}