Browse Source

[cpp] Add an abstract to allow casting of VirtualArray

Hugh 9 năm trước cách đây
mục cha
commit
7b4ae1a00b
1 tập tin đã thay đổi với 68 bổ sung22 xóa
  1. 68 22
      std/cpp/VirtualArray.hx

+ 68 - 22
std/cpp/VirtualArray.hx

@@ -1,30 +1,76 @@
 package cpp;
 
-extern class VirtualArray
+@:native("cpp::VirtualArray")
+@:coreType extern class NativeVirtualArray implements ArrayAccess<Dynamic>
 {
-   function new() : Void;
-   var length(get,null) : Int;
+   public function new() : Void;
+   public var length(get,null) : Int;
    // concat<T>( a:Array<T> ) : Array<T> ?
-   function concat( a : VirtualArray ) : VirtualArray;
-   function join( sep : String ) : String;
-   function pop() : Dynamic;
-   function push(x : Dynamic) : Int;
-   function reverse() : Void;
-   function shift() : Dynamic;
-   function slice( pos : Int, ?end : Int ) : VirtualArray;
-   function sort( f : Dynamic -> Dynamic -> Int ) : Void;
-   function splice( pos : Int, len : Int ) : VirtualArray;
-   function toString() : String;
-   function unshift( x : Dynamic ) : Void;
-   function insert( pos : Int, x : Dynamic ) : Void;
-   function remove( x : Dynamic ) : Bool;
-   function indexOf( x : Dynamic, ?fromIndex:Int ) : Int;
-   function lastIndexOf( x : Dynamic, ?fromIndex:Int ) : Int;
-   function copy() : VirtualArray;
-   function iterator() : Iterator<Dynamic>;
-   function map<S>( f : Dynamic -> S ) : VirtualArray;
-   function filter( f : Dynamic -> Bool ) : VirtualArray;
+   public function concat( a : VirtualArray ) : VirtualArray;
+   public function join( sep : String ) : String;
+   public function pop() : Dynamic;
+   public function push(x : Dynamic) : Int;
+   public function reverse() : Void;
+   public function shift() : Dynamic;
+   public function slice( pos : Int, ?end : Int ) : VirtualArray;
+   public function sort( f : Dynamic -> Dynamic -> Int ) : Void;
+   public function splice( pos : Int, len : Int ) : VirtualArray;
+   public function toString() : String;
+   public function unshift( x : Dynamic ) : Void;
+   public function insert( pos : Int, x : Dynamic ) : Void;
+   public function remove( x : Dynamic ) : Bool;
+   public function indexOf( x : Dynamic, ?fromIndex:Int ) : Int;
+   public function lastIndexOf( x : Dynamic, ?fromIndex:Int ) : Int;
+   public function copy() : VirtualArray;
+   public function iterator() : Iterator<Dynamic>;
+   public function map<S>( f : Dynamic -> S ) : VirtualArray;
+   public function filter( f : Dynamic -> Bool ) : VirtualArray;
 }
 
 
+abstract VirtualArray(NativeVirtualArray)
+{
+   // Add these two functions...
+   @:from @:extern inline static public function fromArray<T>(a:Array<T>) : VirtualArray
+      return untyped a;
+   @:to @:extern inline public function toArray<T>() : Array<T>
+      return untyped this;
+
+
+
+
+   // The rest is just boiler-plate
+   inline public function new() this=new NativeVirtualArray();
+
+   @:extern @:arrayAccess inline function get(idx:Int) : Dynamic
+      return untyped this[idx];
+
+   @:extern @:arrayAccess inline function set<T>(pos:Int, value:T ) : T
+      return untyped this[idx] = value;
+
+   public var length(get,never) : Int;
+   @:extern inline public function get_length() : Int return this.length;
+
+
+
+   // concat<T>( a:Array<T> ) : Array<T> ?
+   @:extern inline public function concat( a : VirtualArray ) : VirtualArray return this.concat(a);
+   @:extern inline public function join( sep : String ) : String return this.join(sep);
+   @:extern inline public function pop() : Dynamic return this.pop();
+   @:extern inline public function push(x : Dynamic) : Int return this.push(x);
+   @:extern inline public function reverse() : Void this.reverse();
+   @:extern inline public function shift() : Dynamic return this.shift();
+   @:extern inline public function slice( pos : Int, ?end : Int ) : VirtualArray return this.slice(pos,end);
+   @:extern inline public function sort( f : Dynamic -> Dynamic -> Int ) : Void this.sort(f);
+   @:extern inline public function splice( pos : Int, len : Int ) : VirtualArray return this.slice(pos,len);
+   @:extern inline public function unshift( x : Dynamic ) : Void this.unshift(x);
+   @:extern inline public function insert( pos : Int, x : Dynamic ) : Void this.insert(pos,x);
+   @:extern inline public function remove( x : Dynamic ) : Bool return this.remove(x);
+   @:extern inline public function indexOf( x : Dynamic, ?fromIndex:Int ) : Int return this.indexOf(x,fromIndex);
+   @:extern inline public function lastIndexOf( x : Dynamic, ?fromIndex:Int ) : Int return this.lastIndexOf(x,fromIndex);
+   @:extern inline public function copy() : VirtualArray return this.copy();
+   @:extern inline public function iterator() : Iterator<Dynamic> return this.iterator();
+   @:extern inline public function map<S>( f : Dynamic -> S ) : VirtualArray return this.map(f);
+   @:extern inline public function filter( f : Dynamic -> Bool ) : VirtualArray return this.filter(f);
+}