functions registry added + vars registry refactored
This commit is contained in:
parent
bda3b05624
commit
3ec11f5eee
@ -18,9 +18,9 @@ import android.widget.*;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.solovyev.android.calculator.math.MathType;
|
import org.solovyev.android.calculator.math.MathType;
|
||||||
|
import org.solovyev.android.calculator.model.AndroidVarsRegistry;
|
||||||
import org.solovyev.android.calculator.model.CalculatorEngine;
|
import org.solovyev.android.calculator.model.CalculatorEngine;
|
||||||
import org.solovyev.android.calculator.model.Var;
|
import org.solovyev.android.calculator.model.Var;
|
||||||
import org.solovyev.android.calculator.model.VarsRegister;
|
|
||||||
import org.solovyev.common.utils.StringUtils;
|
import org.solovyev.common.utils.StringUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -45,7 +45,7 @@ public class CalculatorVarsActivity extends ListActivity {
|
|||||||
|
|
||||||
setContentView(R.layout.vars);
|
setContentView(R.layout.vars);
|
||||||
|
|
||||||
adapter = new VarsArrayAdapter(this, R.layout.var, R.id.var_text, new ArrayList<Var>(CalculatorEngine.instance.getVarsRegister().getVars()));
|
adapter = new VarsArrayAdapter(this, R.layout.var, R.id.var_text, new ArrayList<Var>(CalculatorEngine.instance.getVarsRegister().getEntities()));
|
||||||
setListAdapter(adapter);
|
setListAdapter(adapter);
|
||||||
|
|
||||||
final ListView lv = getListView();
|
final ListView lv = getListView();
|
||||||
@ -193,9 +193,9 @@ public class CalculatorVarsActivity extends ListActivity {
|
|||||||
String description = editDescription.getText().toString();
|
String description = editDescription.getText().toString();
|
||||||
|
|
||||||
|
|
||||||
final VarsRegister varsRegister = CalculatorEngine.instance.getVarsRegister();
|
final AndroidVarsRegistry varsRegistry = CalculatorEngine.instance.getVarsRegister();
|
||||||
if (!StringUtils.isEmpty(name)) {
|
if (!StringUtils.isEmpty(name)) {
|
||||||
final Var varFromRegister = varsRegister.getVar(name);
|
final Var varFromRegister = varsRegistry.get(name);
|
||||||
if (varFromRegister == null || varFromRegister == editedInstance) {
|
if (varFromRegister == null || varFromRegister == editedInstance) {
|
||||||
final MathType.Result mathType = MathType.getType(name, 0);
|
final MathType.Result mathType = MathType.getType(name, 0);
|
||||||
|
|
||||||
@ -240,12 +240,12 @@ public class CalculatorVarsActivity extends ListActivity {
|
|||||||
createEditVariableDialog(editedInstance, name, value, description);
|
createEditVariableDialog(editedInstance, name, value, description);
|
||||||
} else {
|
} else {
|
||||||
if ( editedInstance == null ) {
|
if ( editedInstance == null ) {
|
||||||
CalculatorVarsActivity.this.adapter.add(varsRegister.addVar(null, varBuilder));
|
CalculatorVarsActivity.this.adapter.add(varsRegistry.add(null, varBuilder));
|
||||||
} else {
|
} else {
|
||||||
varsRegister.addVar(editedInstance.getName(), varBuilder);
|
varsRegistry.add(editedInstance.getName(), varBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
varsRegister.save(CalculatorVarsActivity.this);
|
varsRegistry.save(CalculatorVarsActivity.this);
|
||||||
|
|
||||||
CalculatorVarsActivity.this.adapter.notifyDataSetChanged();
|
CalculatorVarsActivity.this.adapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
@ -346,9 +346,9 @@ public class CalculatorVarsActivity extends ListActivity {
|
|||||||
builder.create().show();
|
builder.create().show();
|
||||||
} else {
|
} else {
|
||||||
adapter.remove(var);
|
adapter.remove(var);
|
||||||
final VarsRegister varsRegister = CalculatorEngine.instance.getVarsRegister();
|
final AndroidVarsRegistry varsRegistry = CalculatorEngine.instance.getVarsRegister();
|
||||||
varsRegister.remove(var);
|
varsRegistry.remove(var);
|
||||||
varsRegister.save(CalculatorVarsActivity.this);
|
varsRegistry.save(CalculatorVarsActivity.this);
|
||||||
CalculatorVarsActivity.this.adapter.notifyDataSetChanged();
|
CalculatorVarsActivity.this.adapter.notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,35 +19,6 @@ public class Functions {
|
|||||||
throw new AssertionError("Not allowed!");
|
throw new AssertionError("Not allowed!");
|
||||||
}
|
}
|
||||||
|
|
||||||
public final static String SIN = "sin";
|
|
||||||
public final static String SINH = "sinh";
|
|
||||||
public final static String ASIN = "asin";
|
|
||||||
public final static String ASINH = "asinh";
|
|
||||||
public final static String COS = "cos";
|
|
||||||
public final static String COSH = "cosh";
|
|
||||||
public final static String ACOS = "acos";
|
|
||||||
public final static String ACOSH = "acosh";
|
|
||||||
public final static String TAN = "tan";
|
|
||||||
public final static String TANH = "tanh";
|
|
||||||
public final static String ATAN = "atan";
|
|
||||||
public final static String ATANH = "atanh";
|
|
||||||
|
|
||||||
public final static String LN = "ln";
|
|
||||||
public final static String LG = "lg";
|
|
||||||
|
|
||||||
public final static String MOD = "mod";
|
|
||||||
public final static String EXP = "exp";
|
|
||||||
|
|
||||||
public final static String SQRT = "√";
|
|
||||||
|
|
||||||
public static final List<String> allPrefix;
|
|
||||||
|
|
||||||
static {
|
|
||||||
final List<String> functions = new ArrayList<String>(Arrays.asList(SIN, SINH, ASIN, ASINH, COS, COSH, ACOS, ACOSH, TAN, TANH, ATAN, ATANH, LN, LG, MOD, SQRT, EXP));
|
|
||||||
Collections.sort(functions, new MathEntityComparator());
|
|
||||||
allPrefix = functions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final static String DEGREE = "°";
|
public final static String DEGREE = "°";
|
||||||
|
|
||||||
public static final List<String> allPostfix = Arrays.asList(DEGREE);
|
public static final List<String> allPostfix = Arrays.asList(DEGREE);
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2009-2011. Created by serso aka se.solovyev.
|
|
||||||
* For more information, please, contact se.solovyev@gmail.com
|
|
||||||
* or visit http://se.solovyev.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.solovyev.android.calculator.math;
|
|
||||||
|
|
||||||
import java.util.Comparator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* User: serso
|
|
||||||
* Date: 10/3/11
|
|
||||||
* Time: 12:30 AM
|
|
||||||
*/
|
|
||||||
public class MathEntityComparator implements Comparator<String> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compare(String s, String s1) {
|
|
||||||
return s1.length() - s.length();
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,7 +7,6 @@ package org.solovyev.android.calculator.math;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.solovyev.android.calculator.CharacterAtPositionFinder;
|
|
||||||
import org.solovyev.android.calculator.StartsWithFinder;
|
import org.solovyev.android.calculator.StartsWithFinder;
|
||||||
import org.solovyev.android.calculator.model.CalculatorEngine;
|
import org.solovyev.android.calculator.model.CalculatorEngine;
|
||||||
import org.solovyev.android.calculator.model.ParseException;
|
import org.solovyev.android.calculator.model.ParseException;
|
||||||
@ -19,7 +18,6 @@ import java.util.Collections;
|
|||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.solovyev.common.utils.CollectionsUtils.get;
|
|
||||||
|
|
||||||
public enum MathType {
|
public enum MathType {
|
||||||
|
|
||||||
@ -129,13 +127,19 @@ public enum MathType {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
function(1000, true, true, Functions.allPrefix),
|
function(1000, true, true) {
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<String> getTokens() {
|
||||||
|
return CalculatorEngine.instance.getFunctionsRegistry().getNames();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
constant(1100, true, true) {
|
constant(1100, true, true) {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public List<String> getTokens() {
|
public List<String> getTokens() {
|
||||||
return CalculatorEngine.instance.getVarsRegister().getVarNames();
|
return CalculatorEngine.instance.getVarsRegister().getNames();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -324,7 +328,7 @@ public enum MathType {
|
|||||||
final StartsWithFinder startsWithFinder = new StartsWithFinder(text, i);
|
final StartsWithFinder startsWithFinder = new StartsWithFinder(text, i);
|
||||||
|
|
||||||
for (MathType mathType : getMathTypesByPriority()) {
|
for (MathType mathType : getMathTypesByPriority()) {
|
||||||
final String s = get(mathType.getTokens(), startsWithFinder);
|
final String s = CollectionsUtils.find(mathType.getTokens(), startsWithFinder);
|
||||||
if (s != null) {
|
if (s != null) {
|
||||||
return new Result(mathType, s);
|
return new Result(mathType, s);
|
||||||
}
|
}
|
||||||
@ -387,14 +391,6 @@ public enum MathType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean contains(@NotNull List<String> list, @NotNull final Finder<String> startsWithFinder) {
|
|
||||||
return get(list, startsWithFinder) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean contains(@NotNull List<Character> list, @NotNull final CharacterAtPositionFinder atPositionFinder) {
|
|
||||||
return get(list, atPositionFinder) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class EndsWithFinder implements Finder<String> {
|
private static class EndsWithFinder implements Finder<String> {
|
||||||
|
|
||||||
private int i;
|
private int i;
|
||||||
|
@ -7,35 +7,19 @@
|
|||||||
package org.solovyev.android.calculator.model;
|
package org.solovyev.android.calculator.model;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.solovyev.common.math.MathRegistry;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
* Date: 10/6/11
|
* Date: 10/6/11
|
||||||
* Time: 9:31 PM
|
* Time: 9:31 PM
|
||||||
*/
|
*/
|
||||||
public interface VarsRegister {
|
public interface AndroidVarsRegistry extends MathRegistry<Var>{
|
||||||
|
|
||||||
@NotNull
|
void init(@Nullable Context context, @Nullable SharedPreferences preferences);
|
||||||
List<Var> getVars();
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
List<Var> getSystemVars();
|
|
||||||
|
|
||||||
Var addVar(@Nullable String name, @NotNull Var.Builder builder);
|
|
||||||
|
|
||||||
void remove(@NotNull Var var);
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
List<String> getVarNames();
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
Var getVar(@NotNull String name);
|
|
||||||
|
|
||||||
boolean contains(@NotNull String name);
|
|
||||||
|
|
||||||
void save(@NotNull Context context);
|
void save(@NotNull Context context);
|
||||||
}
|
}
|
@ -14,114 +14,38 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.simpleframework.xml.Serializer;
|
import org.simpleframework.xml.Serializer;
|
||||||
import org.simpleframework.xml.core.Persister;
|
import org.simpleframework.xml.core.Persister;
|
||||||
import org.solovyev.android.calculator.R;
|
import org.solovyev.android.calculator.R;
|
||||||
import org.solovyev.android.calculator.math.MathEntityComparator;
|
|
||||||
import org.solovyev.android.calculator.math.MathType;
|
import org.solovyev.android.calculator.math.MathType;
|
||||||
import org.solovyev.common.utils.CollectionsUtils;
|
import org.solovyev.common.math.AbstractMathRegistry;
|
||||||
import org.solovyev.common.utils.Finder;
|
|
||||||
|
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: serso
|
* User: serso
|
||||||
* Date: 9/29/11
|
* Date: 9/29/11
|
||||||
* Time: 4:57 PM
|
* Time: 4:57 PM
|
||||||
*/
|
*/
|
||||||
class VarsRegisterImpl implements VarsRegister {
|
class AndroidVarsRegistryImpl extends AbstractMathRegistry<Var> implements AndroidVarsRegistry {
|
||||||
|
|
||||||
@NotNull
|
protected AndroidVarsRegistryImpl() {
|
||||||
private final List<Var> vars = new ArrayList<Var>();
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private final List<Var> systemVars = new ArrayList<Var>();
|
|
||||||
|
|
||||||
protected VarsRegisterImpl() {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/* public void merge(@NotNull final List<Var> varsParam) {
|
||||||
@NotNull
|
|
||||||
public List<Var> getVars() {
|
|
||||||
return Collections.unmodifiableList(vars);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@NotNull
|
|
||||||
public List<Var> getSystemVars() {
|
|
||||||
return Collections.unmodifiableList(systemVars);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Var addVar(@Nullable String name, @NotNull Var.Builder builder) {
|
|
||||||
final Var var = builder.create();
|
|
||||||
|
|
||||||
Var varFromRegister = getVar(name == null ? var.getName() : name);
|
|
||||||
if (varFromRegister == null) {
|
|
||||||
varFromRegister = var;
|
|
||||||
vars.add(var);
|
|
||||||
} else {
|
|
||||||
varFromRegister.copy(var);
|
|
||||||
}
|
|
||||||
|
|
||||||
return varFromRegister;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void remove(@NotNull Var var) {
|
|
||||||
this.vars.remove(var);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@NotNull
|
|
||||||
public List<String> getVarNames() {
|
|
||||||
final List<String> result = new ArrayList<String>();
|
|
||||||
|
|
||||||
for (Var var : vars) {
|
|
||||||
result.add(var.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
Collections.sort(result, new MathEntityComparator());
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Nullable
|
|
||||||
public Var getVar(@NotNull final String name) {
|
|
||||||
return CollectionsUtils.get(vars, new Finder<Var>() {
|
|
||||||
@Override
|
|
||||||
public boolean isFound(@Nullable Var var) {
|
|
||||||
return var != null && name.equals(var.getName());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean contains(@NotNull final String name) {
|
|
||||||
return CollectionsUtils.get(vars, new Finder<Var>() {
|
|
||||||
@Override
|
|
||||||
public boolean isFound(@Nullable Var var) {
|
|
||||||
return var != null && name.equals(var.getName());
|
|
||||||
}
|
|
||||||
}) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void merge(@NotNull final List<Var> varsParam) {
|
|
||||||
final Set<Var> result = new HashSet<Var>(varsParam);
|
final Set<Var> result = new HashSet<Var>(varsParam);
|
||||||
|
|
||||||
for (Var systemVar : systemVars) {
|
for (Var systemVar : systemEntities) {
|
||||||
if (!result.contains(systemVar)) {
|
if (!result.contains(systemVar)) {
|
||||||
result.add(systemVar);
|
result.add(systemVar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vars.clear();
|
entities.clear();
|
||||||
vars.addAll(result);
|
entities.addAll(result);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
synchronized void init(@Nullable Context context, @Nullable SharedPreferences preferences) {
|
public synchronized void init(@Nullable Context context, @Nullable SharedPreferences preferences) {
|
||||||
|
|
||||||
this.vars.clear();
|
this.entities.clear();
|
||||||
this.systemVars.clear();
|
this.systemEntities.clear();
|
||||||
|
|
||||||
if (context != null && preferences != null) {
|
if (context != null && preferences != null) {
|
||||||
final String value = preferences.getString(context.getString(R.string.p_calc_vars), null);
|
final String value = preferences.getString(context.getString(R.string.p_calc_vars), null);
|
||||||
@ -129,7 +53,7 @@ class VarsRegisterImpl implements VarsRegister {
|
|||||||
final Serializer serializer = new Persister();
|
final Serializer serializer = new Persister();
|
||||||
try {
|
try {
|
||||||
final Vars vars = serializer.read(Vars.class, value);
|
final Vars vars = serializer.read(Vars.class, value);
|
||||||
this.vars.addAll(vars.getVars());
|
this.entities.addAll(vars.getVars());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@ -181,15 +105,15 @@ class VarsRegisterImpl implements VarsRegister {
|
|||||||
|
|
||||||
final Var systemVar = builder.create();
|
final Var systemVar = builder.create();
|
||||||
|
|
||||||
systemVars.add(systemVar);
|
systemEntities.add(systemVar);
|
||||||
if (!vars.contains(systemVar)) {
|
if (!entities.contains(systemVar)) {
|
||||||
vars.add(systemVar);
|
entities.add(systemVar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Log.d(VarsRegister.class.getName(), vars.size() + " variables registered!");
|
/*Log.d(AndroidVarsRegistry.class.getName(), vars.size() + " variables registered!");
|
||||||
for (Var var : vars) {
|
for (Var var : vars) {
|
||||||
Log.d(VarsRegister.class.getName(), var.toString());
|
Log.d(AndroidVarsRegistry.class.getName(), var.toString());
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,7 +123,7 @@ class VarsRegisterImpl implements VarsRegister {
|
|||||||
final SharedPreferences.Editor editor = settings.edit();
|
final SharedPreferences.Editor editor = settings.edit();
|
||||||
|
|
||||||
final Vars vars = new Vars();
|
final Vars vars = new Vars();
|
||||||
for (Var var : this.vars) {
|
for (Var var : this.entities) {
|
||||||
if (!var.isSystem()) {
|
if (!var.isSystem()) {
|
||||||
vars.getVars().add(var);
|
vars.getVars().add(var);
|
||||||
}
|
}
|
@ -8,6 +8,8 @@ package org.solovyev.android.calculator.model;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import jscl.math.Expression;
|
import jscl.math.Expression;
|
||||||
|
import jscl.math.function.Function;
|
||||||
|
import jscl.math.function.FunctionsRegistry;
|
||||||
import jscl.text.ParseInterruptedException;
|
import jscl.text.ParseInterruptedException;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@ -15,6 +17,7 @@ import org.solovyev.android.calculator.R;
|
|||||||
import org.solovyev.android.calculator.jscl.JsclOperation;
|
import org.solovyev.android.calculator.jscl.JsclOperation;
|
||||||
import org.solovyev.android.msg.AndroidMessage;
|
import org.solovyev.android.msg.AndroidMessage;
|
||||||
import org.solovyev.common.NumberMapper;
|
import org.solovyev.common.NumberMapper;
|
||||||
|
import org.solovyev.common.math.MathRegistry;
|
||||||
import org.solovyev.common.msg.MessageRegistry;
|
import org.solovyev.common.msg.MessageRegistry;
|
||||||
import org.solovyev.common.msg.MessageType;
|
import org.solovyev.common.msg.MessageType;
|
||||||
import org.solovyev.common.utils.CollectionsUtils;
|
import org.solovyev.common.utils.CollectionsUtils;
|
||||||
@ -61,7 +64,10 @@ public enum CalculatorEngine {
|
|||||||
public final TextProcessor<PreparedExpression> preprocessor = new ToJsclTextProcessor();
|
public final TextProcessor<PreparedExpression> preprocessor = new ToJsclTextProcessor();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final VarsRegisterImpl varsRegister = new VarsRegisterImpl();
|
private final AndroidVarsRegistry varsRegister = new AndroidVarsRegistryImpl();
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final MathRegistry<Function> functionsRegistry = FunctionsRegistry.getInstance();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final static Set<String> tooLongExecutionCache = new HashSet<String>();
|
private final static Set<String> tooLongExecutionCache = new HashSet<String>();
|
||||||
@ -180,9 +186,9 @@ public enum CalculatorEngine {
|
|||||||
calculationThread.setObject(thread);
|
calculationThread.setObject(thread);
|
||||||
calculationResult.setObject(finalOperation.evaluate(Expression.valueOf(jsclExpression)));
|
calculationResult.setObject(finalOperation.evaluate(Expression.valueOf(jsclExpression)));
|
||||||
} catch (ArithmeticException e) {
|
} catch (ArithmeticException e) {
|
||||||
exception.setObject(new ParseException(e));
|
exception.setObject(new ParseException(e.getMessage(), e));
|
||||||
} catch (jscl.text.ParseException e) {
|
} catch (jscl.text.ParseException e) {
|
||||||
exception.setObject(new ParseException(e));
|
exception.setObject(new ParseException(e.getMessage(), e));
|
||||||
} catch (ParseInterruptedException e) {
|
} catch (ParseInterruptedException e) {
|
||||||
System.out.print("Interrupted!");
|
System.out.print("Interrupted!");
|
||||||
// do nothing - we ourselves interrupt the calculations
|
// do nothing - we ourselves interrupt the calculations
|
||||||
@ -282,10 +288,15 @@ public enum CalculatorEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public VarsRegister getVarsRegister() {
|
public AndroidVarsRegistry getVarsRegister() {
|
||||||
return varsRegister;
|
return varsRegister;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public MathRegistry<Function> getFunctionsRegistry() {
|
||||||
|
return functionsRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
// for tests
|
// for tests
|
||||||
void setTimeout(int timeout) {
|
void setTimeout(int timeout) {
|
||||||
this.timeout = timeout;
|
this.timeout = timeout;
|
||||||
|
@ -83,7 +83,7 @@ public class NumberBuilder {
|
|||||||
|
|
||||||
if (number != null) {
|
if (number != null) {
|
||||||
final String finalNumber = number;
|
final String finalNumber = number;
|
||||||
final Var var = CollectionsUtils.get(CalculatorEngine.instance.getVarsRegister().getSystemVars(), new Finder<Var>() {
|
final Var var = CollectionsUtils.find(CalculatorEngine.instance.getVarsRegister().getSystemEntities(), new Finder<Var>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean isFound(@Nullable Var var) {
|
public boolean isFound(@Nullable Var var) {
|
||||||
return var != null && finalNumber.equals(var.getValue());
|
return var != null && finalNumber.equals(var.getValue());
|
||||||
|
@ -15,10 +15,17 @@ import org.solovyev.common.exceptions.SersoException;
|
|||||||
*/
|
*/
|
||||||
public class ParseException extends SersoException {
|
public class ParseException extends SersoException {
|
||||||
|
|
||||||
|
public ParseException() {
|
||||||
|
}
|
||||||
|
|
||||||
public ParseException(String message) {
|
public ParseException(String message) {
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ParseException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
public ParseException(Throwable cause) {
|
public ParseException(Throwable cause) {
|
||||||
super(cause);
|
super(cause);
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ class ToJsclTextProcessor implements TextProcessor<PreparedExpression> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mathTypeBefore == MathType.function && CollectionsUtils.get(MathType.openGroupSymbols, startsWithFinder) != null) {
|
if (mathTypeBefore == MathType.function && CollectionsUtils.find(MathType.openGroupSymbols, startsWithFinder) != null) {
|
||||||
throw new ParseException("Empty function: " + mathTypeResult.getMatch());
|
throw new ParseException("Empty function: " + mathTypeResult.getMatch());
|
||||||
} else if (mathTypeBefore == MathType.postfix_function && mathTypeResult.getMathType() == MathType.binary_operation) {
|
} else if (mathTypeBefore == MathType.postfix_function && mathTypeResult.getMathType() == MathType.binary_operation) {
|
||||||
if ( mathTypeResult.getMatch().equals("^") ) {
|
if ( mathTypeResult.getMatch().equals("^") ) {
|
||||||
@ -68,11 +68,11 @@ class ToJsclTextProcessor implements TextProcessor<PreparedExpression> {
|
|||||||
startsWithFinder.setI(i);
|
startsWithFinder.setI(i);
|
||||||
|
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
String functionName = CollectionsUtils.get(MathType.function.getTokens(), startsWithFinder);
|
String functionName = CollectionsUtils.find(MathType.function.getTokens(), startsWithFinder);
|
||||||
if (functionName == null) {
|
if (functionName == null) {
|
||||||
String varName = CollectionsUtils.get(CalculatorEngine.instance.getVarsRegister().getVarNames(), startsWithFinder);
|
String varName = CollectionsUtils.find(CalculatorEngine.instance.getVarsRegister().getNames(), startsWithFinder);
|
||||||
if (varName != null) {
|
if (varName != null) {
|
||||||
final Var var = CalculatorEngine.instance.getVarsRegister().getVar(varName);
|
final Var var = CalculatorEngine.instance.getVarsRegister().get(varName);
|
||||||
if (var != null) {
|
if (var != null) {
|
||||||
if (var.isUndefined()) {
|
if (var.isUndefined()) {
|
||||||
undefinedVars.add(var);
|
undefinedVars.add(var);
|
||||||
|
@ -10,6 +10,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.simpleframework.xml.Element;
|
import org.simpleframework.xml.Element;
|
||||||
import org.simpleframework.xml.Root;
|
import org.simpleframework.xml.Root;
|
||||||
|
import org.solovyev.common.definitions.IBuilder;
|
||||||
|
import org.solovyev.common.math.MathEntity;
|
||||||
import org.solovyev.common.utils.StringUtils;
|
import org.solovyev.common.utils.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -19,7 +21,7 @@ import org.solovyev.common.utils.StringUtils;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
@Root
|
@Root
|
||||||
public class Var {
|
public class Var implements MathEntity{
|
||||||
|
|
||||||
@Element
|
@Element
|
||||||
@NotNull
|
@NotNull
|
||||||
@ -36,7 +38,7 @@ public class Var {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder implements IBuilder<Var>{
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private String name;
|
private String name;
|
||||||
@ -86,7 +88,8 @@ public class Var {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Var create () {
|
@NotNull
|
||||||
|
public Var create () {
|
||||||
final Var var = new Var();
|
final Var var = new Var();
|
||||||
|
|
||||||
var.name = name;
|
var.name = name;
|
||||||
@ -101,11 +104,16 @@ public class Var {
|
|||||||
private Var() {
|
private Var() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void copy(@NotNull Var var) {
|
public void copy(@NotNull MathEntity o) {
|
||||||
this.name = var.name;
|
if (o instanceof Var) {
|
||||||
this.value = var.value;
|
final Var that = ((Var) o);
|
||||||
this.description = var.description;
|
this.name = that.name;
|
||||||
this.system = var.system;
|
this.value = that.value;
|
||||||
|
this.description = that.description;
|
||||||
|
this.system = that.system;
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Trying to make a copy of unsupported type: " + o.getClass());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -63,6 +63,10 @@ public class CalculatorEngineTest {
|
|||||||
public void testEvaluate() throws Exception {
|
public void testEvaluate() throws Exception {
|
||||||
final CalculatorEngine cm = CalculatorEngine.instance;
|
final CalculatorEngine cm = CalculatorEngine.instance;
|
||||||
|
|
||||||
|
Assert.assertEquals("0", cm.evaluate(JsclOperation.numeric, "eq(0, 1)").getResult());
|
||||||
|
Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "eq(1, 1)").getResult());
|
||||||
|
Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "eq( 1, 1)").getResult());
|
||||||
|
Assert.assertEquals("eq(1,1)", cm.evaluate(JsclOperation.simplify, "eq( 1, 1)").getResult());
|
||||||
Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "lg(10)").getResult());
|
Assert.assertEquals("1", cm.evaluate(JsclOperation.numeric, "lg(10)").getResult());
|
||||||
Assert.assertEquals("4", cm.evaluate(JsclOperation.numeric, "2+2").getResult());
|
Assert.assertEquals("4", cm.evaluate(JsclOperation.numeric, "2+2").getResult());
|
||||||
Assert.assertEquals("-0.757", cm.evaluate(JsclOperation.numeric, "sin(4)").getResult());
|
Assert.assertEquals("-0.757", cm.evaluate(JsclOperation.numeric, "sin(4)").getResult());
|
||||||
@ -85,7 +89,7 @@ public class CalculatorEngineTest {
|
|||||||
Assert.assertEquals("-3.41+3.41i", cm.evaluate(JsclOperation.numeric, "(5tan(2i)+2i)/(1-i)").getResult());
|
Assert.assertEquals("-3.41+3.41i", cm.evaluate(JsclOperation.numeric, "(5tan(2i)+2i)/(1-i)").getResult());
|
||||||
Assert.assertEquals("-0.1-0.2i", cm.evaluate(JsclOperation.numeric, "(1-i)/(2+6i)").getResult());
|
Assert.assertEquals("-0.1-0.2i", cm.evaluate(JsclOperation.numeric, "(1-i)/(2+6i)").getResult());
|
||||||
|
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("si", 5d));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("si", 5d));
|
||||||
|
|
||||||
Assert.assertEquals("-0.959", cm.evaluate(JsclOperation.numeric, "sin(5)").getResult());
|
Assert.assertEquals("-0.959", cm.evaluate(JsclOperation.numeric, "sin(5)").getResult());
|
||||||
Assert.assertEquals("-4.795", cm.evaluate(JsclOperation.numeric, "sin(5)si").getResult());
|
Assert.assertEquals("-4.795", cm.evaluate(JsclOperation.numeric, "sin(5)si").getResult());
|
||||||
@ -93,14 +97,14 @@ public class CalculatorEngineTest {
|
|||||||
Assert.assertEquals("-23.973", cm.evaluate(JsclOperation.numeric, "si*sin(5)si").getResult());
|
Assert.assertEquals("-23.973", cm.evaluate(JsclOperation.numeric, "si*sin(5)si").getResult());
|
||||||
Assert.assertEquals("-3.309", cm.evaluate(JsclOperation.numeric, "sisin(5si)si").getResult());
|
Assert.assertEquals("-3.309", cm.evaluate(JsclOperation.numeric, "sisin(5si)si").getResult());
|
||||||
|
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("s", 1d));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("s", 1d));
|
||||||
Assert.assertEquals("5", cm.evaluate(JsclOperation.numeric, "si").getResult());
|
Assert.assertEquals("5", cm.evaluate(JsclOperation.numeric, "si").getResult());
|
||||||
|
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("k", 3.5d));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("k", 3.5d));
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("k1", 4d));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("k1", 4d));
|
||||||
Assert.assertEquals("4", cm.evaluate(JsclOperation.numeric, "k11").getResult());
|
Assert.assertEquals("4", cm.evaluate(JsclOperation.numeric, "k11").getResult());
|
||||||
|
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("t", (String) null));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("t", (String) null));
|
||||||
Assert.assertEquals("11t", cm.evaluate(JsclOperation.numeric, "t11").getResult());
|
Assert.assertEquals("11t", cm.evaluate(JsclOperation.numeric, "t11").getResult());
|
||||||
Assert.assertEquals("11et", cm.evaluate(JsclOperation.numeric, "t11e").getResult());
|
Assert.assertEquals("11et", cm.evaluate(JsclOperation.numeric, "t11e").getResult());
|
||||||
Assert.assertEquals("11×Infinityt", cm.evaluate(JsclOperation.numeric, "t11∞").getResult());
|
Assert.assertEquals("11×Infinityt", cm.evaluate(JsclOperation.numeric, "t11∞").getResult());
|
||||||
@ -144,7 +148,7 @@ public class CalculatorEngineTest {
|
|||||||
}
|
}
|
||||||
Assert.assertEquals("0.739", cm.evaluate(JsclOperation.numeric, "cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(1))))))))))))))))))))))))))))))))))))").getResult());
|
Assert.assertEquals("0.739", cm.evaluate(JsclOperation.numeric, "cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(cos(1))))))))))))))))))))))))))))))))))))").getResult());
|
||||||
|
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("si", 5d));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("si", 5d));
|
||||||
Assert.assertEquals("5", cm.evaluate(JsclOperation.numeric, "si").getResult());
|
Assert.assertEquals("5", cm.evaluate(JsclOperation.numeric, "si").getResult());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -33,14 +33,14 @@ public class FromJsclSimplifyTextProcessorTest {
|
|||||||
Assert.assertEquals("e", tp.process("2.718281828459045"));
|
Assert.assertEquals("e", tp.process("2.718281828459045"));
|
||||||
Assert.assertEquals("tee", tp.process("t2.718281828459045*2.718281828459045"));
|
Assert.assertEquals("tee", tp.process("t2.718281828459045*2.718281828459045"));
|
||||||
|
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("t2.718281828459045", "2"));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("t2.718281828459045", "2"));
|
||||||
Assert.assertEquals("t2.718281828459045e", tp.process("t2.718281828459045*2.718281828459045"));
|
Assert.assertEquals("t2.718281828459045e", tp.process("t2.718281828459045*2.718281828459045"));
|
||||||
Assert.assertEquals("ee", tp.process("2.718281828459045*2.718281828459045"));
|
Assert.assertEquals("ee", tp.process("2.718281828459045*2.718281828459045"));
|
||||||
Assert.assertEquals("t×", tp.process("t*"));
|
Assert.assertEquals("t×", tp.process("t*"));
|
||||||
Assert.assertEquals("×t", tp.process("*t"));
|
Assert.assertEquals("×t", tp.process("*t"));
|
||||||
Assert.assertEquals("t×2", tp.process("t*2"));
|
Assert.assertEquals("t×2", tp.process("t*2"));
|
||||||
Assert.assertEquals("2×t", tp.process("2*t"));
|
Assert.assertEquals("2×t", tp.process("2*t"));
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("t", (String)null));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("t", (String) null));
|
||||||
Assert.assertEquals("t×", tp.process("t*"));
|
Assert.assertEquals("t×", tp.process("t*"));
|
||||||
Assert.assertEquals("×t", tp.process("*t"));
|
Assert.assertEquals("×t", tp.process("*t"));
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ public class FromJsclSimplifyTextProcessorTest {
|
|||||||
Assert.assertEquals("t^[2×2t]", tp.process("t^[2*2*t]"));
|
Assert.assertEquals("t^[2×2t]", tp.process("t^[2*2*t]"));
|
||||||
Assert.assertEquals("2t^2[2t]", tp.process("2*t^2[2*t]"));
|
Assert.assertEquals("2t^2[2t]", tp.process("2*t^2[2*t]"));
|
||||||
|
|
||||||
CalculatorEngine.instance.getVarsRegister().addVar(null, new Var.Builder("k", (String)null));
|
CalculatorEngine.instance.getVarsRegister().add(null, new Var.Builder("k", (String) null));
|
||||||
Assert.assertEquals("(t+2k)[k+2t]", tp.process("(t+2*k)*[k+2*t]"));
|
Assert.assertEquals("(t+2k)[k+2t]", tp.process("(t+2*k)*[k+2*t]"));
|
||||||
Assert.assertEquals("(te+2k)e[k+2te]", tp.process("(t*e+2*k)*e*[k+2*t*e]"));
|
Assert.assertEquals("(te+2k)e[k+2te]", tp.process("(t*e+2*k)*e*[k+2*t*e]"));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user