/* * Copyright (C)2005-2012 Haxe Foundation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ package python.internal; import python.lib.Functools; import python.lib.Builtin; @:allow(Array) @:keep class ArrayImpl { public static inline function get_length (x:Array):Int return Builtin.len(x); public static inline function concat(a1:Array, a2 : Array) : Array { return Syntax.binop(a1, "+", a2); } public static inline function copy(x:Array) : Array { return Builtin.list(x); } public static inline function iterator(x:Array) : Iterator { return new HaxeIterator(Syntax.callField(x, "__iter__")); } public static function indexOf(a:Array, x : T, ?fromIndex:Int) : Int { var len = a.length; var l = if (fromIndex == null) 0 else if (fromIndex < 0) len + fromIndex else fromIndex; if (l < 0) l = 0; for (i in l...len) { if (unsafeGet(a,i) == x) return i; } return -1; } public static function lastIndexOf(a:Array, x : T, ?fromIndex:Int) : Int { var len = a.length; var l = if (fromIndex == null) len else if (fromIndex < 0) len + fromIndex + 1 else fromIndex+1; if (l > len) l = len; while (--l > -1) { if (unsafeGet(a,l) == x) return l; } return -1; } @:access(python.Boot) public static inline function join(x:Array, sep : String ) : String { return Boot.arrayJoin(x, sep); } public static inline function toString(x:Array) : String { return "[" + join(x, ",") + "]"; } public static inline function pop(x:Array) : Null { return if (x.length == 0) null else Syntax.callField(x, "pop"); } public static inline function push(x:Array, e:T) : Int { Syntax.callField(x, "append", e); return get_length(x); } public static inline function unshift(x:Array,e : T) : Void { x.insert(0,e); } public static function remove(x:Array,e : T) : Bool { try { Syntax.callField(x, "remove", e); return true; } catch (e:Dynamic) { return false; } } public static inline function shift(x:Array) : Null { if (x.length == 0) return null; return Syntax.callField(x, "pop", 0); } public static inline function slice(x:Array, pos : Int, ?end : Int ) : Array { return Syntax.arrayAccess(x, pos, end); } public static inline function sort(x:Array, f:T->T->Int) : Void { Syntax.callNamedUntyped(Syntax.field(x, "sort"), { key : Functools.cmp_to_key(f) }); } public static inline function splice(x:Array, pos : Int, len : Int ) : Array { if (pos < 0) pos = x.length+pos; if (pos < 0) pos = 0; var res = Syntax.arrayAccess(x, pos, pos+len); Syntax.delete((Syntax.arrayAccess(x, pos, pos+len))); return res; } public static inline function map(x:Array, f : T -> S) : Array { return Builtin.list(Builtin.map(f, cast x)); } public static inline function filter(x:Array, f : T -> Bool) : Array { return Builtin.list(Builtin.filter(f, cast x)); } public static inline function insert(a:Array, pos : Int, x : T ) : Void { Syntax.callField(a, "insert", pos, x); } public static inline function reverse(a:Array) : Void { Syntax.callField(a, "reverse"); } private static inline function _get(x:Array, idx:Int):T { return if (idx > -1 && idx < x.length) unsafeGet(x, idx) else null; } private static inline function _set(x:Array, idx:Int, v:T):T { var l = x.length; while (l < idx) { x.push(null); l+=1; } if (l == idx) { x.push(v); } else { Syntax.assign(Syntax.arrayAccess(x, idx), v); } return v; } public static inline function unsafeGet(x:Array,idx:Int):T { return Syntax.arrayAccess(x, idx); } public static inline function unsafeSet(x:Array,idx:Int, val:T):T { Syntax.assign(Syntax.arrayAccess(x, idx), val); return val; } }