+ template on geometry/path concept

This commit is contained in:
artemp 2012-10-04 12:15:51 +01:00
parent 8674e463a6
commit eaf6049909

View file

@ -39,8 +39,8 @@
namespace mapnik { namespace util {
std::string to_hex(const char* blob, unsigned size)
{
std::string to_hex(const char* blob, unsigned size)
{
std::string buf;
buf.reserve(size*2);
std::ostringstream s(buf);
@ -53,16 +53,16 @@ namespace mapnik { namespace util {
s << hex;
}
return s.str();
}
}
enum wkbByteOrder {
enum wkbByteOrder {
wkbXDR=0,
wkbNDR=1
};
};
inline void reverse_bytes(char size, char *address)
{
inline void reverse_bytes(char size, char *address)
{
char * first = address;
char * last = first + size - 1;
for(;first < last;++first, --last)
@ -71,11 +71,11 @@ namespace mapnik { namespace util {
*last = *first;
*first = x;
}
}
}
template <typename S, typename T>
inline void write (S & stream, T val, std::size_t size, wkbByteOrder byte_order)
{
template <typename S, typename T>
inline void write (S & stream, T val, std::size_t size, wkbByteOrder byte_order)
{
#ifdef MAPNIK_BIG_ENDIAN
bool need_swap = byte_order ? wkbNDR : wkbXDR;
#else
@ -87,10 +87,10 @@ namespace mapnik { namespace util {
reverse_bytes(size,buf);
}
stream.write(buf,size);
}
}
struct wkb_buffer
{
struct wkb_buffer
{
wkb_buffer(std::size_t size)
: size_(size),
data_( (size_!=0) ? static_cast<char*>(::operator new (size_)):0)
@ -113,12 +113,13 @@ namespace mapnik { namespace util {
std::size_t size_;
char * data_;
};
};
typedef boost::shared_ptr<wkb_buffer> wkb_buffer_ptr;
typedef boost::shared_ptr<wkb_buffer> wkb_buffer_ptr;
wkb_buffer_ptr to_point_wkb( geometry_type const& g, wkbByteOrder byte_order)
{
template<typename GeometryType>
wkb_buffer_ptr to_point_wkb( GeometryType const& g, wkbByteOrder byte_order)
{
assert(g.size() == 1);
std::size_t size = 1 + 4 + 8*2 ; // byteOrder + wkbType + Point
wkb_buffer_ptr wkb = boost::make_shared<wkb_buffer>(size);
@ -133,10 +134,11 @@ namespace mapnik { namespace util {
write(ss,y,8,byte_order);
assert(ss.good());
return wkb;
}
}
wkb_buffer_ptr to_line_string_wkb( geometry_type const& g, wkbByteOrder byte_order)
{
template<typename GeometryType>
wkb_buffer_ptr to_line_string_wkb( GeometryType const& g, wkbByteOrder byte_order)
{
unsigned num_points = g.size();
assert(num_points > 1);
std::size_t size = 1 + 4 + 4 + 8*2*num_points ; // byteOrder + wkbType + numPoints + Point*numPoints
@ -156,10 +158,11 @@ namespace mapnik { namespace util {
}
assert(ss.good());
return wkb;
}
}
wkb_buffer_ptr to_polygon_wkb( geometry_type const& g, wkbByteOrder byte_order)
{
template<typename GeometryType>
wkb_buffer_ptr to_polygon_wkb( GeometryType const& g, wkbByteOrder byte_order)
{
unsigned num_points = g.size();
assert(num_points > 1);
@ -205,10 +208,11 @@ namespace mapnik { namespace util {
assert(ss.good());
return wkb;
}
}
wkb_buffer_ptr to_wkb(geometry_type const& g, wkbByteOrder byte_order )
{
template<typename GeometryType>
wkb_buffer_ptr to_wkb(GeometryType const& g, wkbByteOrder byte_order )
{
wkb_buffer_ptr wkb;
switch (g.type())
@ -226,10 +230,10 @@ namespace mapnik { namespace util {
break;
}
return wkb;
}
}
wkb_buffer_ptr to_wkb(geometry_container const& paths, wkbByteOrder byte_order )
{
wkb_buffer_ptr to_wkb(geometry_container const& paths, wkbByteOrder byte_order )
{
if (paths.size() == 1)
{
// single geometry
@ -271,9 +275,7 @@ namespace mapnik { namespace util {
}
return wkb_buffer_ptr();
}
}}
}
}}
#endif // MAPNIK_GEOMETRY_TO_WKB_HPP