package squidpony.squidgrid;
import squidpony.squidmath.Arrangement;
import squidpony.squidmath.CrossHash;
import java.util.ArrayList;
/**
* Customized storage of multiple types of 2D data, accessible by String (or CharSequence) keys.
* Meant for cases where SquidLib needs to produce a grid with multiple types of data, such as what could be represented
* by a 2D array of objects containing only char, int, double, and/or float data, but this is much more memory-efficient
* than producing many objects. This can be seen as a "struct-of-array" approach, to use C terminology, rather than an
* "array-of-struct" approach. This also allows new 2D arrays to be added to an existing GridData if needed.
*/
public class GridData {
public Arrangement<CharSequence> names;
public ArrayList<char[][]> charMaps;
public ArrayList<int[][]> intMaps;
public ArrayList<double[][]> doubleMaps;
public ArrayList<float[][]> floatMaps;
public GridData()
{
this(16);
}
public GridData(int expectedSize)
{
names = new Arrangement<>(expectedSize, CrossHash.stringHasher);
charMaps = new ArrayList<>(expectedSize);
intMaps = new ArrayList<>(expectedSize);
doubleMaps = new ArrayList<>(expectedSize);
floatMaps = new ArrayList<>(expectedSize);
}
public boolean contains(CharSequence item)
{
return names.containsKey(item);
}
public int indexOf(CharSequence item)
{
return names.getInt(item);
}
public char[][] getChars(CharSequence item)
{
int i = names.getInt(item);
char[][] d = null;
if(i >= 0 && i < charMaps.size())
{
d = charMaps.get(i);
}
return d;
}
public char[][] getChars(int index)
{
char[][] d = null;
if(index >= 0 && index < charMaps.size())
{
d = charMaps.get(index);
}
return d;
}
public int[][] getInts(CharSequence item)
{
int i = names.getInt(item);
int[][] d = null;
if(i >= 0 && i < intMaps.size())
{
d = intMaps.get(i);
}
return d;
}
public int[][] getInts(int index)
{
int[][] d = null;
if(index >= 0 && index < intMaps.size())
{
d = intMaps.get(index);
}
return d;
}
public double[][] getDoubles(CharSequence item)
{
int i = names.getInt(item);
double[][] d = null;
if(i >= 0 && i < charMaps.size())
{
d = doubleMaps.get(i);
}
return d;
}
public double[][] getDoubles(int index)
{
double[][] d = null;
if(index >= 0 && index < doubleMaps.size())
{
d = doubleMaps.get(index);
}
return d;
}
public float[][] getFloats(CharSequence item)
{
int i = names.getInt(item);
float[][] d = null;
if(i >= 0 && i < floatMaps.size())
{
d = floatMaps.get(i);
}
return d;
}
public float[][] getFloats(int index)
{
float[][] d = null;
if(index >= 0 && index < floatMaps.size())
{
d = floatMaps.get(index);
}
return d;
}
public int putChars(CharSequence name, char[][] item)
{
int i = names.getInt(name);
if(i < 0) {
i = names.size();
names.add(name);
charMaps.add(item);
intMaps.add(null);
doubleMaps.add(null);
floatMaps.add(null);
}
else
{
charMaps.set(i, item);
intMaps.set(i, null);
doubleMaps.set(i, null);
floatMaps.set(i, null);
}
return i;
}
public int putInts(CharSequence name, int[][] item)
{
int i = names.getInt(name);
if(i < 0) {
i = names.size();
names.add(name);
charMaps.add(null);
intMaps.add(item);
doubleMaps.add(null);
floatMaps.add(null);
}
else
{
charMaps.set(i, null);
intMaps.set(i, item);
doubleMaps.set(i, null);
floatMaps.set(i, null);
}
return i;
}
public int putDoubles(CharSequence name, double[][] item)
{
int i = names.getInt(name);
if(i < 0) {
i = names.size();
names.add(name);
charMaps.add(null);
intMaps.add(null);
doubleMaps.add(item);
floatMaps.add(null);
}
else
{
charMaps.set(i, null);
intMaps.set(i, null);
doubleMaps.set(i, item);
floatMaps.set(i, null);
}
return i;
}
public int putFloats(CharSequence name, float[][] item)
{
int i = names.getInt(name);
if(i < 0) {
i = names.size();
names.add(name);
charMaps.add(null);
intMaps.add(null);
doubleMaps.add(null);
floatMaps.add(item);
}
else
{
charMaps.set(i, null);
intMaps.set(i, null);
doubleMaps.set(i, null);
floatMaps.set(i, item);
}
return i;
}
}