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 a pair of contiguous datasets 017 */ 018public class ContiguousPairIterator extends BroadcastIterator { 019 private final int aMax; // maximum index in array 020 private final int aStep; // step over items 021 private final int bMax; // maximum index in array 022 private final int bStep; 023 private final int oStep; 024 025 public ContiguousPairIterator(Dataset a, Dataset b, Dataset o, boolean createIfNull) { 026 super(a, b, o); 027 aStep = a.getElementsPerItem(); 028 aMax = a.getSize() * aStep; 029 bStep = b.getElementsPerItem(); 030 bMax = b.getSize() * bStep; 031 if (outputA) { 032 oStep = aStep; 033 } else if (outputB) { 034 oStep = bStep; 035 } else if (o != null) { 036 oStep = o.getElementsPerItem(); 037 } else if (createIfNull) { 038 oDataset = BroadcastUtils.createDataset(a, b, a.getShapeRef()); 039 oStep = oDataset.getElementsPerItem(); 040 } else { 041 oStep = 1; 042 } 043 maxShape = a.getShape(); 044 reset(); 045 } 046 047 @Override 048 public boolean hasNext() { 049 aIndex += aStep; 050 bIndex += bStep; 051 052 if (outputA) { 053 oIndex = aIndex; 054 } else if (outputB) { 055 oIndex = bIndex; 056 } else { 057 oIndex += oStep; 058 } 059 060 if (aIndex >= aMax || bIndex >= bMax) { 061 return false; 062 } 063 if (read) { 064 if (asDouble) { 065 aDouble = aDataset.getElementDoubleAbs(aIndex); 066 bDouble = bDataset.getElementDoubleAbs(bIndex); 067 } else { 068 aLong = aDataset.getElementLongAbs(aIndex); 069 bLong = bDataset.getElementLongAbs(bIndex); 070 } 071 } 072 return true; 073 } 074 075 @Override 076 public int[] getPos() { 077 return null; 078 } 079 080 @Override 081 public void reset() { 082 aIndex = -aStep; 083 bIndex = -bStep; 084 oIndex = -oStep; 085 if (read) { 086 storeCurrentValues(); 087 } 088 } 089}