    001/*-
    002 * Copyright 2016 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
    012import java.util.Arrays;
    013
    014/**
    015 * Base class for broadcast iterators where the second dataset could be broadcast to the first
    016 * and it is also read into either bLong or bDouble fields.<p>
    017 * For speed, there are public members. Note, index is not updated
    018 */
    019public abstract class BroadcastSelfIterator extends BroadcastIteratorBase {
    020
    021        /**
    022         * @param a dataset to iterate over
    023         * @param b dataset to iterate over (will broadcast to first)
    024         * @return broadcast iterator
    025         */
    026        public static BroadcastSelfIterator createIterator(Dataset a, Dataset b) {
    027                if (Arrays.equals(a.getShapeRef(), b.getShapeRef()) && a.getStrides() == null && b.getStrides() == null) {
    028                        return a.getElementsPerItem() == 1 && b.getElementsPerItem() == 1 ? new ContiguousSingleIteratorElemental(a, b) : new ContiguousSingleIterator(a, b);
    029                }
    030                return new BroadcastSingleIterator(a, b);
    031        }
    032
    033        /**
    034         * @param a dataset to iterate over
    035         * @param b dataset to iterate over (will broadcast to first)
    036         */
    037        protected BroadcastSelfIterator(Dataset a, Dataset b) {
    038                super(a, b);
    039                read = InterfaceUtils.isNumerical(b.getClass());
    040                asDouble = aDataset.hasFloatingPointElements();
    041                BroadcastUtils.checkItemSize(a, b, null);
    042        }
    043
    044        @Override
    045        protected void storeCurrentValues() {
    046                if (bIndex >= 0) {
    047                        if (asDouble) {
    048                                bDouble = bDataset.getElementDoubleAbs(bIndex);
    049                        } else {
    050                                bLong = bDataset.getElementLongAbs(bIndex);
    051                        }
    052                }
    053        }
    054}