mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-05-10 14:18:01 +00:00
Add string comparison operator overloads (#64)
This commit is contained in:
parent
5e20bed09a
commit
e790eb757f
@ -127,6 +127,91 @@ export class String {
|
||||
);
|
||||
}
|
||||
|
||||
@operator("!=")
|
||||
private static __ne(left: String, right: String): bool {
|
||||
return !this.__eq(left, right);
|
||||
}
|
||||
|
||||
@operator(">")
|
||||
private static __gt(left: String, right: String): bool {
|
||||
if (!changetype<usize>(left) || !changetype<usize>(right)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var leftLength = left.length;
|
||||
var rightLength = right.length;
|
||||
|
||||
if (!leftLength) return false;
|
||||
if (!rightLength) return true;
|
||||
|
||||
var length = <usize>min<i32>(leftLength, rightLength);
|
||||
return compare_memory(
|
||||
changetype<usize>(left) + HEADER_SIZE,
|
||||
changetype<usize>(right) + HEADER_SIZE,
|
||||
length << 1
|
||||
) > 0;
|
||||
}
|
||||
|
||||
@operator(">=")
|
||||
private static __gte(left: String, right: String): bool {
|
||||
if (!changetype<usize>(left) || !changetype<usize>(right)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var leftLength = left.length;
|
||||
var rightLength = right.length;
|
||||
|
||||
if (!leftLength) return !rightLength;
|
||||
if (!rightLength) return true;
|
||||
|
||||
var length = <usize>min<i32>(leftLength, rightLength);
|
||||
return compare_memory(
|
||||
changetype<usize>(left) + HEADER_SIZE,
|
||||
changetype<usize>(right) + HEADER_SIZE,
|
||||
length << 1
|
||||
) >= 0;
|
||||
}
|
||||
|
||||
@operator("<")
|
||||
private static __lt(left: String, right: String): bool {
|
||||
if (!changetype<usize>(left) || !changetype<usize>(right)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var leftLength = left.length;
|
||||
var rightLength = right.length;
|
||||
|
||||
if (!rightLength) return false;
|
||||
if (!leftLength) return true;
|
||||
|
||||
var length = <usize>min<i32>(leftLength, rightLength);
|
||||
return compare_memory(
|
||||
changetype<usize>(left) + HEADER_SIZE,
|
||||
changetype<usize>(right) + HEADER_SIZE,
|
||||
length << 1
|
||||
) < 0;
|
||||
}
|
||||
|
||||
@operator("<=")
|
||||
private static __lte(left: String, right: String): bool {
|
||||
if (!changetype<usize>(left) || !changetype<usize>(right)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var leftLength = left.length;
|
||||
var rightLength = right.length;
|
||||
|
||||
if (!rightLength) return !leftLength;
|
||||
if (!leftLength) return true;
|
||||
|
||||
var length = <usize>min<i32>(leftLength, rightLength);
|
||||
return compare_memory(
|
||||
changetype<usize>(left) + HEADER_SIZE,
|
||||
changetype<usize>(right) + HEADER_SIZE,
|
||||
length << 1
|
||||
) <= 0;
|
||||
}
|
||||
|
||||
includes(searchString: String, position: i32 = 0): bool {
|
||||
return this.indexOf(searchString, position) != -1;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -3,6 +3,7 @@ import "allocator/arena";
|
||||
// preliminary
|
||||
|
||||
var str: string = "hi, I'm a string";
|
||||
var nullStr: String;
|
||||
|
||||
// exactly once in static memory
|
||||
assert(changetype<usize>(str) == changetype<usize>("hi, I'm a string"));
|
||||
@ -36,3 +37,26 @@ assert(parseFloat(".1foobar") == 0.1);
|
||||
|
||||
var c = "a" + "b";
|
||||
assert(c == "ab");
|
||||
assert(c != "a");
|
||||
assert("" == "");
|
||||
assert("" != nullStr);
|
||||
|
||||
assert("b" > "a");
|
||||
assert("ba" > "a");
|
||||
assert("ba" >= "aa");
|
||||
assert("ba" > "ab");
|
||||
assert(!("ba" < "ab"));
|
||||
|
||||
assert(!("b" < nullStr));
|
||||
assert(!(nullStr < "b"));
|
||||
|
||||
assert("abc" > "");
|
||||
assert("" < "abc");
|
||||
assert("abc" >= "");
|
||||
assert("" <= "abc");
|
||||
assert(!("abc" < ""));
|
||||
assert(!("" > "abc"));
|
||||
assert(!("" < ""));
|
||||
assert(!("" > ""));
|
||||
assert("" >= "");
|
||||
assert("" <= "");
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user