added set_capacity method to geometry classes.

(now we can use std::vector<boost::tuple<value_type,value_type,char> > 
as an alternative vertex storage).
This commit is contained in:
Artem Pavlenko 2006-02-05 12:31:24 +00:00
parent 2a858bcd19
commit 2d4ea20560
3 changed files with 34 additions and 17 deletions

View file

@ -62,6 +62,7 @@ namespace mapnik
virtual unsigned num_points() const = 0; virtual unsigned num_points() const = 0;
virtual unsigned vertex(double* x, double* y)=0; virtual unsigned vertex(double* x, double* y)=0;
virtual void rewind(unsigned )=0; virtual void rewind(unsigned )=0;
virtual void set_capacity(size_t size)=0;
virtual ~geometry() {} virtual ~geometry() {}
}; };
@ -120,6 +121,7 @@ namespace mapnik
{ {
return false; return false;
} }
void set_capacity(size_t) {}
virtual ~point() {} virtual ~point() {}
}; };
@ -216,6 +218,10 @@ namespace mapnik
{ {
return false; return false;
} }
void set_capacity(size_t size)
{
cont_.set_capacity(size);
}
virtual ~polygon() {} virtual ~polygon() {}
}; };
@ -332,12 +338,17 @@ namespace mapnik
{ {
return false; return false;
} }
void set_capacity(size_t size)
{
cont_.set_capacity(size);
}
virtual ~line_string() {} virtual ~line_string() {}
}; };
typedef point<vertex2d> point_impl; typedef point<vertex2d> point_impl;
typedef line_string<vertex2d,vertex_vector> line_string_impl; typedef line_string<vertex2d,vertex_vector2> line_string_impl;
typedef polygon<vertex2d,vertex_vector> polygon_impl; typedef polygon<vertex2d,vertex_vector2> polygon_impl;
typedef geometry<vertex2d> geometry_type; typedef geometry<vertex2d> geometry_type;
typedef boost::shared_ptr<geometry_type> geometry_ptr; typedef boost::shared_ptr<geometry_type> geometry_ptr;

View file

