Skip to content

Commit a910b53

Browse files
Proposal for table set_row in C
1 parent d10e1a5 commit a910b53

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

c/tskit/tables.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,53 @@ tsk_individual_table_get_row(
984984
return ret;
985985
}
986986

987+
int
988+
tsk_individual_table_set_row(
989+
tsk_individual_table_t *self, tsk_id_t index, const tsk_individual_t *row)
990+
{
991+
int ret = 0;
992+
tsk_id_t ret_id;
993+
tsk_individual_table_t copy;
994+
tsk_id_t j;
995+
tsk_size_t num_rows;
996+
tsk_id_t *rows = NULL;
997+
998+
ret = tsk_individual_table_copy(self, &copy, 0);
999+
if (ret != 0) {
1000+
goto out;
1001+
}
1002+
rows = malloc(self->num_rows * sizeof(*rows));
1003+
if (rows == NULL) {
1004+
ret = TSK_ERR_NO_MEMORY;
1005+
goto out;
1006+
}
1007+
1008+
ret = tsk_individual_table_truncate(self, (tsk_size_t) index);
1009+
if (ret != 0) {
1010+
goto out;
1011+
}
1012+
ret_id = tsk_individual_table_add_row(self, row->flags, row->location,
1013+
row->location_length, row->parents, self->parents_length, self->metadata,
1014+
self->metadata_length);
1015+
if (ret_id < 0) {
1016+
ret = ret_id;
1017+
goto out;
1018+
}
1019+
num_rows = 0;
1020+
for (j = index + 1; j < (tsk_id_t) self->num_rows; j++) {
1021+
rows[num_rows] = j;
1022+
num_rows++;
1023+
}
1024+
ret = tsk_individual_table_extend(self, &copy, num_rows, rows, 0);
1025+
if (ret != 0) {
1026+
goto out;
1027+
}
1028+
out:
1029+
tsk_individual_table_free(&copy);
1030+
tsk_safe_free(rows);
1031+
return ret;
1032+
}
1033+
9871034
int
9881035
tsk_individual_table_set_metadata_schema(tsk_individual_table_t *self,
9891036
const char *metadata_schema, tsk_size_t metadata_schema_length)

c/tskit/tables.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,9 @@ next operation that modifies the table (e.g., by adding a new row), but not afte
957957
int tsk_individual_table_get_row(
958958
const tsk_individual_table_t *self, tsk_id_t index, tsk_individual_t *row);
959959

960+
int tsk_individual_table_set_row(
961+
tsk_individual_table_t *self, tsk_id_t index, const tsk_individual_t *row);
962+
960963
/**
961964
@brief Set the metadata schema
962965

0 commit comments

Comments
 (0)