function StringMap() {
this.stringToIndex = new Map();
this.indexToString = [];
this.addString = function(str) {
// If this string is known, just return its index
var index = this.stringToIndex.get(str);
if (index !== undefined) {
return index;
}
// This is a new string. Add it to both maps.
index = this.indexToString.length;
this.indexToString.push(str);
this.stringToIndex.set(str, index);
return index;
};
this.getString = function(index) {
return this.indexToString[index];
};
this.addStrings = function(strArray) {
var indices = [];
for (var i=0; i<strArray.length; i++) {
var s = strArray[i];
var index = this.addString(s);
indices.push(index);
}
return indices;
};
this.getStrings = function(indices) {
var strArray = [];
for (var i=0; i<indices.length; i++) {
var index = indices[i];
var str = this.getString(index);
strArray.push(str);
}
return strArray;
};
};
window.stringMap = new StringMap();
// Adds an array of style strings to the dictionary.
// Returns an array of indices into the global string dictionary.
window.packStyles = function(styles) {
return window.stringMap.addStrings(styles);
};
// Gets an array of indices into the string dictionary pointing to style strings.
// Returns an array containing the original strings.
window.unpackStyles = function(styles) {
// Return identiy if styles is undefined or already unpacked
var isPacked = styles && (typeof styles[0] == "number");
if (!isPacked) {
return styles;
}
return window.stringMap.getStrings(styles);
};