コード例 #1
0
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;
}
コード例 #2
0
modelica_metatype boxptr_listHead(threadData_t *threadData, modelica_metatype lst)
{
  if (!MMC_NILTEST(lst)) {
    return MMC_CAR(lst);
  }
  MMC_THROW_INTERNAL();
}
コード例 #3
0
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);
}
コード例 #4
0
void boxptr_listSetFirst(threadData_t *threadData, modelica_metatype cellToDestroy, modelica_metatype newContent)
{
    if (MMC_NILTEST(cellToDestroy)) {
        MMC_THROW_INTERNAL();
    }
    MMC_CAR(cellToDestroy) = newContent;
}
コード例 #5
0
modelica_integer listLength(modelica_metatype lst)
{
  modelica_integer res = 0;
  while (!MMC_NILTEST(lst))
  {
    lst = MMC_CDR(lst);
    res++;
  }
  return res;
}
コード例 #6
0
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;
}
コード例 #7
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;
}
コード例 #8
0
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;
}
コード例 #9
0
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 */
}