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