static void rtree_test_main(SkRTree* rtree, skiatest::Reporter* reporter) { DataRect rects[NUM_RECTS]; SkRandom rand; REPORTER_ASSERT(reporter, NULL != rtree); int expectedDepthMin = -1; int expectedDepthMax = -1; int tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(MAX_CHILDREN), static_cast<double>(expectedDepthMin + 1))); ++expectedDepthMin; } tmp = NUM_RECTS; while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(MIN_CHILDREN), static_cast<double>(expectedDepthMax + 1))); ++expectedDepthMax; } for (size_t i = 0; i < NUM_ITERATIONS; ++i) { random_data_rects(rand, rects, NUM_RECTS); // First try bulk-loaded inserts for (int i = 0; i < NUM_RECTS; ++i) { rtree->insert(rects[i].data, rects[i].rect, true); } rtree->flushDeferredInserts(); run_queries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); // Then try immediate inserts for (int i = 0; i < NUM_RECTS; ++i) { rtree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); // And for good measure try immediate inserts, but in reversed order for (int i = NUM_RECTS - 1; i >= 0; --i) { rtree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *rtree); REPORTER_ASSERT(reporter, NUM_RECTS == rtree->getCount()); REPORTER_ASSERT(reporter, expectedDepthMin <= rtree->getDepth() && expectedDepthMax >= rtree->getDepth()); rtree->clear(); REPORTER_ASSERT(reporter, 0 == rtree->getCount()); } }
static void tree_test_main(SkBBoxHierarchy* tree, int minChildren, int maxChildren, skiatest::Reporter* reporter) { DataRect rects[NUM_RECTS]; SkRandom rand; REPORTER_ASSERT(reporter, NULL != tree); int expectedDepthMin = -1; int expectedDepthMax = -1; int tmp = NUM_RECTS; if (maxChildren > 0) { while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(maxChildren), static_cast<double>(expectedDepthMin + 1))); ++expectedDepthMin; } } tmp = NUM_RECTS; if (minChildren > 0) { while (tmp > 0) { tmp -= static_cast<int>(pow(static_cast<double>(minChildren), static_cast<double>(expectedDepthMax + 1))); ++expectedDepthMax; } } for (size_t i = 0; i < NUM_ITERATIONS; ++i) { random_data_rects(rand, rects, NUM_RECTS); // First try bulk-loaded inserts for (int i = 0; i < NUM_RECTS; ++i) { tree->insert(rects[i].data, rects[i].rect, true); } tree->flushDeferredInserts(); run_queries(reporter, rand, rects, *tree); REPORTER_ASSERT(reporter, NUM_RECTS == tree->getCount()); REPORTER_ASSERT(reporter, ((expectedDepthMin <= 0) || (expectedDepthMin <= tree->getDepth())) && ((expectedDepthMax <= 0) || (expectedDepthMax >= tree->getDepth()))); tree->clear(); REPORTER_ASSERT(reporter, 0 == tree->getCount()); // Then try immediate inserts for (int i = 0; i < NUM_RECTS; ++i) { tree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *tree); REPORTER_ASSERT(reporter, NUM_RECTS == tree->getCount()); REPORTER_ASSERT(reporter, ((expectedDepthMin <= 0) || (expectedDepthMin <= tree->getDepth())) && ((expectedDepthMax <= 0) || (expectedDepthMax >= tree->getDepth()))); tree->clear(); REPORTER_ASSERT(reporter, 0 == tree->getCount()); // And for good measure try immediate inserts, but in reversed order for (int i = NUM_RECTS - 1; i >= 0; --i) { tree->insert(rects[i].data, rects[i].rect); } run_queries(reporter, rand, rects, *tree); REPORTER_ASSERT(reporter, NUM_RECTS == tree->getCount()); REPORTER_ASSERT(reporter, ((expectedDepthMin < 0) || (expectedDepthMin <= tree->getDepth())) && ((expectedDepthMax < 0) || (expectedDepthMax >= tree->getDepth()))); tree->clear(); REPORTER_ASSERT(reporter, 0 == tree->getCount()); } }