forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
182
Kha/Tools/linux_x64/std/jvm/_std/EReg.hx
Normal file
182
Kha/Tools/linux_x64/std/jvm/_std/EReg.hx
Normal file
@ -0,0 +1,182 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 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.
|
||||
*/
|
||||
|
||||
import java.util.regex.*;
|
||||
import jvm.CompiledPattern;
|
||||
|
||||
using StringTools;
|
||||
|
||||
@:coreApi class EReg {
|
||||
private var matcher:Matcher;
|
||||
private var cur:String;
|
||||
private var isGlobal:Bool;
|
||||
|
||||
@:overload
|
||||
public function new(r:String, opt:String) {
|
||||
initialize(compilePattern(r, opt));
|
||||
}
|
||||
|
||||
@:overload
|
||||
function new(compiledPattern:CompiledPattern) {
|
||||
initialize(compiledPattern);
|
||||
}
|
||||
|
||||
function initialize(compiledPattern:CompiledPattern):Void {
|
||||
matcher = compiledPattern.pattern.matcher("");
|
||||
isGlobal = compiledPattern.isGlobal;
|
||||
}
|
||||
|
||||
public function match(s:String):Bool {
|
||||
cur = s;
|
||||
matcher = matcher.reset(s);
|
||||
return matcher.find();
|
||||
}
|
||||
|
||||
public function matched(n:Int):String {
|
||||
if (n == 0)
|
||||
return matcher.group();
|
||||
else
|
||||
return matcher.group(n);
|
||||
}
|
||||
|
||||
public function matchedLeft():String {
|
||||
return untyped cur.substring(0, matcher.start());
|
||||
}
|
||||
|
||||
public function matchedRight():String {
|
||||
return untyped cur.substring(matcher.end(), cur.length);
|
||||
}
|
||||
|
||||
public function matchedPos():{pos:Int, len:Int} {
|
||||
var start = matcher.start();
|
||||
return {pos: start, len: matcher.end() - start};
|
||||
}
|
||||
|
||||
public function matchSub(s:String, pos:Int, len:Int = -1):Bool {
|
||||
matcher = matcher.reset(len < 0 ? s : s.substr(0, pos + len));
|
||||
cur = s;
|
||||
return matcher.find(pos);
|
||||
}
|
||||
|
||||
public function split(s:String):Array<String> {
|
||||
if (isGlobal) {
|
||||
var ret = [];
|
||||
matcher.reset(s);
|
||||
matcher = matcher.useAnchoringBounds(false).useTransparentBounds(true);
|
||||
var copyOffset = 0;
|
||||
while (true) {
|
||||
if (!matcher.find()) {
|
||||
ret.push(s.substring(copyOffset, s.length));
|
||||
break;
|
||||
}
|
||||
ret.push(s.substring(copyOffset, matcher.start()));
|
||||
var nextStart = matcher.end();
|
||||
copyOffset = nextStart;
|
||||
if (nextStart == matcher.regionStart()) {
|
||||
nextStart++; // zero-length match - shift region one forward
|
||||
}
|
||||
if (nextStart >= s.length) {
|
||||
ret.push("");
|
||||
break;
|
||||
}
|
||||
matcher.region(nextStart, s.length);
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
var m = matcher;
|
||||
m.reset(s);
|
||||
if (m.find()) {
|
||||
return untyped [s.substring(0, m.start()), s.substring(m.end(), s.length)];
|
||||
} else {
|
||||
return [s];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline function start(group:Int):Int {
|
||||
return matcher.start(group);
|
||||
}
|
||||
|
||||
inline function len(group:Int):Int {
|
||||
return matcher.end(group) - matcher.start(group);
|
||||
}
|
||||
|
||||
public function replace(s:String, by:String):String {
|
||||
matcher.reset(s);
|
||||
by = by.replace("\\", "\\\\").replace("$$", "\\$");
|
||||
return isGlobal ? matcher.replaceAll(by) : matcher.replaceFirst(by);
|
||||
}
|
||||
|
||||
public function map(s:String, f:EReg->String):String {
|
||||
var offset = 0;
|
||||
var buf = new StringBuf();
|
||||
do {
|
||||
if (offset >= s.length)
|
||||
break;
|
||||
else if (!matchSub(s, offset)) {
|
||||
buf.add(s.substr(offset));
|
||||
break;
|
||||
}
|
||||
var p = matchedPos();
|
||||
buf.add(s.substr(offset, p.pos - offset));
|
||||
buf.add(f(this));
|
||||
if (p.len == 0) {
|
||||
buf.add(s.substr(p.pos, 1));
|
||||
offset = p.pos + 1;
|
||||
} else
|
||||
offset = p.pos + p.len;
|
||||
} while (isGlobal);
|
||||
if (!isGlobal && offset > 0 && offset < s.length)
|
||||
buf.add(s.substr(offset));
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public static inline function escape(s:String):String {
|
||||
return Pattern.quote(s);
|
||||
}
|
||||
|
||||
static function compilePattern(r:String, opt:String):CompiledPattern {
|
||||
var flags = 0;
|
||||
var isGlobal = false;
|
||||
for (i in 0...opt.length) {
|
||||
switch (StringTools.fastCodeAt(opt, i)) {
|
||||
case 'i'.code:
|
||||
flags |= Pattern.CASE_INSENSITIVE;
|
||||
case 'm'.code:
|
||||
flags |= Pattern.MULTILINE;
|
||||
case 's'.code:
|
||||
flags |= Pattern.DOTALL;
|
||||
case 'g'.code:
|
||||
isGlobal = true;
|
||||
}
|
||||
}
|
||||
|
||||
flags |= Pattern.UNICODE_CASE;
|
||||
#if !android // see https://github.com/HaxeFoundation/haxe/issues/7632
|
||||
flags |= Pattern.UNICODE_CHARACTER_CLASS;
|
||||
#end
|
||||
return {
|
||||
pattern: Pattern.compile(r, flags),
|
||||
isGlobal: isGlobal
|
||||
}
|
||||
}
|
||||
}
|
208
Kha/Tools/linux_x64/std/jvm/_std/Reflect.hx
Normal file
208
Kha/Tools/linux_x64/std/jvm/_std/Reflect.hx
Normal file
@ -0,0 +1,208 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 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.
|
||||
*/
|
||||
|
||||
import jvm.Jvm;
|
||||
|
||||
import java.lang.Number;
|
||||
import java.lang.Long.LongClass;
|
||||
import java.lang.Double.DoubleClass;
|
||||
import java.lang.Float.FloatClass;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
|
||||
using jvm.NativeTools.NativeClassTools;
|
||||
|
||||
@:coreApi
|
||||
class Reflect {
|
||||
public static function hasField(o:Dynamic, field:String):Bool {
|
||||
if (!Jvm.instanceof(o, jvm.DynamicObject)) {
|
||||
var c:java.lang.Class<Dynamic> = Jvm.instanceof(o, java.lang.Class) ? cast o : (cast o : java.lang.Object).getClass();
|
||||
try {
|
||||
c.getField(field);
|
||||
return true;
|
||||
} catch (e:Dynamic) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return (cast o : jvm.DynamicObject)._hx_hasField(field);
|
||||
}
|
||||
|
||||
public static function field(o:Dynamic, field:String):Dynamic {
|
||||
if (o == null) {
|
||||
return null;
|
||||
}
|
||||
return Jvm.readField(o, field);
|
||||
}
|
||||
|
||||
public static function setField(o:Dynamic, field:String, value:Dynamic):Void {
|
||||
Jvm.writeField(o, field, value);
|
||||
}
|
||||
|
||||
public static function getProperty(o:Dynamic, field:String):Dynamic {
|
||||
var f = Reflect.field(o, "get_" + field);
|
||||
if (f != null) {
|
||||
return f();
|
||||
}
|
||||
return Reflect.field(o, field);
|
||||
}
|
||||
|
||||
public static function setProperty(o:Dynamic, field:String, value:Dynamic):Void {
|
||||
var f = Reflect.field(o, "set_" + field);
|
||||
if (f != null) {
|
||||
f(value);
|
||||
return;
|
||||
}
|
||||
Reflect.setField(o, field, value);
|
||||
}
|
||||
|
||||
public static function callMethod(o:Dynamic, func:haxe.Constraints.Function, args:Array<Dynamic>):Dynamic {
|
||||
return Jvm.call(cast func, @:privateAccess args.getNative());
|
||||
}
|
||||
|
||||
public static function fields(o:Dynamic):Array<String> {
|
||||
if (!Jvm.instanceof(o, jvm.DynamicObject)) {
|
||||
if (Jvm.instanceof(o, java.lang.Class)) {
|
||||
return Type.getClassFields(o);
|
||||
}
|
||||
var c = (o : java.lang.Object).getClass();
|
||||
var ret = [];
|
||||
for (f in c.getDeclaredFields()) {
|
||||
if (java.lang.reflect.Modifier.isStatic(f.getModifiers()) == false && !f.isSynthetic()) {
|
||||
ret.push(f.getName());
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
return (cast o : jvm.DynamicObject)._hx_getFields();
|
||||
}
|
||||
|
||||
public static function isFunction(f:Dynamic):Bool {
|
||||
return Jvm.instanceof(f, jvm.Function);
|
||||
}
|
||||
|
||||
public static function compare<T>(a:T, b:T):Int {
|
||||
if (Jvm.referenceEquals(a, b)) {
|
||||
return 0;
|
||||
}
|
||||
if (a == null) {
|
||||
return -1;
|
||||
}
|
||||
if (b == null) {
|
||||
return 1;
|
||||
}
|
||||
if (Jvm.instanceof(a, Number) && Jvm.instanceof(b, Number)) {
|
||||
var a = (cast a:Number);
|
||||
var b = (cast b:Number);
|
||||
inline function isBig(v:Number)
|
||||
return Jvm.instanceof(v, BigDecimal) || Jvm.instanceof(v, BigInteger);
|
||||
inline function cmpLongTo(long:Number, another:Number) {
|
||||
if(Jvm.instanceof(another, DoubleClass)) {
|
||||
return new BigDecimal(long.longValue()).compareTo(new BigDecimal(another.doubleValue()));
|
||||
} else if(Jvm.instanceof(another, FloatClass)) {
|
||||
return new BigDecimal(long.longValue()).compareTo(new BigDecimal(another.floatValue()));
|
||||
} else {
|
||||
return LongClass.compare(long.longValue(), another.longValue());
|
||||
}
|
||||
}
|
||||
if(isBig(a) || isBig(b))
|
||||
return new BigDecimal((cast a:java.lang.Object).toString()).compareTo((cast a:java.lang.Object).toString());
|
||||
if(Jvm.instanceof(a, LongClass))
|
||||
return cmpLongTo(a, b);
|
||||
if(Jvm.instanceof(b, LongClass))
|
||||
return -1 * cmpLongTo(b, a);
|
||||
return DoubleClass.compare(a.doubleValue(), b.doubleValue());
|
||||
}
|
||||
if (Jvm.instanceof(a, java.NativeString)) {
|
||||
if (!Jvm.instanceof(b, java.NativeString)) {
|
||||
return -1;
|
||||
}
|
||||
return (cast a : java.NativeString).compareTo(cast b);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static function compareMethods(f1:Dynamic, f2:Dynamic):Bool {
|
||||
if (f1 == f2) {
|
||||
return true;
|
||||
}
|
||||
if (f1 == null || f2 == null) {
|
||||
return false;
|
||||
}
|
||||
var c1 = (f1 : java.lang.Object).getClass();
|
||||
if (c1 != (f2 : java.lang.Object).getClass()) {
|
||||
return false;
|
||||
}
|
||||
if (Std.isOfType(f1, jvm.Function)) {
|
||||
if (!Std.isOfType(f2, jvm.Function)) {
|
||||
return false;
|
||||
}
|
||||
return (f1 : jvm.Function).equals(f2);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function isObject(v:Dynamic):Bool {
|
||||
if (v == null) {
|
||||
return false;
|
||||
}
|
||||
if (Jvm.instanceof(v, jvm.Enum)) {
|
||||
return false;
|
||||
}
|
||||
if (Jvm.instanceof(v, java.lang.Number)) {
|
||||
return false;
|
||||
}
|
||||
if (Jvm.instanceof(v, java.lang.Boolean.BooleanClass)) {
|
||||
return false;
|
||||
}
|
||||
if (Jvm.instanceof(v, jvm.Function)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function isEnumValue(v:Dynamic):Bool {
|
||||
if (v == null) {
|
||||
return false;
|
||||
}
|
||||
return @:privateAccess Type.isEnumValueClass((cast v : java.lang.Object).getClass());
|
||||
}
|
||||
|
||||
public static function deleteField(o:Dynamic, field:String):Bool {
|
||||
if (!Jvm.instanceof(o, jvm.DynamicObject)) {
|
||||
return false;
|
||||
}
|
||||
return (cast o : jvm.DynamicObject)._hx_deleteField(field);
|
||||
}
|
||||
|
||||
public static function copy<T>(o:Null<T>):Null<T> {
|
||||
if (!Jvm.instanceof(o, jvm.DynamicObject)) {
|
||||
return null;
|
||||
}
|
||||
var o = (cast o : jvm.DynamicObject);
|
||||
return cast o._hx_clone();
|
||||
}
|
||||
|
||||
@:overload(function(f:Array<Dynamic>->Void):Dynamic {})
|
||||
public static function makeVarArgs(f:Array<Dynamic>->Dynamic):Dynamic {
|
||||
return new jvm.Closure.VarArgs((cast f : jvm.Function));
|
||||
}
|
||||
}
|
179
Kha/Tools/linux_x64/std/jvm/_std/Std.hx
Normal file
179
Kha/Tools/linux_x64/std/jvm/_std/Std.hx
Normal file
@ -0,0 +1,179 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 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.
|
||||
*/
|
||||
|
||||
import jvm.Jvm;
|
||||
|
||||
@:coreApi
|
||||
class Std {
|
||||
@:deprecated('Std.is is deprecated. Use Std.isOfType instead.')
|
||||
public static inline function is(v:Dynamic, t:Dynamic):Bool {
|
||||
return isOfType(v, t);
|
||||
}
|
||||
|
||||
public static function isOfType(v:Dynamic, t:Dynamic):Bool {
|
||||
if (v == null || t == null) {
|
||||
return false;
|
||||
}
|
||||
var clt:java.lang.Class<Dynamic> = cast t;
|
||||
if (clt == null) {
|
||||
return false;
|
||||
}
|
||||
if (clt == cast java.lang.Object) {
|
||||
return true;
|
||||
}
|
||||
clt = Jvm.getWrapperClass(clt);
|
||||
if (clt == cast java.lang.Double.DoubleClass) {
|
||||
// Haxe semantics: any number is assignable to Float
|
||||
clt = cast java.lang.Number;
|
||||
} else if (clt == cast java.lang.Integer.IntegerClass) {
|
||||
if (!Jvm.instanceof(v, java.lang.Number)) {
|
||||
return false;
|
||||
}
|
||||
var n = (cast v : java.lang.Number);
|
||||
// Haxe semantics: 2.0 is an integer...
|
||||
return n.doubleValue() == n.intValue();
|
||||
}
|
||||
return clt.isAssignableFrom((v : java.lang.Object).getClass());
|
||||
}
|
||||
|
||||
public static function string(s:Dynamic):String {
|
||||
return jvm.Jvm.toString(s);
|
||||
}
|
||||
|
||||
public static function int(x:Float):Int {
|
||||
return cast x;
|
||||
}
|
||||
|
||||
public static function parseInt(x:String):Null<Int> {
|
||||
if (x == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var base = 10;
|
||||
var len = x.length;
|
||||
var foundCount = 0;
|
||||
var sign = 0;
|
||||
var firstDigitIndex = 0;
|
||||
var lastDigitIndex = -1;
|
||||
var previous = 0;
|
||||
|
||||
for (i in 0...len) {
|
||||
var c = StringTools.fastCodeAt(x, i);
|
||||
switch c {
|
||||
case _ if ((c > 8 && c < 14) || c == 32):
|
||||
if (foundCount > 0) {
|
||||
return null;
|
||||
}
|
||||
continue;
|
||||
case '-'.code if (foundCount == 0):
|
||||
sign = -1;
|
||||
case '+'.code if (foundCount == 0):
|
||||
sign = 1;
|
||||
case '0'.code if (foundCount == 0 || (foundCount == 1 && sign != 0)):
|
||||
case 'x'.code | 'X'.code if (previous == '0'.code && ((foundCount == 1 && sign == 0) || (foundCount == 2 && sign != 0))):
|
||||
base = 16;
|
||||
case _ if ('0'.code <= c && c <= '9'.code):
|
||||
case _ if (base == 16 && (('a'.code <= c && c <= 'z'.code) || ('A'.code <= c && c <= 'Z'.code))):
|
||||
case _:
|
||||
break;
|
||||
}
|
||||
if ((foundCount == 0 && sign == 0) || (foundCount == 1 && sign != 0)) {
|
||||
firstDigitIndex = i;
|
||||
}
|
||||
foundCount++;
|
||||
lastDigitIndex = i;
|
||||
previous = c;
|
||||
}
|
||||
if (firstDigitIndex <= lastDigitIndex) {
|
||||
var digits = x.substring(firstDigitIndex + (base == 16 ? 2 : 0), lastDigitIndex + 1);
|
||||
return try {
|
||||
(sign == -1 ? -1 : 1) * java.lang.Integer.parseInt(digits, base);
|
||||
} catch (e:java.lang.NumberFormatException) {
|
||||
null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function parseFloat(x:String):Float {
|
||||
if (x == null) {
|
||||
return Math.NaN;
|
||||
}
|
||||
x = StringTools.ltrim(x);
|
||||
var xn:java.NativeString = cast x;
|
||||
var found = false,
|
||||
hasDot = false,
|
||||
hasSign = false,
|
||||
hasE = false,
|
||||
hasESign = false,
|
||||
hasEData = false;
|
||||
var i = -1;
|
||||
|
||||
while (++i < x.length) {
|
||||
var chr:Int = cast xn.charAt(i);
|
||||
if (chr >= '0'.code && chr <= '9'.code) {
|
||||
if (hasE) {
|
||||
hasEData = true;
|
||||
}
|
||||
found = true;
|
||||
} else
|
||||
switch (chr) {
|
||||
case 'e'.code | 'E'.code if (!hasE):
|
||||
hasE = true;
|
||||
case '.'.code if (!hasDot):
|
||||
hasDot = true;
|
||||
case '-'.code, '+'.code if (!found && !hasSign):
|
||||
hasSign = true;
|
||||
case '-'.code | '+'.code if (found && !hasESign && hasE && !hasEData):
|
||||
hasESign = true;
|
||||
case _:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasE && !hasEData) {
|
||||
i--;
|
||||
if (hasESign)
|
||||
i--;
|
||||
}
|
||||
|
||||
if (i != x.length) {
|
||||
x = x.substr(0, i);
|
||||
}
|
||||
return try java.lang.Double.DoubleClass.parseDouble(x) catch (e:Dynamic) Math.NaN;
|
||||
}
|
||||
|
||||
inline public static function downcast<T:{}, S:T>(value:T, c:Class<S>):S {
|
||||
return Std.isOfType(value, c) ? cast value : null;
|
||||
}
|
||||
|
||||
@:deprecated('Std.instance() is deprecated. Use Std.downcast() instead.')
|
||||
inline public static function instance<T:{}, S:T>(value:T, c:Class<S>):S {
|
||||
return downcast(value, c);
|
||||
}
|
||||
|
||||
public static function random(x:Int):Int {
|
||||
if (x <= 0) {
|
||||
return 0;
|
||||
}
|
||||
return Std.int(Math.random() * x);
|
||||
}
|
||||
}
|
76
Kha/Tools/linux_x64/std/jvm/_std/String.hx
Normal file
76
Kha/Tools/linux_x64/std/jvm/_std/String.hx
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 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.
|
||||
*/
|
||||
@:coreApi
|
||||
@:native("java.lang.String")
|
||||
extern class String implements java.lang.CharSequence {
|
||||
var length(default, null):Int;
|
||||
|
||||
@:overload(function(b:haxe.io.BytesData, offset:Int, length:Int, charsetName:String):Void {})
|
||||
@:overload(function(b:haxe.io.BytesData, offset:Int, length:Int):Void {})
|
||||
@:overload(function(b:java.NativeArray<java.StdTypes.Char16>):Void {})
|
||||
@:overload(function(b:java.NativeArray<Int>, offset:Int, count:Int):Void {})
|
||||
function new(string:String):Void;
|
||||
|
||||
function toUpperCase():String;
|
||||
function toLowerCase():String;
|
||||
|
||||
@:runtime inline function charAt(index:Int):String {
|
||||
return jvm.StringExt.charAt(this, index);
|
||||
}
|
||||
|
||||
inline function charCodeAt(index:Int):Null<Int> {
|
||||
return jvm.StringExt.charCodeAt(this, index);
|
||||
}
|
||||
|
||||
inline function indexOf(str:String, ?startIndex:Int):Int {
|
||||
return jvm.StringExt.indexOf(this, str, startIndex);
|
||||
}
|
||||
|
||||
@:runtime inline function lastIndexOf(str:String, ?startIndex:Int):Int {
|
||||
return jvm.StringExt.lastIndexOf(this, str, startIndex);
|
||||
}
|
||||
|
||||
@:runtime inline function split(delimiter:String):Array<String> {
|
||||
return jvm.StringExt.split(this, delimiter);
|
||||
}
|
||||
|
||||
@:runtime inline function substr(pos:Int, ?len:Int):String {
|
||||
return jvm.StringExt.substr(this, pos, len);
|
||||
}
|
||||
|
||||
@:runtime inline function substring(startIndex:Int, ?endIndex:Int):String {
|
||||
return jvm.StringExt.substring(this, startIndex, endIndex);
|
||||
}
|
||||
|
||||
function toString():String;
|
||||
|
||||
private function compareTo(anotherString:String):Int;
|
||||
|
||||
private function codePointAt(idx:Int):Int;
|
||||
|
||||
@:overload(function():haxe.io.BytesData {})
|
||||
private function getBytes(encoding:String):haxe.io.BytesData;
|
||||
|
||||
@:runtime static inline function fromCharCode(code:Int):String {
|
||||
return jvm.StringExt.fromCharCode(code);
|
||||
}
|
||||
}
|
105
Kha/Tools/linux_x64/std/jvm/_std/StringBuf.hx
Normal file
105
Kha/Tools/linux_x64/std/jvm/_std/StringBuf.hx
Normal file
@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 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.
|
||||
*/
|
||||
@:coreApi
|
||||
class StringBuf {
|
||||
private var b:java.lang.StringBuilder;
|
||||
|
||||
public var length(get, never):Int;
|
||||
|
||||
public function new():Void {
|
||||
b = new java.lang.StringBuilder();
|
||||
}
|
||||
|
||||
inline function get_length():Int {
|
||||
return b.length();
|
||||
}
|
||||
|
||||
public function add<T>(x:T):Void {
|
||||
if (jvm.Jvm.instanceof(x, java.lang.Double.DoubleClass)) {
|
||||
b.append(jvm.Jvm.toString(cast x));
|
||||
} else {
|
||||
b.append(x);
|
||||
}
|
||||
}
|
||||
|
||||
@:overload
|
||||
@:native("add")
|
||||
@:ifFeature("StringBuf.add")
|
||||
function addOpt(v:Bool):Void {
|
||||
b.append(v);
|
||||
}
|
||||
|
||||
@:overload
|
||||
@:native("add")
|
||||
@:ifFeature("StringBuf.add")
|
||||
function addOpt(v:java.types.Char16):Void {
|
||||
b.append(v);
|
||||
}
|
||||
|
||||
@:overload
|
||||
@:native("add")
|
||||
@:ifFeature("StringBuf.add")
|
||||
function addOpt(v:Float):Void {
|
||||
b.append(v);
|
||||
}
|
||||
|
||||
@:overload
|
||||
@:native("add")
|
||||
@:ifFeature("StringBuf.add")
|
||||
function addOpt(v:Single):Void {
|
||||
b.append(v);
|
||||
}
|
||||
|
||||
@:overload
|
||||
@:native("add")
|
||||
@:ifFeature("StringBuf.add")
|
||||
function addOpt(v:Int):Void {
|
||||
b.append(v);
|
||||
}
|
||||
|
||||
@:overload
|
||||
@:native("add")
|
||||
@:ifFeature("StringBuf.add")
|
||||
function addOpt(v:haxe.Int64):Void {
|
||||
b.append(v);
|
||||
}
|
||||
|
||||
@:overload
|
||||
@:native("add")
|
||||
@:ifFeature("StringBuf.add")
|
||||
function addOpt(v:String):Void {
|
||||
b.append(v);
|
||||
}
|
||||
|
||||
public function addSub(s:String, pos:Int, ?len:Int):Void {
|
||||
var l:Int = (len == null) ? s.length - pos : len;
|
||||
b.append(s, pos, pos + l);
|
||||
}
|
||||
|
||||
public function addChar(c:Int):Void {
|
||||
b.appendCodePoint(c);
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
return b.toString();
|
||||
}
|
||||
}
|
312
Kha/Tools/linux_x64/std/jvm/_std/Type.hx
Normal file
312
Kha/Tools/linux_x64/std/jvm/_std/Type.hx
Normal file
@ -0,0 +1,312 @@
|
||||
import java.lang.NoSuchMethodException;
|
||||
import jvm.Jvm;
|
||||
import jvm.annotation.*;
|
||||
|
||||
using jvm.NativeTools.NativeClassTools;
|
||||
using jvm.NativeTools.NativeEnumTools;
|
||||
using jvm.NativeTools.ObjectTools;
|
||||
|
||||
enum ValueType {
|
||||
TNull;
|
||||
TInt;
|
||||
TFloat;
|
||||
TBool;
|
||||
TObject;
|
||||
TFunction;
|
||||
TClass(c:Class<Dynamic>);
|
||||
TEnum(e:Enum<Dynamic>);
|
||||
TUnknown;
|
||||
}
|
||||
|
||||
@:coreApi
|
||||
class Type {
|
||||
static function isEnumClass<T>(c:java.lang.Class<T>):Bool {
|
||||
// TODO: have to be careful if we ever decide to omit EnumReflectionInformation
|
||||
// Maybe a separate HaxeEnum annotation would be better here
|
||||
return c.isAnnotationPresent(cast EnumReflectionInformation);
|
||||
}
|
||||
|
||||
static function isEnumValueClass<T>(c:java.lang.Class<T>):Bool {
|
||||
// TODO: have to be careful if we ever decide to omit EnumValueReflectionInformation
|
||||
// Maybe a separate HaxeEnum annotation would be better here
|
||||
return c.isAnnotationPresent(cast EnumValueReflectionInformation);
|
||||
}
|
||||
|
||||
public static function getClass<T>(o:T):Class<T> {
|
||||
if (o == null) {
|
||||
return null;
|
||||
}
|
||||
if (Jvm.instanceof(o, Class)) {
|
||||
return null;
|
||||
}
|
||||
var c = o.object().getClass();
|
||||
if (isEnumValueClass(c)) {
|
||||
return null;
|
||||
}
|
||||
if (c == jvm.DynamicObject.native() || Jvm.instanceof(o, jvm.DynamicObject)) {
|
||||
return null;
|
||||
}
|
||||
return c.haxe();
|
||||
}
|
||||
|
||||
public static function getEnum(o:EnumValue):Enum<Dynamic> {
|
||||
if (o == null) {
|
||||
return null;
|
||||
}
|
||||
var c = o.object().getClass().getSuperclass();
|
||||
if (!c.isAnnotationPresent(cast EnumReflectionInformation)) {
|
||||
return null;
|
||||
}
|
||||
return c.haxeEnum();
|
||||
}
|
||||
|
||||
public static function getSuperClass(c:Class<Dynamic>):Class<Dynamic> {
|
||||
if (c == String) {
|
||||
return null;
|
||||
}
|
||||
var c = c.native();
|
||||
var cSuper = c.getSuperclass();
|
||||
if (cSuper == null) {
|
||||
return null;
|
||||
}
|
||||
var annotation = c.getAnnotation((cast ClassReflectionInformation : java.lang.Class<ClassReflectionInformation>));
|
||||
if (annotation != null && annotation.hasSuperClass() == false) {
|
||||
return null;
|
||||
}
|
||||
return cSuper.haxe();
|
||||
}
|
||||
|
||||
public static function getClassName(c:Class<Dynamic>):String {
|
||||
return switch (c.native().getName()) {
|
||||
case "java.lang.String": "String";
|
||||
case "java.lang.Math": "Math";
|
||||
case s if (s.indexOf("haxe.root.") == 0): s.substr(10);
|
||||
case s: s;
|
||||
}
|
||||
}
|
||||
|
||||
public static function getEnumName(e:Enum<Dynamic>):String {
|
||||
return switch e.native().getName() {
|
||||
case s if(s.indexOf("haxe.root.") == 0): s.substr(10);
|
||||
case s: s;
|
||||
}
|
||||
}
|
||||
|
||||
public static function resolveClass(name:String):Class<Dynamic> {
|
||||
if (name.indexOf(".") == -1) {
|
||||
name = "haxe.root." + name;
|
||||
}
|
||||
return try {
|
||||
java.lang.Class.forName(name).haxe();
|
||||
} catch (e:java.lang.ClassNotFoundException) {
|
||||
return switch (name) {
|
||||
case "haxe.root.String": java.NativeString;
|
||||
case "haxe.root.Math": java.lang.Math;
|
||||
case _: null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function resolveEnum(name:String):Enum<Dynamic> {
|
||||
if (name.indexOf(".") == -1) {
|
||||
name = "haxe.root." + name;
|
||||
}
|
||||
return try {
|
||||
var c = java.lang.Class.forName(name);
|
||||
if (!isEnumClass(c)) {
|
||||
null;
|
||||
} else {
|
||||
c.haxeEnum();
|
||||
}
|
||||
} catch (e:java.lang.ClassNotFoundException) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static final emptyArg = {
|
||||
var a = new java.NativeArray(1);
|
||||
a[0] = (null : jvm.EmptyConstructor);
|
||||
a;
|
||||
}
|
||||
|
||||
static final emptyClass = {
|
||||
var a = new java.NativeArray(1);
|
||||
a[0] = jvm.EmptyConstructor.native();
|
||||
a;
|
||||
}
|
||||
|
||||
public static function createInstance<T>(cl:Class<T>, args:Array<Dynamic>):T {
|
||||
var args = @:privateAccess args.getNative();
|
||||
var cl = cl.native();
|
||||
var ctors = cl.getConstructors();
|
||||
var emptyCtor:Null<java.lang.reflect.Constructor<T>> = null;
|
||||
// 1. Look for real constructor. If we find the EmptyConstructor constructor, store it
|
||||
for (ctor in ctors) {
|
||||
var params = ctor.getParameterTypes();
|
||||
if (params.length == 1 && params[0] == jvm.EmptyConstructor.native()) {
|
||||
emptyCtor = cast ctor;
|
||||
continue;
|
||||
}
|
||||
switch (Jvm.unifyCallArguments(args, params, true)) {
|
||||
case Some(args):
|
||||
ctor.setAccessible(true);
|
||||
return ctor.newInstance(args);
|
||||
case None:
|
||||
}
|
||||
}
|
||||
// 2. If there was the EmptyConstructor constructor, look for a matching new method
|
||||
if (emptyCtor != null) {
|
||||
var methods = cl.getMethods();
|
||||
for (method in methods) {
|
||||
if (method.getName() != "new") {
|
||||
continue;
|
||||
}
|
||||
var params = method.getParameterTypes();
|
||||
switch (Jvm.unifyCallArguments(args, params, true)) {
|
||||
case Some(args):
|
||||
var obj = emptyCtor.newInstance(emptyArg);
|
||||
method.setAccessible(true);
|
||||
method.invoke(obj, args);
|
||||
return obj;
|
||||
case None:
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function createEmptyInstance<T>(cl:Class<T>):T {
|
||||
var annotation = (cl.native().getAnnotation((cast ClassReflectionInformation : java.lang.Class<ClassReflectionInformation>)));
|
||||
if (annotation != null) {
|
||||
return cl.native().getConstructor(emptyClass).newInstance(emptyArg);
|
||||
} else {
|
||||
return cl.native().newInstance();
|
||||
}
|
||||
}
|
||||
|
||||
public static function createEnum<T>(e:Enum<T>, constr:String, ?params:Array<Dynamic>):T {
|
||||
if (params == null || params.length == 0) {
|
||||
var v:Dynamic = Jvm.readField(e, constr);
|
||||
if (!Std.isOfType(v, e)) {
|
||||
throw 'Could not create enum value ${getEnumName(e)}.$constr: Unexpected value $v';
|
||||
}
|
||||
return v;
|
||||
} else {
|
||||
return Reflect.callMethod(null, Jvm.readField(e, constr), params);
|
||||
}
|
||||
}
|
||||
|
||||
public static function createEnumIndex<T>(e:Enum<T>, index:Int, ?params:Array<Dynamic>):T {
|
||||
var clInfo:java.lang.Class<EnumReflectionInformation> = cast EnumReflectionInformation;
|
||||
var annotation = e.native().getAnnotation(clInfo);
|
||||
if (params == null || params.length == 0) {
|
||||
return Jvm.readField(e, annotation.constructorNames()[index]);
|
||||
} else {
|
||||
return Reflect.callMethod(null, Jvm.readField(e, annotation.constructorNames()[index]), params);
|
||||
}
|
||||
}
|
||||
|
||||
static function getFields<T>(c:java.lang.Class<T>, statics:Bool):Array<String> {
|
||||
var ret = [];
|
||||
for (f in c.getDeclaredFields()) {
|
||||
if (java.lang.reflect.Modifier.isStatic(f.getModifiers()) == statics && !f.isSynthetic()) {
|
||||
ret.push(f.getName());
|
||||
}
|
||||
}
|
||||
for (m in c.getDeclaredMethods()) {
|
||||
if (java.lang.reflect.Modifier.isStatic(m.getModifiers()) == statics && !m.isSynthetic()) {
|
||||
ret.push(m.getName());
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
public static function getInstanceFields(c:Class<Dynamic>):Array<String> {
|
||||
var fields = [];
|
||||
while (c != null) {
|
||||
for (field in fields.concat(getFields(c.native(), false))) {
|
||||
if (fields.indexOf(field) == -1) {
|
||||
fields.push(field);
|
||||
}
|
||||
}
|
||||
c = getSuperClass(c);
|
||||
};
|
||||
return fields;
|
||||
}
|
||||
|
||||
public static function getClassFields(c:Class<Dynamic>):Array<String> {
|
||||
return getFields(c.native(), true);
|
||||
}
|
||||
|
||||
public static function getEnumConstructs(e:Enum<Dynamic>):Array<String> {
|
||||
var clInfo:java.lang.Class<EnumReflectionInformation> = cast EnumReflectionInformation;
|
||||
var annotation = e.native().getAnnotation(clInfo);
|
||||
return @:privateAccess Array.ofNative(annotation.constructorNames());
|
||||
}
|
||||
|
||||
public static function typeof(v:Dynamic):ValueType {
|
||||
// could optimize this with an annotation on Haxe classes
|
||||
if (v == null) {
|
||||
return TNull;
|
||||
}
|
||||
if (Jvm.instanceof(v, java.lang.Number)) {
|
||||
var v:java.lang.Number = cast v;
|
||||
if (v.intValue() == v.doubleValue()) {
|
||||
return TInt;
|
||||
}
|
||||
return TFloat;
|
||||
}
|
||||
if (Jvm.instanceof(v, java.lang.Boolean.BooleanClass)) {
|
||||
return TBool;
|
||||
}
|
||||
if (Jvm.instanceof(v, jvm.DynamicObject)) {
|
||||
return TObject;
|
||||
}
|
||||
if (Jvm.instanceof(v, jvm.Function)) {
|
||||
return TFunction;
|
||||
}
|
||||
var c = (cast v : java.lang.Object).getClass();
|
||||
// TODO: native enums?
|
||||
if (isEnumValueClass(c)) {
|
||||
return TEnum(c.getSuperclass().haxeEnum());
|
||||
}
|
||||
if (Jvm.instanceof(v, java.lang.Class)) {
|
||||
return TObject;
|
||||
}
|
||||
return TClass(c.haxe());
|
||||
}
|
||||
|
||||
public static function enumEq<T>(a:T, b:T):Bool {
|
||||
if (a == null) {
|
||||
return b == null;
|
||||
}
|
||||
var a:jvm.Enum<Dynamic> = cast a;
|
||||
var b:jvm.Enum<Dynamic> = cast b;
|
||||
return a.equals(b);
|
||||
}
|
||||
|
||||
public static function enumConstructor(e:EnumValue):String {
|
||||
return (cast e : java.lang.Enum<Dynamic>).name();
|
||||
}
|
||||
|
||||
public static function enumParameters(e:EnumValue):Array<Dynamic> {
|
||||
var a = (cast e : jvm.Enum<Dynamic>)._hx_getParameters();
|
||||
return @:privateAccess Array.ofNative(a);
|
||||
}
|
||||
|
||||
public static function enumIndex(e:EnumValue):Int {
|
||||
return (cast e : java.lang.Enum<Dynamic>).ordinal();
|
||||
}
|
||||
|
||||
public static function allEnums<T>(e:Enum<T>):Array<T> {
|
||||
var all = getEnumConstructs(e);
|
||||
var ret = [];
|
||||
for (name in all) {
|
||||
var v = Jvm.readField(e, name);
|
||||
if (Jvm.instanceof(v, jvm.Enum)) {
|
||||
ret.push(v);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
91
Kha/Tools/linux_x64/std/jvm/_std/haxe/ds/StringMap.hx
Normal file
91
Kha/Tools/linux_x64/std/jvm/_std/haxe/ds/StringMap.hx
Normal file
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 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 haxe.ds;
|
||||
|
||||
@:coreApi
|
||||
class StringMap<T> implements haxe.Constraints.IMap<String, T> {
|
||||
var hashMap:java.util.HashMap<String, T>;
|
||||
|
||||
@:overload
|
||||
public function new():Void {
|
||||
hashMap = new java.util.HashMap();
|
||||
}
|
||||
|
||||
@:overload
|
||||
function new(hashMap:java.util.HashMap<String, T>):Void {
|
||||
this.hashMap = hashMap;
|
||||
}
|
||||
|
||||
public function set(key:String, value:T):Void {
|
||||
hashMap.put(key, value);
|
||||
}
|
||||
|
||||
public function get(key:String):Null<T> {
|
||||
return hashMap.get(key);
|
||||
}
|
||||
|
||||
public function exists(key:String):Bool {
|
||||
return hashMap.containsKey(key);
|
||||
}
|
||||
|
||||
public function remove(key:String):Bool {
|
||||
var has = exists(key);
|
||||
hashMap.remove(key);
|
||||
return has;
|
||||
}
|
||||
|
||||
public inline function keys():Iterator<String> {
|
||||
return hashMap.keySet().iterator();
|
||||
}
|
||||
|
||||
@:runtime public inline function keyValueIterator():KeyValueIterator<String, T> {
|
||||
return new haxe.iterators.MapKeyValueIterator(this);
|
||||
}
|
||||
|
||||
public inline function iterator():Iterator<T> {
|
||||
return hashMap.values().iterator();
|
||||
}
|
||||
|
||||
public function copy():StringMap<T> {
|
||||
return new StringMap(hashMap.clone());
|
||||
}
|
||||
|
||||
public function toString():String {
|
||||
var s = new StringBuf();
|
||||
s.add("{");
|
||||
var it = keys();
|
||||
for (i in it) {
|
||||
s.add(i);
|
||||
s.add(" => ");
|
||||
s.add(Std.string(get(i)));
|
||||
if (it.hasNext())
|
||||
s.add(", ");
|
||||
}
|
||||
s.add("}");
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
public function clear():Void {
|
||||
hashMap.clear();
|
||||
}
|
||||
}
|
43
Kha/Tools/linux_x64/std/jvm/_std/sys/thread/Lock.hx
Normal file
43
Kha/Tools/linux_x64/std/jvm/_std/sys/thread/Lock.hx
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 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 sys.thread;
|
||||
|
||||
import java.util.concurrent.LinkedBlockingDeque;
|
||||
|
||||
@:coreApi
|
||||
class Lock {
|
||||
final deque = new LinkedBlockingDeque<String>();
|
||||
|
||||
public function new() {}
|
||||
|
||||
public function wait(?timeout:Float):Bool {
|
||||
return switch timeout == null ? deque.take() : deque.poll(Std.int(timeout * 1000.0), MILLISECONDS) {
|
||||
case null: false;
|
||||
case _: true;
|
||||
}
|
||||
}
|
||||
|
||||
public function release():Void {
|
||||
deque.put("");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user