Esempio n. 1
0
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);
}
Esempio n. 2
0
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);

}
Esempio n. 3
0
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;
}
Esempio n. 4
0
void Config::setNode(const std::string& key, const OTMLNodePtr& node)
{
    remove(key);
    mergeNode(key, node);
}
Esempio n. 5
0
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;
	   }
	   */
}