Merge branch 'master' into large_csv
This commit is contained in:
commit
fec6d11560
10 changed files with 90 additions and 46 deletions
|
@ -45,6 +45,7 @@ benchmarks = [
|
|||
"test_rendering_shared_map.cpp",
|
||||
"test_offset_converter.cpp",
|
||||
"test_marker_cache.cpp",
|
||||
"test_quad_tree.cpp",
|
||||
# "test_numeric_cast_vs_static_cast.cpp",
|
||||
]
|
||||
for cpp_test in benchmarks:
|
||||
|
|
|
@ -49,3 +49,11 @@ run test_offset_converter 10 1000
|
|||
--height 600 \
|
||||
--iterations 20 \
|
||||
--threads 10
|
||||
|
||||
./benchmark/out/test_quad_tree \
|
||||
--iterations 10000 \
|
||||
--threads 1
|
||||
|
||||
./benchmark/out/test_quad_tree \
|
||||
--iterations 10000 \
|
||||
--threads 10
|
||||
|
|
54
benchmark/test_quad_tree.cpp
Normal file
54
benchmark/test_quad_tree.cpp
Normal file
|
@ -0,0 +1,54 @@
|
|||
#include "bench_framework.hpp"
|
||||
#include <mapnik/quad_tree.hpp>
|
||||
#include <random>
|
||||
|
||||
using quad_tree_type = mapnik::quad_tree<std::size_t>;
|
||||
|
||||
class test : public benchmark::test_case
|
||||
{
|
||||
public:
|
||||
test(mapnik::parameters const& params)
|
||||
: test_case(params) {}
|
||||
|
||||
bool validate() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator()() const
|
||||
{
|
||||
std::random_device rd;
|
||||
std::default_random_engine engine(rd());
|
||||
std::uniform_int_distribution<int> uniform_dist(0, 2048);
|
||||
quad_tree_type tree(mapnik::box2d<double>(0,0,2048,2048));
|
||||
//populate
|
||||
for (size_t i = 0; i < iterations_; ++i)
|
||||
{
|
||||
int cx = uniform_dist(engine);
|
||||
int cy = uniform_dist(engine);
|
||||
int sx = 0.2 * uniform_dist(engine);
|
||||
int sy = 0.2 * uniform_dist(engine);
|
||||
mapnik::box2d<double> box(cx - sx,cy - sy, cx + sx, cy + sy);
|
||||
tree.insert(i, box);
|
||||
}
|
||||
// bounding box query
|
||||
std::size_t count=0;
|
||||
for (size_t i = 0; i < iterations_; ++i)
|
||||
{
|
||||
int cx = uniform_dist(engine);
|
||||
int cy = uniform_dist(engine);
|
||||
int sx = 0.4 * uniform_dist(engine);
|
||||
int sy = 0.4 * uniform_dist(engine);
|
||||
mapnik::box2d<double> box(cx - sx,cy - sy, cx + sx, cy + sy);
|
||||
auto itr = tree.query_in_box(box);
|
||||
auto end = tree.query_end();
|
||||
for ( ;itr != end; ++itr)
|
||||
{
|
||||
++count;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
BENCHMARK(test,"quad_tree creation")
|
|
@ -78,7 +78,7 @@ public:
|
|||
tree_t::query_iterator end = tree_.query_end();
|
||||
for ( ;itr != end; ++itr)
|
||||
{
|
||||
if (itr->intersects(box)) return false;
|
||||
if (itr->get().intersects(box)) return false;
|
||||
}
|
||||
tree_.insert(box,box);
|
||||
return true;
|
||||
|
@ -108,7 +108,7 @@ public:
|
|||
|
||||
for ( ;itr != end; ++itr)
|
||||
{
|
||||
if (itr->intersects(box)) return false;
|
||||
if (itr->get().intersects(box)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -155,7 +155,7 @@ public:
|
|||
|
||||
for ( ;itr != end; ++itr)
|
||||
{
|
||||
if (itr->box.intersects(box)) return false;
|
||||
if (itr->get().box.intersects(box)) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -173,7 +173,7 @@ public:
|
|||
|
||||
for (;itr != end; ++itr)
|
||||
{
|
||||
if (itr->box.intersects(margin_box))
|
||||
if (itr->get().box.intersects(margin_box))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ public:
|
|||
|
||||
for ( ;itr != end; ++itr)
|
||||
{
|
||||
if (itr->box.intersects(margin_box) || (text == itr->text && itr->box.intersects(repeat_box)))
|
||||
if (itr->get().box.intersects(margin_box) || (text == itr->get().text && itr->get().box.intersects(repeat_box)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -26,17 +26,7 @@
|
|||
// mapnik
|
||||
#include <mapnik/box2d.hpp>
|
||||
#include <mapnik/util/noncopyable.hpp>
|
||||
|
||||
// boost
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||
#pragma GCC diagnostic ignored "-Wunused-local-typedef"
|
||||
#pragma GCC diagnostic ignored "-Wshadow"
|
||||
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
||||
#pragma GCC diagnostic ignored "-Wconversion"
|
||||
#include <boost/ptr_container/ptr_vector.hpp>
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#include <mapnik/make_unique.hpp>
|
||||
// stl
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
@ -89,17 +79,16 @@ class quad_tree : util::noncopyable
|
|||
~node () {}
|
||||
};
|
||||
|
||||
using nodes_t = boost::ptr_vector<node>;
|
||||
using nodes_t = std::vector<std::unique_ptr<node> >;
|
||||
using cont_t = typename node::cont_t;
|
||||
using node_data_iterator = typename cont_t::iterator;
|
||||
|
||||
public:
|
||||
using iterator = typename nodes_t::iterator;
|
||||
using const_iterator = typename nodes_t::const_iterator;
|
||||
using result_t = typename boost::ptr_vector<T,boost::view_clone_allocator>;
|
||||
using result_t = typename std::vector<std::reference_wrapper<T> >;
|
||||
using query_iterator = typename result_t::iterator;
|
||||
|
||||
|
||||
explicit quad_tree(box2d<double> const& ext,
|
||||
unsigned int max_depth = 8,
|
||||
double ratio = 0.55)
|
||||
|
@ -108,8 +97,8 @@ public:
|
|||
query_result_(),
|
||||
nodes_()
|
||||
{
|
||||
nodes_.push_back(new node(ext));
|
||||
root_ = &nodes_[0];
|
||||
nodes_.push_back(std::make_unique<node>(ext));
|
||||
root_ = nodes_[0].get();
|
||||
}
|
||||
|
||||
void insert(T data, box2d<double> const& box)
|
||||
|
@ -121,7 +110,7 @@ public:
|
|||
query_iterator query_in_box(box2d<double> const& box)
|
||||
{
|
||||
query_result_.clear();
|
||||
query_node(box,query_result_,root_);
|
||||
query_node(box, query_result_, root_);
|
||||
return query_result_.begin();
|
||||
}
|
||||
|
||||
|
@ -145,8 +134,8 @@ public:
|
|||
{
|
||||
box2d<double> ext = root_->extent_;
|
||||
nodes_.clear();
|
||||
nodes_.push_back(new node(ext));
|
||||
root_ = &nodes_[0];
|
||||
nodes_.push_back(std::make_unique<node>(ext));
|
||||
root_ = nodes_[0].get();
|
||||
}
|
||||
|
||||
box2d<double> const& extent() const
|
||||
|
@ -163,12 +152,9 @@ private:
|
|||
box2d<double> const& node_extent = node_->extent();
|
||||
if (box.intersects(node_extent))
|
||||
{
|
||||
node_data_iterator i=node_->begin();
|
||||
node_data_iterator end=node_->end();
|
||||
while ( i!=end)
|
||||
for (auto & n : *node_)
|
||||
{
|
||||
result.push_back(&(*i));
|
||||
++i;
|
||||
result.push_back(std::ref(n));
|
||||
}
|
||||
for (int k = 0; k < 4; ++k)
|
||||
{
|
||||
|
@ -189,14 +175,14 @@ private:
|
|||
box2d<double> const& node_extent = n->extent();
|
||||
box2d<double> ext[4];
|
||||
split_box(node_extent,ext);
|
||||
for (int i=0;i<4;++i)
|
||||
for (int i = 0; i < 4; ++i)
|
||||
{
|
||||
if (ext[i].contains(box))
|
||||
{
|
||||
if (!n->children_[i])
|
||||
{
|
||||
nodes_.push_back(new node(ext[i]));
|
||||
n->children_[i]=&nodes_.back();
|
||||
nodes_.push_back(std::make_unique<node>(ext[i]));
|
||||
n->children_[i]=nodes_.back().get();
|
||||
}
|
||||
do_insert_data(data,box,n->children_[i],depth);
|
||||
return;
|
||||
|
@ -208,8 +194,6 @@ private:
|
|||
|
||||
void split_box(box2d<double> const& node_extent,box2d<double> * ext)
|
||||
{
|
||||
//coord2d c=node_extent.center();
|
||||
|
||||
double width=node_extent.width();
|
||||
double height=node_extent.height();
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#define MAPNIK_SVG_PARSER_HPP
|
||||
|
||||
// mapnik
|
||||
#include <mapnik/config.hpp>
|
||||
#include <mapnik/svg/svg_path_attributes.hpp>
|
||||
#include <mapnik/svg/svg_converter.hpp>
|
||||
#include <mapnik/svg/svg_path_adapter.hpp>
|
||||
|
@ -35,7 +36,7 @@
|
|||
|
||||
namespace mapnik { namespace svg {
|
||||
|
||||
class svg_parser : private util::noncopyable
|
||||
class MAPNIK_DECL svg_parser : private util::noncopyable
|
||||
{
|
||||
public:
|
||||
explicit svg_parser(svg_converter_type & path);
|
||||
|
|
|
@ -230,11 +230,9 @@ void agg_renderer<T0,T1>::process(debug_symbolizer const& sym,
|
|||
}
|
||||
else if (mode == DEBUG_SYM_MODE_COLLISION)
|
||||
{
|
||||
typename detector_type::query_iterator itr = common_.detector_->begin();
|
||||
typename detector_type::query_iterator end = common_.detector_->end();
|
||||
for ( ;itr!=end; ++itr)
|
||||
for (auto const& n : *common_.detector_)
|
||||
{
|
||||
draw_rect(pixmap_, itr->box);
|
||||
draw_rect(pixmap_, n.get().box);
|
||||
}
|
||||
}
|
||||
else if (mode == DEBUG_SYM_MODE_VERTEX)
|
||||
|
|
|
@ -106,11 +106,9 @@ void cairo_renderer<T>::process(debug_symbolizer const& sym,
|
|||
|
||||
if (mode == DEBUG_SYM_MODE_COLLISION)
|
||||
{
|
||||
typename detector_type::query_iterator itr = common_.detector_->begin();
|
||||
typename detector_type::query_iterator end = common_.detector_->end();
|
||||
for ( ;itr!=end; ++itr)
|
||||
for (auto & n : *common_.detector_)
|
||||
{
|
||||
render_debug_box(context_, itr->box);
|
||||
render_debug_box(context_, n.get().box);
|
||||
}
|
||||
}
|
||||
else if (mode == DEBUG_SYM_MODE_VERTEX)
|
||||
|
|
|
@ -219,11 +219,11 @@ void render_thunk_extractor::update_box() const
|
|||
{
|
||||
if (box_.width() > 0 && box_.height() > 0)
|
||||
{
|
||||
box_.expand_to_include(label.box);
|
||||
box_.expand_to_include(label.get().box);
|
||||
}
|
||||
else
|
||||
{
|
||||
box_ = label.box;
|
||||
box_ = label.get().box;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit bdbab20649674eec2c793b83dd05bbfb379321f8
|
||||
Subproject commit 9702e69c49b60ff49da4c48d1e33e54289b9c4b1
|
Loading…
Reference in a new issue