@@ -42,10 +42,12 @@
42 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
43 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int idx; /* Row index. First is 1. 0 used for "none" */
44 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int idxTop; /* Direct descendent highest up on the graph */
45 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
GraphRow *pChild; /* Child immediately above this node */
46 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 isDup; /* True if this is duplicate of a prior entry */
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 isLeaf; /* True if this is a leaf node */
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 timeWarp; /* Child is earlier in time */
47 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 bDescender; /* True if riser from bottom of graph to here. */
48 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i8 iRail; /* Which rail this check-in appears on. 0-based.*/
49 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i8 mergeOut; /* Merge out to this rail. -1 if no merge-out */
50 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 mergeIn[GR_MAX_RAIL]; /* Merge in from non-zero rails */
51 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int aiRiser[GR_MAX_RAIL]; /* Risers from this node to a higher row. */
@@ -163,11 +165,12 @@
163 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
GraphContext *p, /* The context to which the row is added */
164 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rid, /* RID for the check-in */
165 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nParent, /* Number of parents */
166 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *aParent, /* Array of parents */
167 169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBranch, /* Branch for this check-in */
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zBgClr /* Background color. NULL or "" for white. */
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zBgClr, /* Background color. NULL or "" for white. */
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isLeaf /* True if this row is a leaf */
169 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
170 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
GraphRow *pRow;
171 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nByte;
172 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
173 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->nErr ) return 0;
@@ -176,10 +179,12 @@
176 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow = (GraphRow*)safeMalloc( nByte );
177 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->aParent = (int*)&pRow[1];
178 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->rid = rid;
179 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->nParent = nParent;
180 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->zBranch = persistBranchName(p, zBranch);
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRow->isLeaf = isLeaf;
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pRow->aiRiser, -1, sizeof(pRow->aiRiser));
181 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zBgClr==0 || zBgClr[0]==0 ) zBgClr = "white";
182 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->zBgClr = persistBranchName(p, zBgClr);
183 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(pRow->aParent, aParent, sizeof(aParent[0])*nParent);
184 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->pFirst==0 ){
185 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pFirst = pRow;
@@ -224,10 +229,11 @@
224 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iBest = i;
225 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
226 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
227 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
228 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iBestDist>1000 ) p->nErr++;
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iBest>p->mxRail ) p->mxRail = iBest;
229 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return iBest;
230 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
231 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
232 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
233 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Assign all children of node pBottom to the same rail as pBottom.
@@ -356,11 +362,14 @@
356 362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRow->isDup ) continue;
357 363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRow->nParent==0 ) continue; /* Root node */
358 364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParent = hashFind(p, pRow->aParent[0]);
359 365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pParent==0 ) continue; /* Parent off-screen */
360 366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pParent->zBranch!=pRow->zBranch ) continue; /* Different branch */
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pParent->idx <= pRow->idx ) continue; /* Time-warp */
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pParent->idx <= pRow->idx ){
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParent->timeWarp = 1;
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continue; /* Time-warp */
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
362 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRow->idxTop < pParent->idxTop ){
363 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParent->pChild = pRow;
364 373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParent->idxTop = pRow->idxTop;
365 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
366 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -401,11 +410,21 @@
401 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
inUse = (1<<(p->mxRail+1))-1;
402 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(pRow=p->pLast; pRow; pRow=pRow->pPrev){
403 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int parentRid;
404 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
405 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRow->iRail>=0 ){
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pRow->pChild==0 ) inUse &= ~(1<<pRow->iRail);
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pRow->pChild==0 && !pRow->timeWarp ){
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pRow->isLeaf || omitDescenders ){
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inUse &= ~(1<<pRow->iRail);
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRow->aiRiser[pRow->iRail] = 0;
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask = 1<<pRow->iRail;
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pLoop=pRow; pLoop; pLoop=pLoop->pPrev){
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pLoop->railInUse |= mask;
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
407 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
408 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
409 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRow->isDup ){
410 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->iRail = findFreeRail(p, pRow->idx, pRow->idx, inUse, 0);
411 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pDesc = pRow;
@@ -431,10 +450,11 @@
431 450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iDownRail<1 ) iDownRail = ++p->mxRail;
432 451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->iRail = ++p->mxRail;
433 452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRow->railInUse = 1<<pRow->iRail;
434 453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParent->aiRiser[iDownRail] = pRow->idx;
435 454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mask = 1<<iDownRail;
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inUse |= mask;
436 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(pLoop=p->pFirst; pLoop; pLoop=pLoop->pNext){
437 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pLoop->railInUse |= mask;
438 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
439 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
440 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
441 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!