static int treeNodeTrim( treeNodeObj *node ) { int i; /* -------------------------------------------------------------------- */ /* Trim subtrees, and free subnodes that come back empty. */ /* -------------------------------------------------------------------- */ for(i=0; i<node->numsubnodes; i++ ) { if(treeNodeTrim(node->subnode[i])) { destroyTreeNode(node->subnode[i]); node->subnode[i] = node->subnode[node->numsubnodes-1]; node->numsubnodes--; i--; /* process the new occupant of this subnode entry */ } } if( node->numsubnodes == 1 && node->numshapes == 0 ) { node = node->subnode[0]; } /* if I only have 1 subnode promote that subnode to my positon */ /* -------------------------------------------------------------------- */ /* We should be trimmed if we have no subnodes, and no shapes. */ /* -------------------------------------------------------------------- */ return(node->numsubnodes == 0 && node->numshapes == 0); }
static int treeNodeTrim( treeNodeObj *node ) { int i; /* -------------------------------------------------------------------- */ /* Trim subtrees, and free subnodes that come back empty. */ /* -------------------------------------------------------------------- */ for(i=0; i<node->numsubnodes; i++ ) { if(treeNodeTrim(node->subnode[i])) { destroyTreeNode(node->subnode[i]); node->subnode[i] = node->subnode[node->numsubnodes-1]; node->numsubnodes--; i--; /* process the new occupant of this subnode entry */ } } /* -------------------------------------------------------------------- */ /* If the current node has 1 subnode and no shapes, promote that */ /* subnode to the current node position. */ /* -------------------------------------------------------------------- */ if( node->numsubnodes == 1 && node->numshapes == 0) { treeNodeObj* psSubNode = node->subnode[0]; memcpy(&node->rect, &psSubNode->rect, sizeof(psSubNode->rect)); node->numshapes = psSubNode->numshapes; assert(node->ids == NULL); node->ids = psSubNode->ids; node->numsubnodes = psSubNode->numsubnodes; for( i = 0; i < psSubNode->numsubnodes; i++ ) node->subnode[i] = psSubNode->subnode[i]; free(psSubNode); } /* -------------------------------------------------------------------- */ /* We should be trimmed if we have no subnodes, and no shapes. */ /* -------------------------------------------------------------------- */ return(node->numsubnodes == 0 && node->numshapes == 0); }
void msTreeTrim(treeObj *tree) { treeNodeTrim(tree->root); }