<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:arial,helvetica,sans-serif;font-size:10pt">kd_tree test passes now. 'make check' fails because I don't include CGM and dagmc uses CGM, so I use configure:<br>./configure --prefix=/home/rajeev/FATHOM/lib/MOAB/ --enable-debug --enable-shared<span style="font-weight: bold;"> --disable-dagmc</span><br><br>and all the 'make check' works fine. <br><br><font style="font-family: arial,helvetica,sans-serif;" size="2">Rajeev</font><br><div><br></div><div style="font-family: arial,helvetica,sans-serif; font-size: 10pt;"><br><div style="font-family: arial,helvetica,sans-serif; font-size: 10pt;"><font face="Tahoma" size="2"><hr size="1"><b><span style="font-weight: bold;">From:</span></b> "kraftche@cae.wisc.edu" &lt;kraftche@cae.wisc.edu&gt;<br><b><span style="font-weight: bold;">To:</span></b> moab-dev@mcs.anl.gov<br><b><span style="font-weight:
 bold;">Sent:</span></b> Tuesday, March 23, 2010 10:55:31<br><b><span style="font-weight: bold;">Subject:</span></b> [MOAB-dev] r3696 - MOAB/trunk/test<br></font><br>Author: kraftche<br>Date: 2010-03-23 10:55:31 -0500 (Tue, 23 Mar 2010)<br>New Revision: 3696<br><br>Modified:<br>&nbsp;  MOAB/trunk/test/kd_tree_test.cpp<br>Log:<br>clean up kd_tree_test<br><br>o use TestUtil.hpp to run tests and verify results<br>o split one large test function into individual tests<br>o don't test save/restore if no HDF5 support<br><br><br>Modified: MOAB/trunk/test/kd_tree_test.cpp<br>===================================================================<br>--- MOAB/trunk/test/kd_tree_test.cpp&nbsp;&nbsp;&nbsp; 2010-03-23 01:57:56 UTC (rev 3695)<br>+++ MOAB/trunk/test/kd_tree_test.cpp&nbsp;&nbsp;&nbsp; 2010-03-23 15:55:31 UTC (rev 3696)<br>@@ -1,156 +1,192 @@<br> #include "moab/Core.hpp"<br> #include "moab/AdaptiveKDTree.hpp"<br> #include "moab/Range.hpp"<br>+#include
 "moab/CartVect.hpp"<br> <br> #include &lt;math.h&gt;<br> #include &lt;assert.h&gt;<br> #include &lt;float.h&gt;<br> #include &lt;cstdio&gt;<br> <br>-#include "moab/CartVect.hpp"<br>+#include "TestUtil.hpp"<br> <br>-#include &lt;stdlib.h&gt;<br>-#ifdef NDEBUG<br>-#&nbsp; undef assert<br>-#&nbsp; define assert(A) do { if (!(A)) abort(); } while(false)<br>-#endif<br>-<br> using namespace moab;<br> <br> const unsigned INTERVALS = 4;<br> const unsigned DEPTH = 7; // 3*log2(INTERVALS)+1<br> const char* TAG_NAME = "TEST_DATA";<br> <br>-void test_iterator_back( AdaptiveKDTree&amp; tool, EntityHandle root );<br>-void test_point_search( AdaptiveKDTree&amp; tool, EntityHandle root );<br>+EntityHandle create_tree( AdaptiveKDTree&amp; tool, unsigned depth, int intervals, Tag* tag_handle = 0 );<br>+void validate_tree( AdaptiveKDTree&amp; tool, EntityHandle root, int depth, double intervals );<br> <br>+void test_tree_create();<br>+void test_leaf_merge();<br>+void
 test_tree_readwrite();<br>+void test_tree_delete();<br>+void test_iterator_back();<br>+void test_point_search();<br>+<br> int main()<br> {<br>-&nbsp; // Initialize MOAB &amp; create tree tool<br>-&nbsp; Core moab;<br>-&nbsp; AdaptiveKDTree tool(&amp;moab);<br>+&nbsp; int err = RUN_TEST(test_tree_create);<br>+&nbsp; if (err)&nbsp; // can't run other tests if can't create tree<br>+&nbsp; &nbsp; return 1;<br>+&nbsp; err += RUN_TEST(test_leaf_merge);<br>+#ifdef HDF5_FILE<br>+&nbsp; err += RUN_TEST(test_tree_readwrite);<br>+#endif<br>+&nbsp; err += RUN_TEST(test_tree_delete);<br>+&nbsp; err += RUN_TEST(test_iterator_back);<br>+&nbsp; err += RUN_TEST(test_point_search);<br>&nbsp;  <br>+&nbsp; return err;<br>+}<br>+<br>+EntityHandle create_tree( AdaptiveKDTree&amp; tool, unsigned depth, int intervals, Tag* tag_handle )<br>+{<br>&nbsp;  // Create tree root<br>&nbsp;  ErrorCode err;<br>&nbsp;  EntityHandle root, leaf;<br>&nbsp;  const double
 tree_box_min_corner[] = { 0, 0, 0 };&nbsp; <br>&nbsp; &nbsp;  // Make each leaf box be 1x1x1.<br>-&nbsp; const double tree_box_max_corner[] = { INTERVALS, INTERVALS, INTERVALS };<br>+&nbsp; const double tree_box_max_corner[] = { intervals, intervals, intervals };<br>&nbsp;  err = tool.create_tree( tree_box_min_corner, tree_box_max_corner, root );<br>&nbsp;  assert(!err);<br>&nbsp;  <br>&nbsp;  // Use iterator to create tree to fixed depth of DEPTH<br>&nbsp;  AdaptiveKDTreeIter iter;<br>&nbsp;  err = tool.get_tree_iterator( root, iter );<br>-&nbsp; assert(!err);<br>+&nbsp; CHECK_ERR(err);<br>&nbsp;  while(err == MB_SUCCESS) { <br>-&nbsp; &nbsp; if (iter.depth() &lt; DEPTH) {<br>+&nbsp; &nbsp; if (iter.depth() &lt; depth) {<br>&nbsp; &nbsp; &nbsp; &nbsp;  // bisect leaves along alternating axes<br>&nbsp; &nbsp; &nbsp;  AdaptiveKDTree::Plane split;<br>&nbsp; &nbsp; &nbsp;  split.norm = iter.depth() % 3;&nbsp; // alternate split axes;<br>&nbsp; &nbsp;
 &nbsp;  split.coord = 0.5 * (iter.box_min()[split.norm] + iter.box_max()[split.norm]);<br>&nbsp; &nbsp; &nbsp;  err = tool.split_leaf( iter, split ); // advances iter to first new leaf<br>-&nbsp; &nbsp; &nbsp; assert(!err);<br>+&nbsp; &nbsp; &nbsp; CHECK_ERR(err);<br>&nbsp; &nbsp;  }<br>&nbsp; &nbsp; &nbsp;  // if current leaf is at desired depth, advance to next one<br>&nbsp; &nbsp;  else {<br>&nbsp; &nbsp; &nbsp;  err = iter.step();<br>&nbsp; &nbsp;  }<br>&nbsp;  }<br>-&nbsp; assert(MB_ENTITY_NOT_FOUND == err);<br>+&nbsp; CHECK(MB_ENTITY_NOT_FOUND == err);<br>&nbsp;  <br>+&nbsp; if (!tag_handle)<br>+&nbsp; &nbsp; return root;<br>+&nbsp; <br>&nbsp;  // define a tag to use to store integer values on tree leaves<br>-&nbsp; Tag data;<br>-&nbsp; err = moab.tag_create( TAG_NAME, sizeof(int), MB_TAG_DENSE, MB_TYPE_INTEGER, data, 0, false );<br>-&nbsp; assert(!err);<br>+&nbsp; err = tool.moab()-&gt;tag_create( TAG_NAME, sizeof(int), MB_TAG_DENSE,
 MB_TYPE_INTEGER, *tag_handle, 0, false );<br>+&nbsp; CHECK_ERR(err);<br>+<br>+&nbsp; // iterate over tree setting data<br>+&nbsp; int counter = 0;<br>+&nbsp; for (err = tool.get_tree_iterator( root, iter ); !err; err = iter.step()) {<br>+&nbsp; &nbsp; // store integer value on leaf<br>+&nbsp; &nbsp; ++counter;<br>+&nbsp; &nbsp; leaf = iter.handle();<br>+&nbsp; &nbsp; err = tool.moab()-&gt;tag_set_data( *tag_handle, &amp;leaf, 1, &amp;counter );<br>+&nbsp; &nbsp; CHECK_ERR(err);<br>+&nbsp; }<br>&nbsp;  <br>-&nbsp; // iterate over tree, verifying leaves and setting data<br>+&nbsp; return root;<br>+}<br>+<br>+void validate_tree( AdaptiveKDTree&amp; tool, EntityHandle root, unsigned depth, int intervals, Tag data )<br>+{<br>+&nbsp; ErrorCode err;<br>+&nbsp; const double VOL = 1.0; // all leaves should be 1x1x1 boxes<br>+&nbsp; int val;<br>+<br>+&nbsp; // iterate over tree, verifying leaves <br>+&nbsp; AdaptiveKDTreeIter iter;<br>&nbsp;  int counter =
 0;<br>&nbsp;  for (err = tool.get_tree_iterator( root, iter ); !err; err = iter.step()) {<br>&nbsp; &nbsp;  // store integer value on leaf<br>&nbsp; &nbsp;  ++counter;<br>-&nbsp; &nbsp; leaf = iter.handle();<br>-&nbsp; &nbsp; err = moab.tag_set_data( data, &amp;leaf, 1, &amp;counter );<br>-&nbsp; &nbsp; assert(!err);<br>-&nbsp; &nbsp; &nbsp; <br>+&nbsp; &nbsp; EntityHandle leaf = iter.handle();<br>+&nbsp; &nbsp; CHECK(leaf != 0);<br>+&nbsp; &nbsp; CHECK_EQUAL(MBENTITYSET, TYPE_FROM_HANDLE(leaf));<br>+&nbsp; &nbsp;  <br>&nbsp; &nbsp;  // check size of leaf<br>&nbsp; &nbsp;  const double* min = iter.box_min();<br>&nbsp; &nbsp;  const double* max = iter.box_max();<br>&nbsp; &nbsp;  double dims[] = { max[0] - min[0], max[1] - min[1], max[2] - min[2] };<br>&nbsp; &nbsp;  double volume = dims[0] * dims[1] * dims[2];<br>-&nbsp; &nbsp; assert( fabs(volume - 1.0) &lt;= DBL_EPSILON );&nbsp; <br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( VOL, volume, DBL_EPSILON );&nbsp;
 <br>&nbsp; &nbsp; <br>&nbsp; &nbsp;  // check depth of leaf<br>-&nbsp; &nbsp; assert( iter.depth() == DEPTH );<br>+&nbsp; &nbsp; CHECK_EQUAL( depth, iter.depth() );<br>+&nbsp; &nbsp; <br>+&nbsp; &nbsp; // check tag value on leaf<br>+&nbsp; &nbsp; err = tool.moab()-&gt;tag_get_data( data, &amp;leaf, 1, &amp;val );<br>+&nbsp; &nbsp; CHECK_ERR(err);<br>+&nbsp; &nbsp; CHECK_EQUAL(counter, val);<br>&nbsp;  }<br>&nbsp; &nbsp;  // check number of leaves<br>-&nbsp; const int num_leaves = INTERVALS*INTERVALS*INTERVALS;<br>-&nbsp; assert( num_leaves == counter );<br>+&nbsp; const int num_leaves = intervals*intervals*intervals;<br>+&nbsp; CHECK_EQUAL( num_leaves, counter );<br>+}<br>+<br>+void test_tree_create()<br>+{<br>+&nbsp; Tag tag;<br>+&nbsp; Core mb;<br>+&nbsp; AdaptiveKDTree tool(&amp;mb);<br>+&nbsp; const EntityHandle root = create_tree( tool, DEPTH, INTERVALS, &amp;tag );<br>+&nbsp; validate_tree( tool, root, DEPTH, INTERVALS, tag );<br>+}<br>+<br>+void
 test_leaf_merge()<br>+{<br>+&nbsp; ErrorCode err;<br>+&nbsp; Core mb;<br>+&nbsp; AdaptiveKDTree tool(&amp;mb);<br>+&nbsp; Tag data;<br>+&nbsp; const EntityHandle root = create_tree( tool, DEPTH, INTERVALS, &amp;data );<br>&nbsp;  <br>-&nbsp; test_iterator_back( tool, root );<br>-&nbsp; test_point_search( tool, root );<br>-&nbsp; <br>&nbsp;  // reduce tree depth to DEPTH-1 by merging adjacent leaf pairs, <br>&nbsp;  // make new "leaf" have smaller of two data values on original pair<br>+&nbsp; AdaptiveKDTreeIter iter;<br>&nbsp;  for (err = tool.get_tree_iterator( root, iter ); !err; err = iter.step()) {<br>&nbsp; &nbsp;  // get data for first leaf<br>&nbsp; &nbsp;  int data1;<br>-&nbsp; &nbsp; leaf = iter.handle();<br>-&nbsp; &nbsp; err = moab.tag_get_data( data, &amp;leaf, 1, &amp;data1 );<br>-&nbsp; &nbsp; assert(!err);<br>+&nbsp; &nbsp; EntityHandle leaf = iter.handle();<br>+&nbsp; &nbsp; err = mb.tag_get_data( data, &amp;leaf, 1, &amp;data1
 );<br>+&nbsp; &nbsp; CHECK_ERR(err);<br>&nbsp; &nbsp;  // tree traversal is always such that two leaves with same parent are consective<br>&nbsp; &nbsp;  err = iter.step();<br>-&nbsp; &nbsp; assert(!err);<br>+&nbsp; &nbsp; CHECK_ERR(err);<br>&nbsp; &nbsp;  // get data for sibling<br>&nbsp; &nbsp;  int data2;<br>&nbsp; &nbsp;  leaf = iter.handle();<br>-&nbsp; &nbsp; err = moab.tag_get_data( data, &amp;leaf, 1, &amp;data2 );<br>-&nbsp; &nbsp; assert(!err);<br>+&nbsp; &nbsp; err = mb.tag_get_data( data, &amp;leaf, 1, &amp;data2 );<br>+&nbsp; &nbsp; CHECK_ERR(err);<br>&nbsp; &nbsp;  // as we stored increasing values, these had better be increasing<br>-&nbsp; &nbsp; assert( data2 - data1 == 1 );<br>+&nbsp; &nbsp; CHECK_EQUAL( 1, data2 - data1 );<br>&nbsp; &nbsp;  // merge leaf pair (iter can be at either one)<br>&nbsp; &nbsp;  err = tool.merge_leaf( iter );&nbsp; // changes iter to be new "merged" leaf<br>-&nbsp; &nbsp; assert(!err);<br>+&nbsp; &nbsp;
 CHECK_ERR(err);<br>&nbsp; &nbsp;  // store smaller of two values on new leaf<br>&nbsp; &nbsp;  leaf = iter.handle();<br>-&nbsp; &nbsp; err = moab.tag_set_data( data, &amp;leaf, 1, &amp;data1 );<br>-&nbsp; &nbsp; assert(!err);<br>+&nbsp; &nbsp; err = mb.tag_set_data( data, &amp;leaf, 1, &amp;data1 );<br>+&nbsp; &nbsp; CHECK_ERR(err);<br>&nbsp;  }<br>-&nbsp; <br>-&nbsp; // write to file<br>-&nbsp; err = moab.write_file( "tree.h5m" );<br>-&nbsp; assert(!err);<br> <br>-&nbsp; // clear everything<br>-&nbsp; moab.delete_mesh();<br>&nbsp;  <br>-&nbsp; // read tree from file<br>-&nbsp; err = moab.load_file( "tree.h5m" );<br>-&nbsp; assert(!err);<br>- <br>-&nbsp; // get tag handle by name, because the handle may have changed<br>-&nbsp; err = moab.tag_get_handle( TAG_NAME, data );<br>-&nbsp; assert(!err);<br>-<br>-&nbsp; // get root handle for tree<br>-&nbsp; Range range;<br>-&nbsp; err = tool.find_all_trees( range );<br>-&nbsp; assert(!err);<br>-&nbsp;
 assert(range.size() == 1);<br>-&nbsp; root = range.front(); // first (only) handle<br>-&nbsp; <br>&nbsp;  // Iterate over tree, verifying leaves and checking data<br>&nbsp;  // Initial leaves had volume of 1 : merged pairs of leaves so volume should now be 2.<br>&nbsp;  // Initial leaves were enumerated in order : merged pairs so new leaves should<br>&nbsp;  //&nbsp;  have data incrementing in steps of 2.<br>-&nbsp; counter = 1;<br>+&nbsp; int counter = 1;<br>&nbsp;  for (err = tool.get_tree_iterator( root, iter ); !err; err = iter.step()) {<br>&nbsp; &nbsp;  // store integer value on leaf<br>&nbsp; &nbsp;  int data1;<br>-&nbsp; &nbsp; leaf = iter.handle();<br>-&nbsp; &nbsp; err = moab.tag_get_data( data, &amp;leaf, 1, &amp;data1 );<br>-&nbsp; &nbsp; assert(!err);<br>-&nbsp; &nbsp; assert( counter == data1 );<br>+&nbsp; &nbsp; EntityHandle leaf = iter.handle();<br>+&nbsp; &nbsp; err = mb.tag_get_data( data, &amp;leaf, 1, &amp;data1 );<br>+&nbsp; &nbsp;
 CHECK_ERR(err);<br>+&nbsp; &nbsp; CHECK_EQUAL( counter, data1 );<br>&nbsp; &nbsp;  counter += 2;<br>&nbsp; &nbsp; &nbsp;  <br>&nbsp; &nbsp;  // check size of leaf<br>@@ -158,48 +194,73 @@<br>&nbsp; &nbsp;  const double* max = iter.box_max();<br>&nbsp; &nbsp;  double dims[] = { max[0] - min[0], max[1] - min[1], max[2] - min[2] };<br>&nbsp; &nbsp;  double volume = dims[0] * dims[1] * dims[2];<br>-&nbsp; &nbsp; assert( fabs(volume - 2.0) &lt;= DBL_EPSILON );&nbsp; <br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( 2.0, volume, DBL_EPSILON );&nbsp; <br>&nbsp; &nbsp;  <br>&nbsp; &nbsp;  // check depth of leaf<br>-&nbsp; &nbsp; assert( iter.depth() == DEPTH-1 );<br>+&nbsp; &nbsp; CHECK_EQUAL( DEPTH-1, iter.depth() );<br>&nbsp;  }<br>-&nbsp; &nbsp; // check number of leaves<br>-&nbsp; &nbsp; // (num_leaves is original number of leaves, twice current number,<br>-&nbsp; &nbsp; //&nbsp; but counter is incremented by 2 for each iteration, so just<br>-&nbsp; &nbsp; //&nbsp;
 compare them.)<br>-&nbsp; assert( counter-1 == num_leaves );<br>-&nbsp; <br>-&nbsp; <br>-&nbsp; &nbsp; // Delete data from tree<br>-&nbsp; err = moab.tag_delete( data );<br>-&nbsp; assert( !err );<br>+}<br> <br>+void test_tree_readwrite()<br>+{<br>+&nbsp; ErrorCode err;<br>+&nbsp; Tag tag;<br>+&nbsp; Core mb;<br>+&nbsp; AdaptiveKDTree tool(&amp;mb);<br>+&nbsp; EntityHandle root = create_tree( tool, DEPTH, INTERVALS, &amp;tag );<br>&nbsp;  <br>&nbsp;  // write to file<br>-&nbsp; err = moab.write_file( "tree.h5m" );<br>-&nbsp; assert(!err);<br>+&nbsp; err = mb.write_file( "tree.h5m" );<br>+&nbsp; CHECK_ERR(err);<br> <br>&nbsp;  // clear everything<br>-&nbsp; moab.delete_mesh();<br>+&nbsp; mb.delete_mesh();<br>&nbsp;  <br>&nbsp;  // read tree from file<br>-&nbsp; err = moab.load_file( "tree.h5m" );<br>+&nbsp; err = mb.load_file( "tree.h5m" );<br>+&nbsp; remove("tree.h5m");<br>+&nbsp; CHECK_ERR(err);<br>+ <br>+&nbsp; // get tag handle by name, because the
 handle may have changed<br>+&nbsp; err = mb.tag_get_handle( TAG_NAME, tag );<br>+&nbsp; CHECK_ERR(err);<br>+<br>+&nbsp; // get root handle for tree<br>+&nbsp; Range range;<br>+&nbsp; err = tool.find_all_trees( range );<br>&nbsp;  assert(!err);<br>+&nbsp; assert(range.size() == 1);<br>+&nbsp; root = range.front(); // first (only) handle<br>&nbsp;  <br>-&nbsp; // check that tag doesn't exist<br>-&nbsp; err = moab.tag_get_handle( TAG_NAME, data );<br>-&nbsp; assert( MB_TAG_NOT_FOUND == err );<br>+&nbsp; validate_tree( tool, root, DEPTH, INTERVALS, tag );<br>+}<br> <br>-&nbsp; remove( "tree.h5m" );<br>-&nbsp; return 0;<br>+void test_tree_delete()<br>+{<br>+&nbsp; ErrorCode err;<br>+&nbsp; Core mb;<br>+&nbsp; AdaptiveKDTree tool(&amp;mb);<br>+&nbsp; Tag data;<br>+&nbsp; const EntityHandle root = create_tree( tool, DEPTH, INTERVALS, &amp;data );<br>+&nbsp; <br>+&nbsp; err = tool.delete_tree( root );<br>+&nbsp; CHECK_ERR(err);<br>+&nbsp; <br>+&nbsp; Range
 ents;<br>+&nbsp; err = mb.get_entities_by_type_and_tag( 0, MBENTITYSET, &amp;data, 0, 1, ents );<br>+&nbsp; CHECK_ERR(err);<br>+&nbsp; CHECK(ents.empty());<br> }<br> <br>-<br>-void test_iterator_back( AdaptiveKDTree&amp; tool, EntityHandle root )<br>+void test_iterator_back( )<br> {<br>+&nbsp; Core mb;<br>+&nbsp; AdaptiveKDTree tool(&amp;mb);<br>+&nbsp; const EntityHandle root = create_tree( tool, DEPTH, INTERVALS );<br>+&nbsp; <br>&nbsp;  AdaptiveKDTreeIter iter;<br>&nbsp;  ErrorCode rval = tool.get_tree_iterator( root, iter );<br>-&nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; CHECK_ERR(rval);<br>&nbsp;  <br>&nbsp;  CartVect min( iter.box_min() );<br>&nbsp;  CartVect max( iter.box_max() );<br>@@ -207,14 +268,18 @@<br>&nbsp;  <br>&nbsp; &nbsp;  // going back from first location should fail.<br>&nbsp;  rval = iter.back();<br>-&nbsp; assert( MB_ENTITY_NOT_FOUND == rval );<br>+&nbsp; CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval );<br>&nbsp;  rval =
 tool.get_tree_iterator( root, iter );<br>-&nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; CHECK_ERR(rval);<br>&nbsp;  <br>&nbsp; &nbsp;  // make sure iterator is valid<br>-&nbsp; assert( iter.box_min()[0] == min[0] &amp;&amp; iter.box_min()[1] == min[1] &amp;&amp; iter.box_min()[2] == min[2] );<br>-&nbsp; assert( iter.box_max()[0] == max[0] &amp;&amp; iter.box_max()[1] == max[1] &amp;&amp; iter.box_max()[2] == max[2] );<br>-&nbsp; assert( iter.handle() == leaf );<br>+&nbsp; CHECK_REAL_EQUAL( min[0], iter.box_min()[0], DBL_EPSILON );<br>+&nbsp; CHECK_REAL_EQUAL( min[1], iter.box_min()[1], DBL_EPSILON );<br>+&nbsp; CHECK_REAL_EQUAL( min[2], iter.box_min()[2], DBL_EPSILON );<br>+&nbsp; CHECK_REAL_EQUAL( max[0], iter.box_max()[0], DBL_EPSILON );<br>+&nbsp; CHECK_REAL_EQUAL( max[1], iter.box_max()[1], DBL_EPSILON );<br>+&nbsp; CHECK_REAL_EQUAL( max[2], iter.box_max()[2], DBL_EPSILON );<br>+&nbsp; CHECK_EQUAL( leaf, iter.handle() );<br>&nbsp;  <br>&nbsp; 
 while (MB_SUCCESS == iter.step()) {<br>&nbsp; &nbsp; &nbsp;  // Get values at current iterator location<br>@@ -224,21 +289,29 @@<br>&nbsp;  <br>&nbsp; &nbsp; &nbsp;  // step back to previous location<br>&nbsp; &nbsp;  rval = iter.back();<br>-&nbsp; &nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; &nbsp; CHECK_ERR(rval);<br>&nbsp; &nbsp;  <br>&nbsp; &nbsp; &nbsp;  // check expected values for previous location<br>-&nbsp; &nbsp; assert( iter.box_min()[0] == min[0] &amp;&amp; iter.box_min()[1] == min[1] &amp;&amp; iter.box_min()[2] == min[2] );<br>-&nbsp; &nbsp; assert( iter.box_max()[0] == max[0] &amp;&amp; iter.box_max()[1] == max[1] &amp;&amp; iter.box_max()[2] == max[2] );<br>-&nbsp; &nbsp; assert( iter.handle() == leaf );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( min[0], iter.box_min()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( min[1], iter.box_min()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( min[2], iter.box_min()[2], DBL_EPSILON
 );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( max[0], iter.box_max()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( max[1], iter.box_max()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( max[2], iter.box_max()[2], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_EQUAL( leaf, iter.handle() );<br>&nbsp; &nbsp;  <br>&nbsp; &nbsp; &nbsp;  // advance iterator to 'current' location<br>&nbsp; &nbsp;  rval = iter.step();<br>-&nbsp; &nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; &nbsp; CHECK_ERR(rval);<br>&nbsp; &nbsp;  <br>&nbsp; &nbsp; &nbsp;  // check that iterator values are correct<br>-&nbsp; &nbsp; assert( iter.box_min()[0] == next_min[0] &amp;&amp; iter.box_min()[1] == next_min[1] &amp;&amp; iter.box_min()[2] == next_min[2] );<br>-&nbsp; &nbsp; assert( iter.box_max()[0] == next_max[0] &amp;&amp; iter.box_max()[1] == next_max[1] &amp;&amp; iter.box_max()[2] == next_max[2] );<br>-&nbsp; &nbsp; assert( iter.handle() == next_leaf );<br>+&nbsp; &nbsp;
 CHECK_REAL_EQUAL( next_min[0], iter.box_min()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( next_min[1], iter.box_min()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( next_min[2], iter.box_min()[2], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( next_max[0], iter.box_max()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( next_max[1], iter.box_max()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( next_max[2], iter.box_max()[2], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_EQUAL( next_leaf, iter.handle() );<br>&nbsp; &nbsp; <br>&nbsp; &nbsp; &nbsp;  // store values for next iteration<br>&nbsp; &nbsp;  min = next_min;<br>@@ -247,8 +320,12 @@<br>&nbsp;  }<br> }<br> <br>-void test_point_search( AdaptiveKDTree&amp; tool, EntityHandle root )<br>+void test_point_search()<br> {<br>+&nbsp; Core mb;<br>+&nbsp; AdaptiveKDTree tool(&amp;mb);<br>+&nbsp; const EntityHandle root = create_tree( tool, DEPTH, INTERVALS );<br>+&nbsp; <br>&nbsp; 
 ErrorCode rval;<br>&nbsp;  EntityHandle leaf;<br>&nbsp;  AdaptiveKDTreeIter iter, iter2;<br>@@ -259,56 +336,58 @@<br>&nbsp; <br>&nbsp; &nbsp;  // compare leaf search to iterator search<br>&nbsp;  rval = tool.leaf_containing_point( root, left.array(), leaf );<br>-&nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; CHECK_ERR(rval);<br>&nbsp;  rval = tool.leaf_containing_point( root, left.array(), iter );<br>-&nbsp; assert( MB_SUCCESS == rval );<br>-&nbsp; assert( iter.handle() == leaf );<br>+&nbsp; CHECK_ERR(rval);<br>+&nbsp; CHECK_EQUAL( leaf, iter.handle() );<br>&nbsp;  <br>&nbsp; &nbsp;  // iterator should be at 'first' leaf <br>&nbsp;  rval = tool.get_tree_iterator( root, iter2 );<br>-&nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; CHECK_ERR(rval);<br>&nbsp;  for (;;) {<br>-&nbsp; &nbsp; assert( iter.handle() == iter2.handle() );<br>-&nbsp; &nbsp; assert( iter.depth() == iter2.depth() );<br>-&nbsp; &nbsp; assert( iter.box_min()[0] == iter2.box_min()[0]
 );<br>-&nbsp; &nbsp; assert( iter.box_min()[1] == iter2.box_min()[1] );<br>-&nbsp; &nbsp; assert( iter.box_min()[2] == iter2.box_min()[2] );<br>-&nbsp; &nbsp; assert( iter.box_max()[0] == iter2.box_max()[0] );<br>-&nbsp; &nbsp; assert( iter.box_max()[1] == iter2.box_max()[1] );<br>-&nbsp; &nbsp; assert( iter.box_max()[2] == iter2.box_max()[2] );<br>+&nbsp; &nbsp; CHECK_EQUAL( iter.handle(), iter2.handle() );<br>+&nbsp; &nbsp; CHECK_EQUAL( iter.depth(), iter2.depth() );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_min()[0], iter2.box_min()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_min()[1], iter2.box_min()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_min()[2], iter2.box_min()[2], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_max()[0], iter2.box_max()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_max()[1], iter2.box_max()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL(
 iter.box_max()[2], iter2.box_max()[2], DBL_EPSILON );<br>&nbsp; &nbsp;  <br>&nbsp; &nbsp;  rval = iter2.step();<br>-&nbsp; &nbsp; if (MB_SUCCESS != rval)<br>+&nbsp; &nbsp; if (MB_ENTITY_NOT_FOUND == rval)<br>&nbsp; &nbsp; &nbsp;  break;<br>+&nbsp; &nbsp; CHECK_ERR(rval);<br>&nbsp; &nbsp;  rval = iter.step();<br>-&nbsp; &nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; &nbsp; CHECK_ERR(rval);<br>&nbsp;  }<br>&nbsp;  <br>&nbsp; &nbsp;  // compare leaf search to iterator search<br>&nbsp;  rval = tool.leaf_containing_point( root, right.array(), leaf );<br>-&nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; CHECK_ERR(rval);<br>&nbsp;  rval = tool.leaf_containing_point( root, right.array(), iter );<br>-&nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; CHECK_ERR(rval);<br>&nbsp;  assert( iter.handle() == leaf );<br>&nbsp;  <br>&nbsp; &nbsp;  // iterator should be at 'last' leaf <br>&nbsp;  rval = tool.get_last_iterator( root, iter2 );<br>-&nbsp; assert( MB_SUCCESS ==
 rval );<br>+&nbsp; CHECK_ERR(rval);<br>&nbsp;  for (;;) {<br>-&nbsp; &nbsp; assert( iter.handle() == iter2.handle() );<br>-&nbsp; &nbsp; assert( iter.depth() == iter2.depth() );<br>-&nbsp; &nbsp; assert( iter.box_min()[0] == iter2.box_min()[0] );<br>-&nbsp; &nbsp; assert( iter.box_min()[1] == iter2.box_min()[1] );<br>-&nbsp; &nbsp; assert( iter.box_min()[2] == iter2.box_min()[2] );<br>-&nbsp; &nbsp; assert( iter.box_max()[0] == iter2.box_max()[0] );<br>-&nbsp; &nbsp; assert( iter.box_max()[1] == iter2.box_max()[1] );<br>-&nbsp; &nbsp; assert( iter.box_max()[2] == iter2.box_max()[2] );<br>+&nbsp; &nbsp; CHECK_EQUAL( iter.handle(), iter2.handle() );<br>+&nbsp; &nbsp; CHECK_EQUAL( iter.depth(), iter2.depth() );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_min()[0], iter2.box_min()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_min()[1], iter2.box_min()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_min()[2],
 iter2.box_min()[2], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_max()[0], iter2.box_max()[0], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_max()[1], iter2.box_max()[1], DBL_EPSILON );<br>+&nbsp; &nbsp; CHECK_REAL_EQUAL( iter.box_max()[2], iter2.box_max()[2], DBL_EPSILON );<br>&nbsp; &nbsp;  <br>&nbsp; &nbsp;  rval = iter2.back();<br>-&nbsp; &nbsp; if (MB_SUCCESS != rval)<br>+&nbsp; &nbsp; if (MB_ENTITY_NOT_FOUND == rval)<br>&nbsp; &nbsp; &nbsp;  break;<br>+&nbsp; &nbsp; CHECK_ERR(rval);<br>&nbsp; &nbsp;  rval = iter.back();<br>-&nbsp; &nbsp; assert( MB_SUCCESS == rval );<br>+&nbsp; &nbsp; CHECK_ERR(rval);<br>&nbsp;  }<br> }<br> <br><br></div></div>
</div><br>
      <hr size=1> <a href="http://sg.rd.yahoo.com/aa/mail/domainchoice/mail/signature/*http://mail.promotions.yahoo.com/newdomains/aa/"> New Email names for you! </a> <br>
Get the Email name you&#39;ve always wanted on the new @ymail and @rocketmail.<br>
Hurry before someone else does!</body></html>