Working REMOVE and REMOVEAT

This commit is contained in:
Adrien Bouvais 2025-01-30 20:21:50 +01:00
parent cd178ce53d
commit 8c6a6188dd
2 changed files with 9 additions and 6 deletions

View File

@ -171,11 +171,6 @@ fn append(allocator: std.mem.Allocator, input: *zid.Data, data: ConditionValue)
}
}
// TODO: Change the array for a map to speed up thing
// And also I dont really need to realoc anything, only append need because here it can only go lower
// So I could just memcopy the remaining of the bytes at the current position, so it overwrite the value to remove
// Like if I want to re;ove 3 in [1 2 3 4 5], it would become [1 2 4 5 5]. Then I dont take the last value when I return.
// But that mean I keep in memory useless data, so maybe not
fn remove(allocator: std.mem.Allocator, input: *zid.Data, data: ConditionValue) !void {
var iter = try zid.ArrayIterator.init(input.*);
switch (input.*) {

View File

@ -49,6 +49,8 @@ pub fn parseNewData(
var state: Self.State = .expect_member_OR_value;
var i: usize = 0;
var array_condition_buf: ArrayCondition = undefined;
while (state != .end) : ({
token = if (!keep_next) self.toker.next() else token;
keep_next = false;
@ -131,6 +133,7 @@ pub fn parseNewData(
),
.keyword_append => if (for_update) {
state = .expect_new_array;
array_condition_buf = .append;
} else return printError(
"Error: Can only manipulate array with UPDATE.",
ZipponError.SynthaxError,
@ -140,6 +143,7 @@ pub fn parseNewData(
),
.keyword_remove => if (for_update) {
state = .expect_new_array;
array_condition_buf = .remove;
} else return printError(
"Error: Can only manipulate array with UPDATE.",
ZipponError.SynthaxError,
@ -149,6 +153,7 @@ pub fn parseNewData(
),
.keyword_remove_at => if (for_update) {
state = .expect_new_array;
array_condition_buf = .removeat;
} else return printError(
"Error: Can only manipulate array with UPDATE.",
ZipponError.SynthaxError,
@ -273,7 +278,10 @@ pub fn parseNewData(
};
map.put(
member_name,
ValueOrArray{ .array = .{ .condition = .append, .data = try self.parseConditionValue(allocator, struct_name, member_name, new_data_type, &token) } },
ValueOrArray{ .array = .{
.condition = array_condition_buf,
.data = try self.parseConditionValue(allocator, struct_name, member_name, new_data_type, &token),
} },
) catch return ZipponError.MemoryError;
if (member_data_type == .link or member_data_type == .link_array) {
token = self.toker.last_token;