package de.gaalop.productComputer;
import de.gaalop.cfg.AlgebraDefinitionFile;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
/**
*
* @author christian
*/
public class AlgebraPC {
public String[] base;
public String[] base2;
public HashMap<String, Byte> baseSquaresStr;
public HashMap<String, LinkedList<BladeStr>> mapToPlusMinus;
public HashMap<String, LinkedList<BladeStr>> mapToZeroInf;
public AlgebraPC(AlgebraDefinitionFile alFile) {
base = Arrays.copyOfRange(alFile.base, 1, alFile.base.length);
base2 = Arrays.copyOfRange(alFile.base2, 1, alFile.base2.length);
baseSquaresStr = alFile.baseSquares;
mapToPlusMinus = parseMapStringListBladeStr(alFile.lineMapZeroInfToPlusMinus);
mapToZeroInf = parseMapStringListBladeStr(alFile.lineMapPlusMinusToZeroInf);
}
/**
* Parses a map <string, LinkedList<BladeStr>>
* @param str The string to be parsed
* @return The parsed map
*/
private HashMap<String, LinkedList<BladeStr>> parseMapStringListBladeStr(String str) {
str = str.trim();
HashMap<String, LinkedList<BladeStr>> result = new HashMap<String, LinkedList<BladeStr>>();
if (str.isEmpty()) {
return result;
}
String[] parts = str.split(",");
for (String part : parts) {
String[] parts2 = part.split("=");
result.put(parts2[0], parseListBladeStr(parts2[1]));
}
return result;
}
/**
* Parses a list of bladeStr
* @param str The string to be parsed
* @return The parsed list of bladeStr
*/
private LinkedList<BladeStr> parseListBladeStr(String str) {
int index;
LinkedList<BladeStr> result = new LinkedList<BladeStr>();
while ((index = suchenextIndex(str)) != Integer.MAX_VALUE) {
result.add(parseBladeStr(str.substring(0, index)));
if (str.charAt(index) == '-') {
str = str.substring(index);
} else {
str = str.substring(index + 1);
}
}
if (!str.isEmpty()) {
result.add(parseBladeStr(str));
}
return result;
}
/**
* Returns the index from the next '+' or '-' character
* @param str The string to be parsed
* @return The index
*/
private int suchenextIndex(String str) {
int indexPlus = str.indexOf('+');
int indexMinus = str.indexOf('-', 1);
if (indexPlus == -1) {
indexPlus = Integer.MAX_VALUE;
}
if (indexMinus == -1) {
indexMinus = Integer.MAX_VALUE;
}
return Math.min(indexPlus, indexMinus);
}
/**
* Parses a bladeStr
* @param str The string to be parsed
* @return The parsed BladeStr
*/
private BladeStr parseBladeStr(String str) {
// Contains only Product, Blade or Constant!
if (str.contains("*")) {
return parseProduct(str);
} else if (str.contains("e")) {
return parseBlade(str);
} else {
return new BladeStr(Float.parseFloat(str.trim()), "0");
}
}
/**
* Parses a Blade
* @param str The string to be parsed
* @return The parsed Blade
*/
private BladeStr parseBlade(String str) {
boolean negated = false;
if (str.charAt(0) == '-') {
str = str.substring(1);
negated = true;
}
return new BladeStr((negated ? -1 : 1),new String[]{str});
}
/**
* Parses a Product
* @param str The string to be parsed
* @return The parsed Product
*/
private BladeStr parseProduct(String str) {
String[] parts = str.split("\\*");
if (parts[0].contains("e")) {
//parts[0]: Blade
//parts[1]: Constant
BladeStr result = parseBlade(parts[0]);
result.setPrefactor(result.getPrefactor()*Float.parseFloat(parts[1].trim()));
return result;
} else {
//parts[0]: Constant
//parts[1]: Blade
BladeStr result = parseBlade(parts[1]);
result.setPrefactor(result.getPrefactor()*Float.parseFloat(parts[0].trim()));
return result;
}
}
}