diff --git a/src/as/com/threerings/io/TypedArray.as b/src/as/com/threerings/io/TypedArray.as index e64636c0e..3f5721ca3 100644 --- a/src/as/com/threerings/io/TypedArray.as +++ b/src/as/com/threerings/io/TypedArray.as @@ -27,6 +27,15 @@ public dynamic class TypedArray extends Array return "[L" + cname + ";"; } + /** + * A factory method to create a TypedArray for holding objects + * of the specified type. + */ + public static function create (of :Class) :TypedArray + { + return new TypedArray(getJavaType(of)); + } + public function getJavaType () :String { return _jtype; diff --git a/src/as/com/threerings/util/ArrayUtil.as b/src/as/com/threerings/util/ArrayUtil.as index f7e84e2aa..8dd50dc0f 100644 --- a/src/as/com/threerings/util/ArrayUtil.as +++ b/src/as/com/threerings/util/ArrayUtil.as @@ -38,7 +38,7 @@ public class ArrayUtil arr :Array, element :Object, firstOnly :Boolean) :void { for (var ii :int = 0; ii < arr.length; ii++) { - if (arr[ii] === element) { + if (Util.equals(arr[ii], element)) { arr.splice(ii--, 1); if (firstOnly) { return; diff --git a/src/as/com/threerings/util/ClassUtil.as b/src/as/com/threerings/util/ClassUtil.as index e17e820db..43b903588 100644 --- a/src/as/com/threerings/util/ClassUtil.as +++ b/src/as/com/threerings/util/ClassUtil.as @@ -21,6 +21,16 @@ public class ClassUtil return s.replace("::", "."); } + /** + * Return a new instance that is the same class as the specified + * object. The class must have a zero-arg constructor. + */ + public static function newInstance (obj :Object) :Object + { + var clazz :Class = getClass(obj); + return new clazz(); + } + public static function getClass (obj :Object) :Class { return getClassByName(getClassName(obj)); diff --git a/src/as/com/threerings/util/Map.as b/src/as/com/threerings/util/Map.as index fe954ba5e..3d24f2e90 100644 --- a/src/as/com/threerings/util/Map.as +++ b/src/as/com/threerings/util/Map.as @@ -22,7 +22,7 @@ public interface Map function get (key :Object) :*; /** - * Call the specified function, which accepts to args: key and value, + * Call the specified function, which accepts two args: key and value, * for every mapping. */ function forEach (fn :Function) :void; diff --git a/src/as/com/threerings/util/Util.as b/src/as/com/threerings/util/Util.as index 4f879bc2f..abdb184fe 100644 --- a/src/as/com/threerings/util/Util.as +++ b/src/as/com/threerings/util/Util.as @@ -25,6 +25,17 @@ public class Util return buf.toString(); } + /** + * A nicer test for equals that works if the objects implement Equalable + */ + public static function equals (obj1 :Object, obj2 :Object) :Boolean + { + // catch various common cases (both primitive or null) + return (obj1 === obj2) || + // otherwise, they're only possibly still equal if Equalable + ((obj1 is Equalable) && (obj1 as Equalable).equals(obj2)); + } + public static function cast (obj :Object, clazz :Class) :Object { if (obj == null || obj is clazz) {