Browse Source

added Std.instance

Nicolas Cannasse 12 years ago
parent
commit
6a5da6a097
7 changed files with 40 additions and 2 deletions
  1. 7 0
      std/Std.hx
  2. 4 0
      std/flash/_std/Std.hx
  3. 4 0
      std/flash8/_std/Std.hx
  4. 4 0
      std/js/_std/Std.hx
  5. 4 0
      std/neko/_std/Std.hx
  6. 4 0
      std/php/_std/Std.hx
  7. 13 2
      tests/unit/unitstd/Std.unit.hx

+ 7 - 0
std/Std.hx

@@ -32,6 +32,13 @@ extern class Std {
 		Tells if a value v is of the type t. Returns false if v or t are null.
 	**/
 	public static function is( v : Dynamic, t : Dynamic ) : Bool;
+	
+	/**
+		Check if an object is an instance of the given class, then cast it.
+		Returns null if the object is not an instance of the class.
+		Is not guaranteed to work with interfaces or core types such as String, Array and Date.
+	**/
+	public static function instance<T>( v : {}, c : Class<T> ) : T;
 
 	/**
 		Converts any value to a String.

+ 4 - 0
std/flash/_std/Std.hx

@@ -27,6 +27,10 @@ import flash.Boot;
 		return untyped flash.Boot.__instanceof(v,t);
 	}
 
+	public inline static function instance<T>( v : { }, c : Class<T> ) : T {
+		return flash.Lib.as(v, c);
+	}
+
 	public static function string( s : Dynamic ) : String {
 		return untyped flash.Boot.__string_rec(s,"");
 	}

+ 4 - 0
std/flash8/_std/Std.hx

@@ -26,6 +26,10 @@
 		return untyped flash.Boot.__instanceof(v,t);
 	}
 
+	public static function instance<T>( v : { }, c : Class<T> ) : T {
+		return Std.is(v, c) ? cast v : null;
+	}
+	
 	public static function string( s : Dynamic ) : String {
 		return untyped flash.Boot.__string_rec(s,"");
 	}

+ 4 - 0
std/js/_std/Std.hx

@@ -27,6 +27,10 @@ import js.Boot;
 	public static inline function is( v : Dynamic, t : Dynamic ) : Bool {
 		return untyped js.Boot.__instanceof(v,t);
 	}
+	
+	public static inline function instance<T>( v : { }, c : Class<T> ) : T {
+		return untyped __instanceof__(v, c) ? cast v : null;
+	}
 
 	public static function string( s : Dynamic ) : String {
 		return untyped js.Boot.__string_rec(s,"");

+ 4 - 0
std/neko/_std/Std.hx

@@ -25,6 +25,10 @@
 	public static function is( v : Dynamic, t : Dynamic ) : Bool {
 		return untyped neko.Boot.__instanceof(v,t);
 	}
+	
+	public static function instance<T>( v : { }, c : Class<T> ) : T {
+		return Std.is(v, c) ? cast v : null;
+	}
 
 	public static function string( s : Dynamic ) : String {
 		return new String(untyped __dollar__string(s));

+ 4 - 0
std/php/_std/Std.hx

@@ -24,6 +24,10 @@
 	public static function is( v : Dynamic, t : Dynamic ) : Bool {
 		return untyped untyped __call__("_hx_instanceof", v,t);
 	}
+	
+	public static function instance<T>( v : { }, c : Class<T> ) : T {
+		return Std.is(v, c) ? cast v : null;
+	}
 
 	public static function string( s : Dynamic ) : String {
 		return untyped __call__("_hx_string_rec", s, '');

+ 13 - 2
tests/unit/unitstd/Std.unit.hx

@@ -6,7 +6,18 @@ var unknown = null;
 Std.is(unknown, String) == false;
 Std.is(null, String) == false;
 Std.is("foo", null) == false;
-	
+
+// instance
+#if !js
+Std.instance("", String) == "";
+#end
+var a = [];
+Std.instance(a, Array) == a;
+Std.instance("", Array) == null;
+Std.instance([], String) == null;
+Std.instance(new MyClass.MyChild1(), MyClass.MyParent) != null;
+Std.instance(new MyClass.MyChild1(), MyClass) == null;
+
 // string
 var cwts = new ClassWithToString();
 var cwtsc = new ClassWithToStringChild();
@@ -47,7 +58,7 @@ Std.parseInt(null) == null;
 Std.parseInt("0xFF") == 255;
 Std.parseInt("0x123") == 291;
 Std.parseInt("0XFF") == 255;
-Std.parseInt("0X123") == 291;	
+Std.parseInt("0X123") == 291;
 Std.parseInt("0X01") == 1;
 Std.parseInt("0x01") == 1;