001/*-
002 *******************************************************************************
003 * Copyright (c) 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 * Interface to represent a binary operation for implementations over different output domains
017 */
018public interface BinaryOperation extends IOperation {
019
020        /**
021         * @param a
022         * @param b
023         * @return a op b
024         */
025        boolean booleanOperate(long a, long b);
026
027        /**
028         * @param a
029         * @param b
030         * @return a op b
031         */
032        long longOperate(long a, long b);
033
034        /**
035         * @param a
036         * @param b
037         * @return a op b
038         */
039        double doubleOperate(double a, double b);
040
041        /**
042         * @param out holds (ra, ia) op (rb, ib)
043         * @param ra
044         * @param ia
045         * @param rb
046         * @param ib
047         */
048        void complexOperate(double[] out, double ra, double ia, double rb, double ib);
049
050        /**
051         * @param a
052         * @param b
053         * @return string to represent output
054         * @since 2.0
055         */
056        String toString(String a, String b);
057
058        /**
059         * Stub class where only three methods need to be overridden:
060         *  {@link #complexOperate(double[], double, double, double, double)},
061         *  {@link #toString(String, String)}
062         */
063        public static class Stub implements BinaryOperation {
064                double[] z = new double[2];
065
066                @Override
067                public double doubleOperate(double a, double b) {
068                        complexOperate(z, a, 0, b, 0);
069                        return z[0];
070                }
071
072                @Override
073                public boolean booleanOperate(long a, long b) {
074                        return doubleOperate(a, b) != 0;
075                }
076
077                @Override
078                public long longOperate(long a, long b) {
079                        return DTypeUtils.toLong(doubleOperate(a, b));
080                }
081
082                /**
083                 * override this
084                 */
085                @Override
086                public void complexOperate(double[] out, double ra, double ia, double rb, double ib) {
087                }
088
089                /**
090                 * override this
091                 */
092                @Override
093                public String toString(String string, String string2) {
094                        return null;
095                }
096        }
097}