1
0
mirror of https://github.com/DanilaFe/abacus synced 2024-12-24 00:10:09 -08:00

Add the number implementation to the plugin manager, and use it.

This commit is contained in:
Danila Fedorin 2017-08-03 21:05:25 -07:00
parent 3f2c4ae249
commit 8a79d0c2df
5 changed files with 76 additions and 15 deletions

View File

@ -1,12 +1,12 @@
package org.nwapw.abacus; package org.nwapw.abacus;
import org.nwapw.abacus.config.ConfigurationObject; import org.nwapw.abacus.config.ConfigurationObject;
import org.nwapw.abacus.number.NaiveNumber;
import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.number.NumberInterface;
import org.nwapw.abacus.parsing.LexerTokenizer; import org.nwapw.abacus.parsing.LexerTokenizer;
import org.nwapw.abacus.parsing.ShuntingYardParser; import org.nwapw.abacus.parsing.ShuntingYardParser;
import org.nwapw.abacus.parsing.TreeBuilder; import org.nwapw.abacus.parsing.TreeBuilder;
import org.nwapw.abacus.plugin.ClassFinder; import org.nwapw.abacus.plugin.ClassFinder;
import org.nwapw.abacus.plugin.NumberImplementation;
import org.nwapw.abacus.plugin.PluginManager; import org.nwapw.abacus.plugin.PluginManager;
import org.nwapw.abacus.plugin.StandardPlugin; import org.nwapw.abacus.plugin.StandardPlugin;
import org.nwapw.abacus.tree.NumberReducer; import org.nwapw.abacus.tree.NumberReducer;
@ -16,7 +16,6 @@ import org.nwapw.abacus.window.Window;
import javax.swing.*; import javax.swing.*;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
/** /**
* The main calculator class. This is responsible * The main calculator class. This is responsible
@ -25,10 +24,7 @@ import java.lang.reflect.InvocationTargetException;
*/ */
public class Abacus { public class Abacus {
/** public static final NumberImplementation DEFAULT_IMPLEMENTATION = StandardPlugin.IMPLEMENTATION_NAIVE;
* The default implementation to use for the number representation.
*/
public static final Class<? extends NumberInterface> DEFAULT_NUMBER = NaiveNumber.class;
/** /**
* The file used for saving and loading configuration. * The file used for saving and loading configuration.
*/ */
@ -154,15 +150,10 @@ public class Abacus {
* @return the resulting number. * @return the resulting number.
*/ */
public NumberInterface numberFromString(String numberString) { public NumberInterface numberFromString(String numberString) {
Class<? extends NumberInterface> toInstantiate = NumberImplementation toInstantiate =
pluginManager.numberFor(configuration.getNumberImplementation()); pluginManager.numberImplementationFor(configuration.getNumberImplementation());
if (toInstantiate == null) toInstantiate = DEFAULT_NUMBER; if (toInstantiate == null) toInstantiate = DEFAULT_IMPLEMENTATION;
try { return toInstantiate.instanceForString(numberString);
return toInstantiate.getConstructor(String.class).newInstance(numberString);
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
} }
} }

View File

@ -2,6 +2,7 @@ package org.nwapw.abacus.plugin;
import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.number.NumberInterface;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
@ -11,6 +12,12 @@ public abstract class NumberImplementation {
private Map<String, Function<NumberInterface, NumberInterface>> promotionPaths; private Map<String, Function<NumberInterface, NumberInterface>> promotionPaths;
private int priority; private int priority;
public NumberImplementation(Class<? extends NumberInterface> implementation, int priority){
this.implementation = implementation;
this.priority = priority;
promotionPaths = new HashMap<>();
}
public abstract NumberInterface instanceForString(String string); public abstract NumberInterface instanceForString(String string);
public abstract NumberInterface instanceForPi(); public abstract NumberInterface instanceForPi();

View File

@ -24,6 +24,10 @@ public abstract class Plugin {
* A hash map of operators mapped to their string names. * A hash map of operators mapped to their string names.
*/ */
private Map<String, Operator> operators; private Map<String, Operator> operators;
/**
* The map of the number implementations this plugin provides.
*/
private Map<String, NumberImplementation> numberImplementations;
/** /**
* The plugin manager in which to search for functions * The plugin manager in which to search for functions
* not inside this package, * not inside this package,
@ -46,6 +50,7 @@ public abstract class Plugin {
this.manager = manager; this.manager = manager;
functions = new HashMap<>(); functions = new HashMap<>();
operators = new HashMap<>(); operators = new HashMap<>();
numberImplementations = new HashMap<>();
enabled = false; enabled = false;
} }
@ -67,6 +72,10 @@ public abstract class Plugin {
return operators.keySet(); return operators.keySet();
} }
public final Set<String> providedNumberImplementations(){
return numberImplementations.keySet();
}
/** /**
* Gets a function under the given function name. * Gets a function under the given function name.
* *
@ -87,6 +96,10 @@ public abstract class Plugin {
return operators.get(operatorName); return operators.get(operatorName);
} }
public final NumberImplementation getNumberImplementation(String name){
return numberImplementations.get(name);
}
/** /**
* Enables the function, loading the necessary instances * Enables the function, loading the necessary instances
* of functions. * of functions.
@ -132,6 +145,10 @@ public abstract class Plugin {
operators.put(name, operator); operators.put(name, operator);
} }
protected final void registerNumberImplementation(String name, NumberImplementation implementation){
numberImplementations.put(name, implementation);
}
/** /**
* Searches the PluginManager for the given function name. * Searches the PluginManager for the given function name.
* This can be used by the plugins internally in order to call functions * This can be used by the plugins internally in order to call functions
@ -156,6 +173,10 @@ public abstract class Plugin {
return manager.operatorFor(name); return manager.operatorFor(name);
} }
protected final NumberImplementation numberImplementationFor(String name){
return manager.numberImplementationFor(name);
}
/** /**
* Abstract method to be overridden by plugin implementation, in which the plugins * Abstract method to be overridden by plugin implementation, in which the plugins
* are supposed to register the functions they provide and do any other * are supposed to register the functions they provide and do any other

View File

@ -30,6 +30,7 @@ public class PluginManager {
* that is, found in a plugin and returned. * that is, found in a plugin and returned.
*/ */
private Map<String, Operator> cachedOperators; private Map<String, Operator> cachedOperators;
private Map<String, NumberImplementation> cachedNumberImplementations;
/** /**
* List of all functions loaded by the plugins. * List of all functions loaded by the plugins.
*/ */
@ -38,6 +39,7 @@ public class PluginManager {
* List of all operators loaded by the plugins. * List of all operators loaded by the plugins.
*/ */
private Set<String> allOperators; private Set<String> allOperators;
private Set<String> allNumberImplementations;
/** /**
* The list of plugin listeners attached to this instance. * The list of plugin listeners attached to this instance.
*/ */
@ -51,8 +53,10 @@ public class PluginManager {
plugins = new HashSet<>(); plugins = new HashSet<>();
cachedFunctions = new HashMap<>(); cachedFunctions = new HashMap<>();
cachedOperators = new HashMap<>(); cachedOperators = new HashMap<>();
cachedNumberImplementations = new HashMap<>();
allFunctions = new HashSet<>(); allFunctions = new HashSet<>();
allOperators = new HashSet<>(); allOperators = new HashSet<>();
allNumberImplementations = new HashSet<>();
listeners = new HashSet<>(); listeners = new HashSet<>();
} }
@ -109,6 +113,10 @@ public class PluginManager {
return searchCached(plugins, cachedOperators, Plugin::providedOperators, Plugin::getOperator, name); return searchCached(plugins, cachedOperators, Plugin::providedOperators, Plugin::getOperator, name);
} }
public NumberImplementation numberImplementationFor(String name){
return searchCached(plugins, cachedNumberImplementations, Plugin::providedNumberImplementations,
Plugin::getNumberImplementation, name);
}
/** /**
* Adds an instance of Plugin that already has been instantiated. * Adds an instance of Plugin that already has been instantiated.
* *
@ -143,6 +151,7 @@ public class PluginManager {
for (Plugin plugin : plugins) { for (Plugin plugin : plugins) {
allFunctions.addAll(plugin.providedFunctions()); allFunctions.addAll(plugin.providedFunctions());
allOperators.addAll(plugin.providedOperators()); allOperators.addAll(plugin.providedOperators());
allNumberImplementations.addAll(plugin.providedNumberImplementations());
} }
listeners.forEach(e -> e.onLoad(this)); listeners.forEach(e -> e.onLoad(this));
} }
@ -154,6 +163,7 @@ public class PluginManager {
for (Plugin plugin : plugins) plugin.disable(); for (Plugin plugin : plugins) plugin.disable();
allFunctions.clear(); allFunctions.clear();
allOperators.clear(); allOperators.clear();
allNumberImplementations.clear();
listeners.forEach(e -> e.onUnload(this)); listeners.forEach(e -> e.onUnload(this));
} }
@ -183,6 +193,10 @@ public class PluginManager {
return allOperators; return allOperators;
} }
public Set<String> getAllNumberImplementations(){
return allNumberImplementations;
}
/** /**
* Adds a plugin change listener to this plugin manager. * Adds a plugin change listener to this plugin manager.
* *

View File

@ -6,6 +6,7 @@ import org.nwapw.abacus.function.OperatorAssociativity;
import org.nwapw.abacus.function.OperatorType; import org.nwapw.abacus.function.OperatorType;
import org.nwapw.abacus.number.NaiveNumber; import org.nwapw.abacus.number.NaiveNumber;
import org.nwapw.abacus.number.NumberInterface; import org.nwapw.abacus.number.NumberInterface;
import org.nwapw.abacus.number.PreciseNumber;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -306,6 +307,30 @@ public class StandardPlugin extends Plugin {
} }
}; };
public static final NumberImplementation IMPLEMENTATION_NAIVE = new NumberImplementation(NaiveNumber.class, 0) {
@Override
public NumberInterface instanceForString(String string) {
return new NaiveNumber(string);
}
@Override
public NumberInterface instanceForPi() {
return new NaiveNumber(Math.PI);
}
};
public static final NumberImplementation IMPLEMENTATION_PRECISE = new NumberImplementation(PreciseNumber.class, 0) {
@Override
public NumberInterface instanceForString(String string) {
return new PreciseNumber(string);
}
@Override
public NumberInterface instanceForPi() {
return null;
}
};
public StandardPlugin(PluginManager manager) { public StandardPlugin(PluginManager manager) {
super(manager); super(manager);
} }
@ -338,6 +363,9 @@ public class StandardPlugin extends Plugin {
@Override @Override
public void onEnable() { public void onEnable() {
registerNumberImplementation("naive", IMPLEMENTATION_NAIVE);
registerNumberImplementation("precise", IMPLEMENTATION_PRECISE);
registerOperator("+", OP_ADD); registerOperator("+", OP_ADD);
registerOperator("-", OP_SUBTRACT); registerOperator("-", OP_SUBTRACT);
registerOperator("*", OP_MULTIPLY); registerOperator("*", OP_MULTIPLY);