@ -115,7 +115,10 @@ namespace mapnik
++vertex; ++vertex;
t.forward_y(vertex); t.forward_y(vertex);
} }
void set_capacity(size_t)
{
//do nothing
}
private: private:
void allocate_block(unsigned block) void allocate_block(unsigned block)
{ {
@ -143,9 +146,8 @@ namespace mapnik
struct vertex_vector2 : boost::noncopyable struct vertex_vector2 : boost::noncopyable
{ {
typedef typename T::type value_type; typedef typename T::type value_type;
typedef boost::tuple<value_type,value_type,char> coord; typedef boost::tuple<value_type,value_type,char> vertex_type;
vertex_vector2() {} vertex_vector2() {}
unsigned size() const unsigned size() const
{ {
return cont_.size(); return cont_.size();
@ -153,27 +155,30 @@ namespace mapnik
void push_back (value_type x,value_type y,unsigned command) void push_back (value_type x,value_type y,unsigned command)
{ {
cont_.push_back(coord(x,y,command)); cont_.push_back(vertex_type(x,y,command));
} }
unsigned get_vertex(unsigned pos,value_type* x,value_type* y) const unsigned get_vertex(unsigned pos,value_type* x,value_type* y) const
{ {
if (pos >= cont_.size()) return SEG_END; if (pos >= cont_.size()) return SEG_END;
coord const& c = cont_[pos]; vertex_type const& c = cont_[pos];
*x = boost::get<0>(c); *x = boost::get<0>(c);
*y = boost::get<1>(c); *y = boost::get<1>(c);
return boost::get<2>(c); return boost::get<2>(c);
} }
void transform_at(unsigned pos,const CoordTransform& t) void transform_at(unsigned pos,const CoordTransform& t)
{ {
if (pos >= cont_.size()) return; if (pos >= cont_.size()) return;
coord & c = cont_[pos]; vertex_type & c = cont_[pos];
t.forward_x(&boost::get<0>(c)); t.forward_x(&boost::get<0>(c));
t.forward_y(&boost::get<1>(c)); t.forward_y(&boost::get<1>(c));
} }
void set_capacity(size_t size)
{
cont_.reserve(size);
}
private: private:
std::vector<coord> cont_; std::vector<vertex_type> cont_;
}; };
} }

View file

@ -92,9 +92,10 @@ geometry_ptr shape_io::read_polyline()
int num_parts=record.read_ndr_integer(); int num_parts=record.read_ndr_integer();
int num_points=record.read_ndr_integer(); int num_points=record.read_ndr_integer();
geometry_ptr line(new line_string_impl(-1)); geometry_ptr line(new line_string_impl(-1));
line->set_capacity(num_points + num_parts);
if (num_parts == 1) if (num_parts == 1)
{ {
line->set_capacity(num_points + 1);
record.skip(4); record.skip(4);
double x=record.read_double(); double x=record.read_double();
double y=record.read_double(); double y=record.read_double();
@ -145,7 +146,7 @@ geometry_ptr shape_io::read_polylinem()
int num_parts=record.read_ndr_integer(); int num_parts=record.read_ndr_integer();
int num_points=record.read_ndr_integer(); int num_points=record.read_ndr_integer();
geometry_ptr line(new line_string_impl(-1)); geometry_ptr line(new line_string_impl(-1));
line->set_capacity(num_points + num_parts);
if (num_parts == 1) if (num_parts == 1)
{ {
record.skip(4); record.skip(4);
@ -207,7 +208,7 @@ geometry_ptr shape_io::read_polylinez()
int num_parts=record.read_ndr_integer(); int num_parts=record.read_ndr_integer();
int num_points=record.read_ndr_integer(); int num_points=record.read_ndr_integer();
geometry_ptr line(new line_string_impl(-1)); geometry_ptr line(new line_string_impl(-1));
line->set_capacity(num_points + num_parts);
if (num_parts == 1) if (num_parts == 1)
{ {
record.skip(4); record.skip(4);
@ -277,7 +278,7 @@ geometry_ptr shape_io::read_polygon()
int num_points=record.read_ndr_integer(); int num_points=record.read_ndr_integer();
std::vector<int> parts(num_parts); std::vector<int> parts(num_parts);
geometry_ptr poly(new polygon_impl(-1)); geometry_ptr poly(new polygon_impl(-1));
poly->set_capacity(num_points + num_parts);
for (int i=0;i<num_parts;++i) for (int i=0;i<num_parts;++i)
{ {
parts[i]=record.read_ndr_integer(); parts[i]=record.read_ndr_integer();
@ -317,7 +318,7 @@ geometry_ptr shape_io::read_polygonm()
int num_points=record.read_ndr_integer(); int num_points=record.read_ndr_integer();
std::vector<int> parts(num_parts); std::vector<int> parts(num_parts);
geometry_ptr poly(new polygon_impl(-1)); geometry_ptr poly(new polygon_impl(-1));
poly->set_capacity(num_points + num_parts);
for (int i=0;i<num_parts;++i) for (int i=0;i<num_parts;++i)
{ {
parts[i]=record.read_ndr_integer(); parts[i]=record.read_ndr_integer();
@ -365,7 +366,7 @@ geometry_ptr shape_io::read_polygonz()
int num_points=record.read_ndr_integer(); int num_points=record.read_ndr_integer();
std::vector<int> parts(num_parts); std::vector<int> parts(num_parts);
geometry_ptr poly(new polygon_impl(-1)); geometry_ptr poly(new polygon_impl(-1));
poly->set_capacity(num_points + num_parts);
for (int i=0;i<num_parts;++i) for (int i=0;i<num_parts;++i)
{ {
parts[i]=record.read_ndr_integer(); parts[i]=record.read_ndr_integer();