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 private static long toLong(double d) { 072 if (Double.isInfinite(d) || Double.isNaN(d)) 073 return 0; 074 return (long) d; 075 } 076 077 @Override 078 public long longOperate(long a) { 079 return toLong(doubleOperate(a)); 080 } 081 082 /** 083 * Override this 084 */ 085 @Override 086 public void complexOperate(double[] out, double ra, double ia) { 087 } 088 089 /** 090 * Override this 091 */ 092 @Override 093 public String toString(String a) { 094 return null; 095 } 096 } 097}