예제 #1
0
template <class D> AVL_RES avl_tree<D>::internal_remove(avl_node<D> **node,D *data)
{
  AVL_RES result=AVL_BALANCE;
  if(!(*node)) return AVL_ERROR;
  long diff=compare(*node,data);
  if(diff<0)
  {
    if((result=internal_remove(&(*node)->left,data))==AVL_BALANCE)
    {
      return leftshrunk(node);
    }
    return result;
  }
  if(diff>0)
  {
    if((result=internal_remove(&(*node)->right,data))==AVL_BALANCE)
    {
      return rightshrunk(node);
    }
    return result;
  }
  node_count--;
  if((*node)->left)
  {
    if(findhighest(*node,&((*node)->left),&result))
    {
      if(result==AVL_BALANCE)
      {
        result=leftshrunk(node);
      }
      return result;
    }
  }
  if((*node)->right)
  {
    if(findlowest(*node,&((*node)->right),&result))
    {
      if(result==AVL_BALANCE)
      {
        result=rightshrunk(node);
      }
      return result;
    }
  }
  delete *node;
  *node=NULL;
  return AVL_BALANCE;
}
예제 #2
0
void Samurai::IO::Net::SocketMonitor::remove(Samurai::IO::Net::SocketBase* socket)
{
	if (!socket || (int) socket->sd == (int) INVALID_SOCKET)
	{
		return;
	}
	internal_remove(socket);
}
예제 #3
0
void World::flush()
{
	for (s32 i = 0; i < remove_buffer.length; i++)
		internal_remove(&Entity::list[remove_buffer[i]]);
	remove_buffer.length = 0;
}
예제 #4
0
void World::remove(Entity* e)
{
	b8 actually_removed = internal_remove(e);
	vi_assert(actually_removed);
}
예제 #5
0
template <class D> void avl_tree<D>::remove(D *data)
{
  internal_remove(&root,data);
}
예제 #6
0
파일: entity.cpp 프로젝트: etodd/yearning
void World::remove(Entity* e)
{
	vi_assert(Game::level.local); // if we're a client, all entity removals are handled by the server
	b8 actually_removed = internal_remove(e);
	vi_assert(actually_removed);
}