Esempio n. 1
0
Res SplayTreeDescribe(SplayTree splay, mps_lib_FILE *stream, Count depth,
                      TreeDescribeFunction nodeDescribe)
{
  Res res;

  if (!TESTT(SplayTree, splay))
    return ResFAIL;
  if (stream == NULL)
    return ResFAIL;
  if (nodeDescribe == NULL)
    return ResFAIL;

  res = WriteF(stream, depth,
               "Splay $P {\n", (WriteFP)splay,
               "  compare $F\n", (WriteFF)splay->compare,
               "  nodeKey $F\n", (WriteFF)splay->nodeKey,
               "  updateNode $F\n", (WriteFF)splay->updateNode,
               NULL);
  if (res != ResOK)
    return res;

  if (SplayTreeRoot(splay) != TreeEMPTY) {
    res = WriteF(stream, depth, "  tree ", NULL);
    if (res != ResOK)
      return res;
    res = SplayNodeDescribe(SplayTreeRoot(splay), stream, nodeDescribe);
    if (res != ResOK)
      return res;
  }

  res = WriteF(stream, depth, "\n} Splay $P\n", (WriteFP)splay, NULL);
  return res;
}
Esempio n. 2
0
static Res SplayNodeDescribe(Tree node, mps_lib_FILE *stream,
                             TreeDescribeFunction nodeDescribe)
{
  Res res;

  if (!TreeCheck(node))
    return ResFAIL;
  if (stream == NULL)
    return ResFAIL;
  if (nodeDescribe == NULL)
    return ResFAIL;

  res = WriteF(stream, 0, "( ", NULL);
  if (res != ResOK)
    return res;

  if (TreeHasLeft(node)) {
    res = SplayNodeDescribe(TreeLeft(node), stream, nodeDescribe);
    if (res != ResOK)
      return res;

    res = WriteF(stream, 0, " / ", NULL);
    if (res != ResOK)
      return res;
  }

  res = (*nodeDescribe)(node, stream);
  if (res != ResOK)
    return res;

  if (TreeHasRight(node)) {
    res = WriteF(stream, 0, " \\ ", NULL);
    if (res != ResOK)
      return res;

    res = SplayNodeDescribe(TreeRight(node), stream, nodeDescribe);
    if (res != ResOK)
      return res;
  }

  res = WriteF(stream, 0, " )", NULL);
  if (res != ResOK)
    return res;

  return ResOK;
}
static Res SplayNodeDescribe(SplayNode node, mps_lib_FILE *stream,
                             SplayNodeDescribeMethod nodeDescribe) {
    Res res;

#if defined(AVER_AND_CHECK)
    if (!SplayNodeCheck(node)) return ResFAIL;
    /* stream and nodeDescribe checked by SplayTreeDescribe */
#endif

    res = WriteF(stream, "( ", NULL);
    if (res != ResOK) return res;

    if (SplayNodeLeftChild(node) != NULL) {
        res = SplayNodeDescribe(SplayNodeLeftChild(node), stream, nodeDescribe);
        if (res != ResOK) return res;

        res = WriteF(stream, " / ", NULL);
        if (res != ResOK) return res;
    }

    res = (*nodeDescribe)(node, stream);
    if (res != ResOK) return res;

    if (SplayNodeRightChild(node) != NULL) {
        res = WriteF(stream, " \\ ", NULL);
        if (res != ResOK) return res;

        res = SplayNodeDescribe(SplayNodeRightChild(node), stream, nodeDescribe);
        if (res != ResOK) return res;
    }

    res = WriteF(stream, " )", NULL);
    if (res != ResOK) return res;

    return ResOK;
}
Res SplayTreeDescribe(SplayTree tree, mps_lib_FILE *stream,
                      SplayNodeDescribeMethod nodeDescribe) {
    Res res;

#if defined(AVER_AND_CHECK)
    if (!SplayTreeCheck(tree)) return ResFAIL;
    if (stream == NULL) return ResFAIL;
    if (!FUNCHECK(nodeDescribe)) return ResFAIL;
#endif

    res = WriteF(stream,
                 "Splay $P {\n", (WriteFP)tree,
                 "  compare $F\n", (WriteFF)tree->compare,
                 NULL);
    if (res != ResOK) return res;

    if (SplayTreeRoot(tree) != NULL) {
        res = SplayNodeDescribe(SplayTreeRoot(tree), stream, nodeDescribe);
        if (res != ResOK) return res;
    }

    res = WriteF(stream, "\n}\n", NULL);
    return res;
}