modelica_metatype listReverse(modelica_metatype lst) { modelica_metatype res = NULL; if (MMC_NILTEST(lst) || MMC_NILTEST(MMC_CDR(lst))) { // 0/1 elements are already reversed return lst; } res = mmc_mk_nil(); do { res = mmc_mk_cons(MMC_CAR(lst),res); lst = MMC_CDR(lst); } while (!MMC_NILTEST(lst)); return res; }
modelica_metatype boxptr_listHead(threadData_t *threadData, modelica_metatype lst) { if (!MMC_NILTEST(lst)) { return MMC_CAR(lst); } MMC_THROW_INTERNAL(); }
modelica_metatype listAppend(modelica_metatype lst1,modelica_metatype lst2) { int length = 0, i = 0; struct mmc_cons_struct *res = NULL; struct mmc_cons_struct *p = NULL; if (MMC_NILTEST(lst2)) /* If lst2 is empty, simply return lst1; huge performance gain for some uses of listAppend */ return lst1; length = listLength(lst1); if (length == 0) /* We need to check for empty lst1 */ return lst2; res = (struct mmc_cons_struct*)mmc_alloc_words( length * 3 /*(sizeof(struct mmc_cons_struct)/sizeof(void*))*/ ); /* Do one single big alloc. It's cheaper */ for (i=0; i<length-1; i++) { /* Write all except the last element... */ struct mmc_cons_struct *p = res+i; p->header = MMC_STRUCTHDR(2, MMC_CONS_CTOR); p->data[0] = MMC_CAR(lst1); p->data[1] = MMC_TAGPTR(res+i+1); lst1 = MMC_CDR(lst1); } /* The last element is a bit special. It points to lst2. */ p = res+length-1; p->header = MMC_STRUCTHDR(2, MMC_CONS_CTOR); p->data[0] = MMC_CAR(lst1); p->data[1] = lst2; return MMC_TAGPTR(res); }
void boxptr_listSetFirst(threadData_t *threadData, modelica_metatype cellToDestroy, modelica_metatype newContent) { if (MMC_NILTEST(cellToDestroy)) { MMC_THROW_INTERNAL(); } MMC_CAR(cellToDestroy) = newContent; }
modelica_integer listLength(modelica_metatype lst) { modelica_integer res = 0; while (!MMC_NILTEST(lst)) { lst = MMC_CDR(lst); res++; } return res; }
modelica_boolean listMember(modelica_metatype obj, modelica_metatype lst) { while (!MMC_NILTEST(lst)) { if (valueEq(MMC_CAR(lst), obj)) { return 1; } lst = MMC_CDR(lst); } return 0; }
modelica_metatype listReverseInPlace(modelica_metatype lst) { modelica_metatype prev = mmc_mk_nil(); while (!MMC_NILTEST(lst)) { modelica_metatype oldcdr = MMC_CDR(lst); MMC_CDR(lst) = prev; prev = lst; lst = oldcdr; } return prev; }
modelica_metatype listReverse(modelica_metatype lst) { modelica_metatype res = NULL; res = mmc_mk_nil(); while (!MMC_NILTEST(lst)) { res = mmc_mk_cons(MMC_CAR(lst),res); lst = MMC_CDR(lst); } return res; }
modelica_metatype boxptr_listGet(threadData_t *threadData,modelica_metatype lst, modelica_metatype ii) { modelica_metatype res; int i = mmc_unbox_integer(ii); if (i < 1) MMC_THROW_INTERNAL(); while (!MMC_NILTEST(lst)) { if (i == 1) { return MMC_CAR(lst); } lst = MMC_CDR(lst); i--; } MMC_THROW_INTERNAL(); /* List was not long enough */ }