示例#1
0
文件: tree.c 项目: aberg001/antimony
MathTree* clone_tree(MathTree* orig)
{
    MathTree* clone = new_tree(orig->num_levels, orig->num_constants);

    // Clone the constants into the new tree.
    for (int c=0; c < orig->num_constants; ++c) {
        clone->constants[c] = clone_node(orig->constants[c]);
    }

    // Then clone all of the nodes into the new tree:

    // Iterate over levels
    for (int level=0; level < orig->num_levels; ++level) {

        int active = orig->active[level];
        clone->active[level] = active;
        if (active) {
            clone->nodes[level] = malloc(sizeof(Node*)*active);
        } else {
            clone->nodes[level] = NULL;
        }

        // Clone each node in this level and opcode.
        for (int n=0; n < active; ++n) {
            Node* clone_ = clone_node(orig->nodes[level][n]);
            clone->nodes[level][n] = clone_;
        }
    }

    clone->head = orig->head->clone_address;
    return clone;
}
示例#2
0
static off_t n_set_right(brtr_t *b, off_t r, off_t ptr)
/* sets right branch and balances node, creating new ones */
{
    off_t nr;
    struct brtr_node *n, *m;

    n = brtr_node(b, r);
    m = brtr_node(b, ptr);

    if (m && m->c > (n->c / 2) + 1) {
        off_t nrr;

        /* do the rotation */
        nrr = clone_node(b, n, n->left, m->left);
        nr  = clone_node(b, m, nrr,     m->right);

        brtr_free(b, ptr);
    }
    else {
        nr = clone_node(b, n, n->left, ptr);
    }

    brtr_free(b, r);

    return nr;
}
示例#3
0
 static tst_node*
 clone_node(tst_node* p, Alloc* alloc)
 {
     if (p)
     {
         tst_node* clone = alloc->new_node(p->id);
         if (p->data)
             clone->data = alloc->new_data(*p->data);
         clone->lt = clone_node(p->lt, alloc);
         clone->eq = clone_node(p->eq, alloc);
         clone->gt = clone_node(p->gt, alloc);
         return clone;
     }
     return 0;
 }
示例#4
0
 UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
     if (node == NULL) return NULL;
     UndirectedGraphNode *cn = NULL;
     unordered_map<int, UndirectedGraphNode*> um;
     clone_node(node, cn, um);
     return cn;
 }
示例#5
0
 void clone_node(UndirectedGraphNode *&p, UndirectedGraphNode *&q, unordered_map<int, UndirectedGraphNode*> &um) {
     q = new UndirectedGraphNode(p->label);
     um[p->label] = q;
     for (int i = 0; i < p->neighbors.size(); i++) {
         int label = p->neighbors[i]->label;
         if (um.find(label) != um.end()) {
             q->neighbors.push_back(um[label]);
         } else {
             UndirectedGraphNode *cn;
             clone_node(p->neighbors[i], cn, um);
             q->neighbors.push_back(cn);
         }
     }
 }
示例#6
0
hubbub_error clone_node(void *ctx, void *node, bool deep, void **result)
{
    node_t *old_node = node;
    node_t *new_node = calloc(1, sizeof *new_node);
    node_t *last;
    node_t *child;
    size_t i;

    new_node->type = old_node->type;

    switch (old_node->type) {
    case DOCTYPE:
        new_node->data.doctype.name =
            strdup(old_node->data.doctype.name);
        if (old_node->data.doctype.public_id)
            new_node->data.doctype.public_id =
                strdup(old_node->data.doctype.public_id);
        if (old_node->data.doctype.system_id)
            new_node->data.doctype.system_id =
                strdup(old_node->data.doctype.system_id);
        break;
    case COMMENT:
    case CHARACTER:
        new_node->data.content = strdup(old_node->data.content);
        break;
    case ELEMENT:
        new_node->data.element.ns = old_node->data.element.ns;
        new_node->data.element.name =
            strdup(old_node->data.element.name);
        new_node->data.element.attrs =
            calloc(old_node->data.element.n_attrs,
                   sizeof *new_node->data.element.attrs);
        for (i = 0; i < old_node->data.element.n_attrs; i++) {
            attr_t *attr = &new_node->data.element.attrs[i];

            attr->ns = old_node->data.element.attrs[i].ns;
            attr->name =
                strdup(old_node->data.element.attrs[i].name);
            attr->value =
                strdup(old_node->data.element.attrs[i].value);
        }
        new_node->data.element.n_attrs = old_node->data.element.n_attrs;
        break;
    }

    *result = new_node;

    new_node->child = new_node->parent =
                          new_node->next = new_node->prev =
                                  NULL;

    new_node->refcnt = 1;

    if (deep == false)
        return 0;

    last = NULL;

    for (child = old_node->child; child != NULL;
            child = child->next) {
        node_t *n;

        clone_node(ctx, child, true, (void **) (void *) &n);

        n->refcnt = 0;

        if (last == NULL) {
            new_node->child = n;
        } else {
            last->next = n;
            n->prev = last;
        }

        n->parent = new_node;
        last = n;
    }

    return HUBBUB_OK;
}