Optimization of string and vector with references and less functional code, bugfix of closing over references
This commit is contained in:
@@ -3,7 +3,7 @@ import util
|
||||
import mem
|
||||
|
||||
fun string(in:*char):string {
|
||||
var out:string = in
|
||||
var out.construct(in):string
|
||||
return out
|
||||
}
|
||||
|
||||
@@ -22,11 +22,11 @@ obj string (Object) {
|
||||
// no null terminator
|
||||
return this;
|
||||
}
|
||||
fun construct(vec: vector::vector<char>): *string {
|
||||
fun construct(vec: ref vector::vector<char>): *string {
|
||||
data.copy_construct(&vec);
|
||||
return this;
|
||||
}
|
||||
fun construct(str: string): *string {
|
||||
fun construct(str: ref string): *string {
|
||||
return construct(str.data);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ obj string (Object) {
|
||||
construct(str)
|
||||
}
|
||||
|
||||
fun operator=(str: string): void {
|
||||
fun operator=(str: ref string): void {
|
||||
destruct();
|
||||
data.copy_construct(&str.data)
|
||||
}
|
||||
@@ -62,8 +62,15 @@ obj string (Object) {
|
||||
}
|
||||
fun length():int { return data.size; }
|
||||
|
||||
fun operator==(other: string): bool {
|
||||
return length() == other.length() && !util::range(length()).any_true(fun(i: int):bool { return data[i] != other[i]; } )
|
||||
fun operator==(other: ref string): bool {
|
||||
// you were too good for this world
|
||||
//return length() == other.length() && !util::range(length()).any_true(fun(i: int):bool { return data[i] != other[i]; } )
|
||||
if (data.size != other.data.size)
|
||||
return false
|
||||
for (var i = 0; i < data.size; i++;)
|
||||
if (data.data[i] != other.data.data[i])
|
||||
return false
|
||||
return true
|
||||
}
|
||||
fun operator==(other: *char): bool {
|
||||
var str.construct(other) : string
|
||||
@@ -76,7 +83,7 @@ obj string (Object) {
|
||||
return ret
|
||||
}
|
||||
|
||||
fun operator+(str: string): string {
|
||||
fun operator+(str: ref string): string {
|
||||
var newStr.construct(str):string
|
||||
var ret.construct(data + newStr.data):string
|
||||
return ret
|
||||
@@ -91,9 +98,10 @@ obj string (Object) {
|
||||
data += newStr.data
|
||||
}
|
||||
|
||||
fun operator+=(str: string): void {
|
||||
var newStr.construct(str):string
|
||||
data += newStr.data
|
||||
fun operator+=(str: ref string): void {
|
||||
//var newStr.construct(str):string
|
||||
//data += newStr.data
|
||||
data += str.data
|
||||
}
|
||||
|
||||
fun toCharArray(): *char {
|
||||
|
||||
@@ -54,14 +54,14 @@ obj symbol (Object) {
|
||||
name.copy_construct(&old->name)
|
||||
terminal = old->terminal
|
||||
}
|
||||
fun operator=(old: symbol) {
|
||||
fun operator=(old: ref symbol) {
|
||||
destruct()
|
||||
copy_construct(&old)
|
||||
}
|
||||
fun operator==(other: symbol): bool {
|
||||
fun operator==(other: ref symbol): bool {
|
||||
return data == other.data && name == other.name && terminal == other.terminal;
|
||||
}
|
||||
fun operator!=(other: symbol): bool {
|
||||
fun operator!=(other: ref symbol): bool {
|
||||
return !(*this == other);
|
||||
}
|
||||
fun to_string(): string::string {
|
||||
|
||||
@@ -24,11 +24,19 @@ obj vector<T> (Object) {
|
||||
data = new<T>(8);
|
||||
return this;
|
||||
}
|
||||
fun construct(ammt: int): *vector<T> {
|
||||
size = 0;
|
||||
available = ammt;
|
||||
data = new<T>(ammt);
|
||||
return this;
|
||||
}
|
||||
|
||||
fun copy_construct(old: *vector<T>): void {
|
||||
construct()
|
||||
construct(old->size)
|
||||
size = old->size
|
||||
for (var i = 0; i < old->size; i++;)
|
||||
addEnd(old->get(i))
|
||||
maybe_copy_construct(&data[i], &old->data[i]);
|
||||
//addEnd(old->get(i))
|
||||
}
|
||||
|
||||
fun destruct(): void {
|
||||
|
||||
Reference in New Issue
Block a user