SymbolTable constructor
Implementation
SymbolTable({
String? symbolsString,
List<String>? symbolsArray,
Map<String, int>? symbolsMap,
}) {
// Condition the input `symbolsArr`
if (symbolsArray != null) {
num2sym = symbolsArray;
} else {
if (symbolsString != null && symbolsString.isNotEmpty) {
num2sym = symbolsString.split('');
} else {
throw Exception('symbolsArr and symbolsStr must not be null or empty');
}
}
// Condition the second input, `symbolsMap`. If no symbolsMap passed in,
// make it by inverting symbolsArr. If it's an object (and not a Map),
// convert its own-properties to a Map.
if (symbolsMap != null) {
sym2num = symbolsMap;
} else {
sym2num = HashMap();
// for (var i = 0; i < num2sym.length; i++) {
// sym2num.putIfAbsent(num2sym[i], () => i);
// }
sym2num = HashMap.fromIterable(num2sym,
key: (element) => element as String,
value: (element) => num2sym.indexOf(element as String));
}
// `symbolsMap`
var symbolsValuesSet = Set.of(sym2num.values);
for (var i = 0; i < num2sym.length; i++) {
if (!symbolsValuesSet.contains(i)) {
throw Exception(
'${num2sym.length} symbols given but $i not found in symbol table');
}
}
maxBase = num2sym.length;
_isPrefixCode = isPrefixCode(num2sym);
}