void BTree::remove(int id) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "Remove: %d", id); BTreeElement *e = root; if (e == NULL) return; while (e->type == BTreeElement::ELEMENT_NODE) { e = ((BTreeNode*)e)->getSubNodeFor(id); if (e == NULL) return; } BTreeLeaf *leaf = ((BTreeLeaf*)e); int oldMinId = leaf->getMinId(); //__android_log_print(ANDROID_LOG_INFO, "Jello", "found leaf: %d", leaf->getMinId()); leaf->remove(id); //__android_log_print(ANDROID_LOG_INFO, "Jello", "pre merge"); mergeNode(leaf); // removeNode(leaf); }
void BTree::update(int id, RecordInfo *record) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "Update: %d", id); BTreeElement *e = root; if (e == NULL) return; while (e->type == BTreeElement::ELEMENT_NODE) { e = ((BTreeNode*)e)->getSubNodeFor(id); if (e == NULL) return; } BTreeLeaf *leaf = (BTreeLeaf*)e; if (!leaf->update(id, record)) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "update failed, splitting node"); BTreeLeaf *newLeaf = new BTreeLeaf(this, leafCapacity); int oldMinId = leaf->getMinId(); leaf->split(newLeaf); if (id < leaf->getMinId()) { if (!newLeaf->update(id, record)) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "Leaf add FAILED!"); return; } } else { if (!leaf->update(id, record)) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "Leaf add FAILED!"); return; } } if (leaf->getParent() == NULL) { BTreeNode *node = new BTreeNode(this, nodeCapacity); node->addChild(leaf->getMinId(), leaf); } addToNode(leaf->getParent(), newLeaf); } else mergeNode(leaf); }
Node* Tetgen::eraseNode(Node* er_nd) { int i,j,k; int n,nn; Tetra* itet; Node* pnd,* tmpnd; double lg; deque<double>lg_buff; deque<Node*>po_nd_buff; deque<double>::iterator it_d; deque<Node*>::iterator it_n; int flg; int type; int tp_flg = 0; int size = 0; //// printf("erase "); er_nd->view(); type = er_nd->getType(); if(type == 3) tp_flg = 0; else if(type == 2) tp_flg = 2; else if(type == 1) tp_flg = 1; else return NULL; printf("%5d\n",tp_flg); n = er_nd->getHangerSize(FG_TYPE_TET); for(i = 0; i < n; i++) { itet = (Tetra*)er_nd->getHanger(i,FG_TYPE_TET); for(j = 0; j < 4; j++) { pnd = itet->getNode(j); if(*pnd == *er_nd) continue; if(tp_flg == 1) { if(pnd->getType() == 2) continue; if(pnd->getType() == 3) continue; } else if(tp_flg == 2) if(pnd->getType() == 3) continue; flg = 0; nn = (int)po_nd_buff.size(); for(k = 0; k < nn; k++) { tmpnd = po_nd_buff[k]; if(*tmpnd == *pnd) { flg = 1; break; } } if(flg) continue; lg = getDistanceSquare(pnd,er_nd); for(k = 0; k < nn; k++) if(lg < lg_buff[k]) break; if(k == 0) { po_nd_buff.push_front(pnd); lg_buff.push_front(lg); } else if(k == nn) { po_nd_buff.push_back(pnd); lg_buff.push_back(lg); } else { it_n = po_nd_buff.begin() + k; po_nd_buff.insert(it_n,pnd); it_d = lg_buff.begin() + k; lg_buff.insert(it_d,lg); } } } printf("buf\n"); size = (int)po_nd_buff.size(); for(i = 0; i < size; i++) { po_nd_buff[i]->view(); printf("%f\n",lg_buff[i]); } /**/ getch(); //try merge in order of length n = (int)po_nd_buff.size(); for(i = 0; i < n; i++) { pnd = po_nd_buff[i]; pnd->view(); getch(); if(!mergeNode(pnd,er_nd)) continue; return pnd; } return NULL; }
void Config::setNode(const std::string& key, const OTMLNodePtr& node) { remove(key); mergeNode(key, node); }
void BTree::mergeNode(BTreeElement *node) { if (node->getCount() == 0) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "node %d is empty", node); if (node->getParent() != NULL) { node->getParent()->removeChild(node->getMinId()); mergeNode(node->getParent()); } else root = NULL; delete node; return; } if (node == root && node->getCount() == 1 && node->type == BTreeElement::ELEMENT_NODE) { root = ((BTreeNode*)node)->getSmallest(); root->setParent(NULL); delete node; return; } /* //__android_log_print(ANDROID_LOG_INFO, "Jello", "merge1 %d", node); if (node == root) { if (node->getCount() == 0) { root = NULL; delete node; return; } if (node->getCount() == 1 && node->type == BTreeElement::ELEMENT_NODE) { root = ((BTreeNode*)node)->getSmallest(); root->setParent(NULL); delete node; return; } return; } //__android_log_print(ANDROID_LOG_INFO, "Jello", "merge2 %d", node->getMinId()); BTreeElement *right = NULL; BTreeElement *left= NULL; ChildInfo *i = ((BTreeNode*)node->getParent())->getAVLTree()->findLeft(node->getMinId()); if (i != NULL) left = i->child; //__android_log_print(ANDROID_LOG_INFO, "Jello", "merge3 %d", i); i = ((BTreeNode*)node->getParent())->getAVLTree()->findRight(node->getMinId()); if (i != NULL) right = i->child; //__android_log_print(ANDROID_LOG_INFO, "Jello", "merge4"); if (left != NULL && left->getFreeSpace() + node->getFreeSpace() >= nodeCapacity) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "merging with left"); node->getParent()->removeChild(node->getMinId()); int oldMinId = left->getMinId(); left->join(node); node->getParent()->updateChild(oldMinId, left->getMinId()); if (node->getParent() != NULL) mergeNode(node->getParent()); delete node; return; } if (right != NULL && right->getFreeSpace() + node->getFreeSpace() >= nodeCapacity) { //__android_log_print(ANDROID_LOG_INFO, "Jello", "merging with right"); node->getParent()->removeChild(node->getMinId()); int oldMinId = right->getMinId(); right->join(node); node->getParent()->updateChild(oldMinId, right->getMinId()); if (node->getParent() != NULL) mergeNode(node->getParent()); delete node; return; } */ }