Add string comparison operator overloads (#64)

This commit is contained in:
Max Graey 2018-04-04 22:50:40 +03:00 committed by Daniel Wirtz
parent 5e20bed09a
commit e790eb757f
4 changed files with 1656 additions and 190 deletions

View File

@ -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 { includes(searchString: String, position: i32 = 0): bool {
return this.indexOf(searchString, position) != -1; return this.indexOf(searchString, position) != -1;
} }

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,7 @@ import "allocator/arena";
// preliminary // preliminary
var str: string = "hi, I'm a string"; var str: string = "hi, I'm a string";
var nullStr: String;
// exactly once in static memory // exactly once in static memory
assert(changetype<usize>(str) == changetype<usize>("hi, I'm a string")); assert(changetype<usize>(str) == changetype<usize>("hi, I'm a string"));
@ -36,3 +37,26 @@ assert(parseFloat(".1foobar") == 0.1);
var c = "a" + "b"; var c = "a" + "b";
assert(c == "ab"); 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