[GRASS-SVN] r38696 - grass/trunk/lib/vector/diglib
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed Aug 12 01:58:31 EDT 2009
Author: mmetz
Date: 2009-08-12 01:58:31 -0400 (Wed, 12 Aug 2009)
New Revision: 38696
Modified:
grass/trunk/lib/vector/diglib/spindex_rw.c
Log:
more comments in sidx IO routines
Modified: grass/trunk/lib/vector/diglib/spindex_rw.c
===================================================================
--- grass/trunk/lib/vector/diglib/spindex_rw.c 2009-08-11 15:05:22 UTC (rev 38695)
+++ grass/trunk/lib/vector/diglib/spindex_rw.c 2009-08-12 05:58:31 UTC (rev 38696)
@@ -607,7 +607,7 @@
int i, j, writeout;
struct spidxstack
{
- off_t pos[MAXCARD]; /* file position of child node */
+ off_t pos[MAXCARD]; /* file position of child node, object ID on level 0 */
struct Node *sn; /* stack node */
int branch_id; /* branch no to follow down */
} s[50];
@@ -617,20 +617,27 @@
sidx_nodesize =
(int)(2 * PORT_INT + MAXCARD * (off_t_size + NUMSIDES * PORT_DOUBLE));
- /* stack size of t->n_levels + 1 would be enough because of depth first search */
- /* only one node per level on stack at any given time */
+ /* stack size of t->n_levels + 1 would be enough because of
+ * depth-first post-order traversal:
+ * only one node per level on stack at any given time */
/* add root node position to stack */
s[top].branch_id = i = 0;
s[top].sn = t->root;
- /* some sort of postorder traversal */
- /* root node is written out last */
+ /* some sort of postorder traversal
+ * all children of a node are visitied and written out first
+ * when a child is written out, its position in file is stored in pos[] for
+ * the parent node and written out with the parent node */
+ /* root node is written out last and its position returned */
while (top >= 0) {
n = s[top].sn;
writeout = 1;
- if (s[top].sn->level > 0) { /* this is an internal node in the tree */
+ /* this is an internal node in the RTree
+ * all its children are processed first,
+ * before it is written out to the sidx file */
+ if (s[top].sn->level > 0) {
for (i = s[top].branch_id; i < t->nodecard; i++) {
s[top].pos[i] = 0;
if (n->branch[i].child.ptr != NULL) {
@@ -657,13 +664,18 @@
for (j = 0; j < MAXCARD; j++) {
dig__fwrite_port_D(s[top].sn->branch[j].rect.boundary,
NUMSIDES, fp);
- if (s[top].sn->level == 0) /* leaf node */
+ /* leaf node: vector object IDs are stored in child.id */
+ if (s[top].sn->level == 0)
s[top].pos[j] = (off_t) s[top].sn->branch[j].child.id;
dig__fwrite_port_O(&(s[top].pos[j]), 1, fp, off_t_size);
}
top--;
- /* update child pos of parent node */
+ /* update corresponding child position of parent node
+ * this node is only updated if its level is > 0, i.e.
+ * this is an internal node
+ * children of internal nodes do not have an ID, instead
+ * they hold the position in file of the next nodes down the tree */
if (top >= 0) {
s[top].pos[s[top].branch_id - 1] = nextfreepos;
nextfreepos += sidx_nodesize;
@@ -702,8 +714,9 @@
} s[50], *last;
int top = 0;
- /* stack size of t->n_levels + 1 would be enough because of depth first search */
- /* only one node per level on stack at any given time */
+ /* stack size of t->n_levels + 1 would be enough because of
+ * depth-first post-order traversal:
+ * only one node per level on stack at any given time */
/* add root node position to stack */
last = &(s[top]);
@@ -714,8 +727,9 @@
for (j = 0; j < MAXCARD; j++) {
dig__fread_port_D(s[top].sn.branch[j].rect.boundary, NUMSIDES, fp);
dig__fread_port_O(&(s[top].childpos[j]), 1, fp, off_t_size);
+ /* leaf node: vector object IDs are stored in child.id */
if (s[top].sn.level == 0) {
- if (s[top].childpos[j]) { /* leaf node */
+ if (s[top].childpos[j]) {
s[top].sn.branch[j].child.id =
(int)s[top].childpos[j];
}
@@ -730,12 +744,15 @@
s[top].branch_id = i = 0;
/* some sort of postorder traversal */
- /* root node is written out last */
+ /* root node is loaded last and returned */
while (top >= 0) {
last = &(s[top]);
loadnode = 1;
- if (s[top].sn.level > 0) { /* this is an internal node in the tree */
+ /* this is an internal node in the RTree
+ * all its children are read first,
+ * before it is transfered to the RTree in memory */
+ if (s[top].sn.level > 0) {
for (i = s[top].branch_id; i < t->nodecard; i++) {
if (s[top].childpos[i] > 0) {
s[top++].branch_id = i + 1;
@@ -749,8 +766,12 @@
NUMSIDES, fp);
dig__fread_port_O(&(s[top].childpos[j]), 1, fp,
off_t_size);
+ /* leaf node
+ * vector object IDs are stored in file as
+ * off_t but always fit into an int, see dig_structs.h
+ * vector object IDs are transfered to child.id */
if (s[top].sn.level == 0) {
- if (s[top].childpos[j]) { /* leaf node */
+ if (s[top].childpos[j]) {
s[top].sn.branch[j].child.id =
(int)s[top].childpos[j];
}
@@ -774,7 +795,7 @@
}
}
if (loadnode) {
- /* not writeout but load node to memory */
+ /* ready to load node to memory */
newnode = RTreeNewNode(t, s[top].sn.level);
/* copy from stack node */
@@ -786,7 +807,11 @@
}
top--;
- /* update child of parent node */
+ /* update child of parent node
+ * this node is only updated if its level is > 0, i.e.
+ * this is an internal node
+ * children of internal nodes do not have an ID, instead
+ * they point to the next nodes down the tree */
if (top >= 0) {
s[top].sn.branch[s[top].branch_id - 1].child.ptr = newnode;
}
More information about the grass-commit
mailing list