Hello Marco,
I looked at your bool_eval() prototype implementation and made some minor
adjustments:
- moved NOT, GUARD, XNOP handlers from the 3rd switch to the 2nd switch
statement to reduce the amount of tests in those cases.
- renamed some variables.
- removed a temporary variable.
- changed the stack pointer assignment expressions.
- changed 'idx' variable type.
Code below.
===
HIDDEN int
bool_eval(struct bit_tree *treep, struct partition *partp, struct resource
*resp)
/* Tree to evaluate */
/* Partition to evaluate */
/* XOR true (and overlap) return */
/* resource pointer for this CPU */
{
static int stack[BOOL_STACKSIZE*MAX_PSW];
int *sp;
int ret;
uint uop;
int idx;
sp = &stack[BOOL_STACKSIZE*resp->re_cpu];
*sp++ = INT_MAX;
idx = 0;
for (;;) {
for (;;) {
uop = treep[idx].val & 7;
switch (uop) {
case UOP_SOLID:
{
/* Tree Leaf */
register const uint st_bit = treep[idx].val >> 3;
register struct seg **segpp;
ret = 0;
for (BU_PTBL_FOR(segpp, (struct seg **), &partp->pt_seglist)) {
if ((*segpp)->seg_stp->st_bit == st_bit) {
ret = 1;
break;
}
}
}
break;
case UOP_UNION:
case UOP_INTERSECT:
case UOP_SUBTRACT:
case UOP_XOR:
*sp++ = idx;
idx++;
continue;
default:
bu_log("bool_eval: bad sp op [%d]\n", uop);
return BOOL_TRUE; /* screw up output */
}
break;
}
for (;;) {
idx = *--sp;
switch (idx) {
case INT_MAX:
return ret; /* top of tree again */
case -1:
/* Read values from tree_not */
/* Special operation for subtraction */
ret = !ret;
continue;
case -2:
/* Read values from tree_guard */
/*
* Special operation for XOR. lhs was true. If rhs
* subtree was true, an overlap condition exists (both
* sides of the XOR are BOOL_TRUE). Return error
* condition. If subtree is false, then return BOOL_TRUE
* (from lhs).
*/
if (ret) {
/* sped temp val: rhs */
return -1; /* GUARD error */
}
ret = BOOL_TRUE;
sp--; /* pop temp val */
continue;
case -3:
/* Read values from tree_xnop */
/*
* Special NOP for XOR. lhs was false. If rhs is true,
* take note of its regionp.
*/
sp--; /* pop temp val */
continue;
default:
break;
}
uop = treep[idx].val & 7;
/*
* Here, each operation will look at the operation just completed
* (the left branch of the tree generally), and rewrite the top of
* the sp and/or branch accordingly.
*/
switch (uop) {
case UOP_SOLID:
bu_log("bool_eval: pop SOLID?\n");
return BOOL_TRUE; /* screw up output */
case UOP_UNION:
if (ret) continue; /* BOOL_TRUE, we are done */
/* lhs was false, rewrite as rhs tree */
idx = treep[idx].val >> 3;
break;
case UOP_INTERSECT:
if (!ret) {
ret = BOOL_FALSE;
continue;
}
/* lhs was true, rewrite as rhs tree */
idx = treep[idx].val >> 3;
break;
case UOP_SUBTRACT:
if (!ret) continue; /* BOOL_FALSE, we are done */
/* lhs was true, rewrite as NOT of rhs tree */
/* We introduce the special NOT operator here */
*sp++ = -1;
idx = treep[idx].val >> 3;
break;
case UOP_XOR:
if (ret) {
/* lhs was true, rhs better not be, or we have an
* overlap condition. Rewrite as guard node followed
* by rhs.
*/
idx = treep[idx].val >> 3;
*sp++ = idx; /* temp val for guard node */
*sp++ = -2;
} else {
/* lhs was false, rewrite as xnop node and result of
* rhs.
*/
idx = treep[idx].val >> 3;
*sp++ = idx; /* temp val for xnop */
*sp++ = -3;
}
break;
default:
bu_log("bool_eval: bad pop op [%d]\n", uop);
return BOOL_TRUE; /* screw up output */
}
break;
}
}
/* NOTREACHED */
}
===
--
Vasco Alexandre da Silva Costa
PhD in Computer Engineering (Computer Graphics)
Instituto Superior Técnico/University of Lisbon, Portugal
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
BRL-CAD Developer mailing list
brlcad-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-devel