+ template on geometry/path concept
This commit is contained in:
parent
8674e463a6
commit
eaf6049909
1 changed files with 199 additions and 197 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue