package squidpony.squidgrid.zone; import squidpony.squidgrid.zone.Zone.Skeleton; import squidpony.squidmath.Coord; import squidpony.squidmath.CoordPacker; import squidpony.squidmath.CrossHash; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * A zone constructed by {@link CoordPacker}. * * @author smelC */ public class CoordPackerZone extends Skeleton implements ImmutableZone { protected final short[] shorts; protected transient List<Coord> unpacked; private static final long serialVersionUID = -3718415979846804238L; public CoordPackerZone(short[] shorts) { this.shorts = shorts; } @Override public boolean isEmpty() { return CoordPacker.isEmpty(shorts); } @Override public int size() { return CoordPacker.count(shorts); } @Override public boolean contains(int x, int y) { return CoordPacker.regionsContain(shorts, CoordPacker.packOne(x, y)); } @Override public boolean contains(Coord c) { return CoordPacker.regionsContain(shorts, CoordPacker.packOne(c)); } @Override public List<Coord> getAll() { if (unpacked == null) { final Coord[] allPacked = CoordPacker.allPacked(shorts); unpacked = new ArrayList<Coord>(allPacked.length); Collections.addAll(unpacked, allPacked); } return unpacked; } @Override public CoordPackerZone expand(int distance) { return new CoordPackerZone(CoordPacker.expand(shorts, distance, 256, 256)); } @Override public CoordPackerZone expand8way(int distance) { return new CoordPackerZone(CoordPacker.expand(shorts, distance, 256, 256, true)); } @Override public String toString() { return (unpacked == null ? shorts : unpacked).toString(); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CoordPackerZone that = (CoordPackerZone) o; return Arrays.equals(shorts, that.shorts); } @Override public int hashCode() { return CrossHash.Falcon.hash(shorts); } }