    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
    023         * @return op(a)
    024         */
    025        boolean booleanOperate(long a);
    026
    027        /**
    028         * @param a
    029         * @return op(a)
    030         */
    031        long longOperate(long a);
    032
    033        /**
    034         * @param a
    035         * @return op(a)a
    036         */
    037        double doubleOperate(double a);
    038
    039        /**
    040         * @param out holds op(ra, ia)
    041         * @param ra
    042         * @param ia
    043         */
    044        void complexOperate(double[] out, double ra, double ia);
    045
    046        /**
    047         * @param a
    048         * @return string to represent output
    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}