import vector; import mem; obj string (Destructable) { var data: vector::vector; fun construct(): string* { data.construct(); return this; } fun construct(str: char*): string* { data.construct(); while(*str) { data.addEnd(*str); str += 1; } // no null terminator return this; } fun construct(vec: vector::vector): string* { data.copy_construct(&vec); return this; } fun copy_construct(old: string*): void { data.copy_construct(&old->data) } fun destruct():void { data.destruct() } fun operator=(str: char*): void { destruct(); construct(str) } fun operator+(str: char*): string { var newStr.construct(str):string var ret.construct(data + newStr.data):string return ret } fun operator+=(str: char*): void { var newStr.construct(str):string data += newStr.data } fun toCharArray(): char* { var out: char* = mem::new(data.size+1); for (var i: int = 0; i < data.size; i++;) out[i] = data.get(i); // null terminator out[data.size] = 0 return out; } };