Added BlockVector a la WorldEdit as requested by #246. This BlockVector is safe to be used as keys in hash sets and hash maps, but it is mutable and careful attention must be paid to not modify the vector post-insertion into a set or map.

This commit is contained in:
sk89q
2011-02-05 23:20:06 -08:00
parent 71fb1d2646
commit 8b9541be53
2 changed files with 116 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
package org.bukkit.util;
/**
* A vector with a hash function that floors the X, Y, Z components, a la
* BlockVector in WorldEdit. BlockVectors can be used in hash sets and
* hash maps. Be aware that BlockVectors are mutable, but it is important
* that BlockVectors are never changed once put into a hash set or hash map.
*
* @author sk89q
*/
public class BlockVector extends Vector {
/**
* Construct the vector with all components as 0.
*/
public BlockVector() {
this.x = 0;
this.y = 0;
this.z = 0;
}
/**
* Construct the vector with another vector.
*/
public BlockVector(Vector vec) {
this.x = vec.getX();
this.y = vec.getY();
this.z = vec.getZ();
}
/**
* Construct the vector with provided integer components.
*
* @param x
* @param y
* @param z
*/
public BlockVector(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
/**
* Construct the vector with provided double components.
*
* @param x
* @param y
* @param z
*/
public BlockVector(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
/**
* Construct the vector with provided float components.
*
* @param x
* @param y
* @param z
*/
public BlockVector(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
}
/**
* Checks if another object is equivalent.
*
* @param obj
* @return whether the other object is equivalent
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof BlockVector)) {
return false;
}
BlockVector other = (BlockVector)obj;
return (int)other.getX() == (int)this.x && (int)other.getY() == (int)this.y
&& (int)other.getZ() == (int)this.z;
}
/**
* Returns a hash code for this vector.
*
* @return hash code
*/
@Override
public int hashCode() {
return (Integer.valueOf((int)x).hashCode() >> 13) ^
(Integer.valueOf((int)y).hashCode() >> 7) ^
Integer.valueOf((int)z).hashCode();
}
/**
* Get a new block vector.
*
* @return vector
*/
@Override
public BlockVector clone() {
return new BlockVector(x, y, z);
}
}