Optimize list appends O(n^2)->O(n)
This commit is contained in:
@@ -12,11 +12,12 @@
|
|||||||
struct ucl_object *ucl_evaluate_builtin_form(struct ucl_scope *scope, struct ucl_object *list) {
|
struct ucl_object *ucl_evaluate_builtin_form(struct ucl_scope *scope, struct ucl_object *list) {
|
||||||
// TODO: Reasonably split builtin and non-builtin evaluation
|
// TODO: Reasonably split builtin and non-builtin evaluation
|
||||||
struct ucl_object *evaluated_list = ucl_nil_create();
|
struct ucl_object *evaluated_list = ucl_nil_create();
|
||||||
|
struct ucl_object *evaluated_list_tail = evaluated_list;
|
||||||
|
|
||||||
FOREACH_LIST(list, iter, item) {
|
FOREACH_LIST(list, iter, item) {
|
||||||
struct ucl_object *obj = ucl_evaluate(scope, item);
|
struct ucl_object *obj = ucl_evaluate(scope, item);
|
||||||
UCL_RET_IF_ERROR(obj);
|
UCL_RET_IF_ERROR(obj);
|
||||||
ucl_list_append(evaluated_list, obj);
|
evaluated_list_tail = ucl_list_append(evaluated_list_tail, obj);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ucl_object *fun = ucl_car(evaluated_list);
|
struct ucl_object *fun = ucl_car(evaluated_list);
|
||||||
|
|||||||
@@ -95,11 +95,12 @@ struct ucl_object *ucl_token_next(const char **curr_src) {
|
|||||||
|
|
||||||
struct ucl_object *ucl_tokenize(const char *source) {
|
struct ucl_object *ucl_tokenize(const char *source) {
|
||||||
struct ucl_object *tokens = ucl_nil_create();
|
struct ucl_object *tokens = ucl_nil_create();
|
||||||
|
struct ucl_object *tokens_tail = tokens;
|
||||||
struct ucl_object *curr_token = NULL;
|
struct ucl_object *curr_token = NULL;
|
||||||
const char *curr_src = source;
|
const char *curr_src = source;
|
||||||
|
|
||||||
while ((curr_token = ucl_token_next(&curr_src)) != NULL) {
|
while ((curr_token = ucl_token_next(&curr_src)) != NULL) {
|
||||||
ucl_list_append(tokens, curr_token);
|
tokens_tail = ucl_list_append(tokens_tail, curr_token);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tokens;
|
return tokens;
|
||||||
@@ -209,7 +210,7 @@ struct ucl_object *ucl_parse_tokens(struct ucl_object *tokens) {
|
|||||||
return new_sexp;
|
return new_sexp;
|
||||||
}
|
}
|
||||||
|
|
||||||
ucl_list_append(result_tail, new_sexp);
|
result_tail = ucl_list_append(result_tail, new_sexp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ struct ucl_object *ucl_list_append(struct ucl_object *list, struct ucl_object *o
|
|||||||
|
|
||||||
if (list->cell.car == NULL) {
|
if (list->cell.car == NULL) {
|
||||||
list->cell.car = obj;
|
list->cell.car = obj;
|
||||||
return NULL;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (iter->cell.cdr != NULL) {
|
while (iter->cell.cdr != NULL) {
|
||||||
|
|||||||
Reference in New Issue
Block a user