Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r69905 - in trunk/boost/geometry: domains domains/gis domains/gis/io domains/gis/io/wkt domains/gis/io/wkt/detail extensions/gis/io/wkt extensions/gis/io/wkt/detail
From: barend.gehrels_at_[hidden]
Date: 2011-03-12 18:49:30


Author: barendgehrels
Date: 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
New Revision: 69905
URL: http://svn.boost.org/trac/boost/changeset/69905

Log:
Moved wkt (used in nearly all tests) from extension to domains tree for release
Added:
   trunk/boost/geometry/domains/
   trunk/boost/geometry/domains/gis/
   trunk/boost/geometry/domains/gis/io/
   trunk/boost/geometry/domains/gis/io/io.hpp (contents, props changed)
   trunk/boost/geometry/domains/gis/io/wkt/
   trunk/boost/geometry/domains/gis/io/wkt/detail/
      - copied from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/detail/
   trunk/boost/geometry/domains/gis/io/wkt/read_wkt.hpp
      - copied, changed from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/read_wkt.hpp
   trunk/boost/geometry/domains/gis/io/wkt/read_wkt_multi.hpp
      - copied, changed from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp
   trunk/boost/geometry/domains/gis/io/wkt/wkt.hpp
      - copied, changed from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/wkt.hpp
   trunk/boost/geometry/domains/gis/io/wkt/write_wkt.hpp
      - copied, changed from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/write_wkt.hpp
   trunk/boost/geometry/domains/gis/io/wkt/write_wkt_multi.hpp
      - copied, changed from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp
Removed:
   trunk/boost/geometry/extensions/gis/io/wkt/detail/
   trunk/boost/geometry/extensions/gis/io/wkt/read_wkt.hpp
   trunk/boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp
   trunk/boost/geometry/extensions/gis/io/wkt/wkt.hpp
   trunk/boost/geometry/extensions/gis/io/wkt/write_wkt.hpp
   trunk/boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp
Text files modified:
   trunk/boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp | 2 +-
   trunk/boost/geometry/domains/gis/io/wkt/read_wkt.hpp | 2 +-
   trunk/boost/geometry/domains/gis/io/wkt/read_wkt_multi.hpp | 4 ++--
   trunk/boost/geometry/domains/gis/io/wkt/wkt.hpp | 8 ++++----
   trunk/boost/geometry/domains/gis/io/wkt/write_wkt.hpp | 6 +++---
   trunk/boost/geometry/domains/gis/io/wkt/write_wkt_multi.hpp | 4 ++--
   6 files changed, 13 insertions(+), 13 deletions(-)

Added: trunk/boost/geometry/domains/gis/io/io.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/geometry/domains/gis/io/io.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
@@ -0,0 +1,59 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Copyright Barend Gehrels 2008-2009, Geodan, Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_DOMAINS_GIS_IO_HPP
+#define BOOST_GEOMETRY_DOMAINS_GIS_IO_HPP
+
+
+#include <boost/geometry/extensions/gis/io/wkt/read_wkt.hpp>
+#include <boost/geometry/extensions/gis/io/wkt/write_wkt.hpp>
+
+#include <boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp>
+#include <boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp>
+
+namespace boost { namespace geometry
+{
+
+struct format_wkt {};
+struct format_wkb {};
+struct format_dsv {};
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+template <typename Tag, typename Geometry>
+struct read
+{
+};
+
+template <typename Geometry>
+struct read<format_wkt, Geometry>
+{
+ static inline void apply(Geometry& geometry, std::string const& wkt)
+ {
+ read_wkt<typename tag<Geometry>::type, Geometry>::apply(wkt, geometry);
+ }
+};
+
+
+} // namespace dispatch
+#endif // DOXYGEN_NO_DISPATCH
+
+
+
+template <typename Format, typename Geometry>
+inline void read(Geometry& geometry, std::string const& wkt)
+{
+ geometry::concept::check<Geometry>();
+ dispatch::read<Format, Geometry>::apply(geometry, wkt);
+}
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_HPP

Modified: trunk/boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp
==============================================================================
--- /trunk/boost/geometry/extensions/gis/io/wkt/detail/wkt_multi.hpp (original)
+++ trunk/boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
@@ -9,7 +9,7 @@
 #define BOOST_GEOMETRY_MULTI_IO_WKT_DETAIL_WKT_HPP
 
 
-#include <boost/geometry/extensions/gis/io/wkt/write_wkt.hpp>
+#include <boost/geometry/domains/gis/io/wkt/write_wkt.hpp>
 #include <boost/geometry/multi/core/tags.hpp>
 
 

Copied: trunk/boost/geometry/domains/gis/io/wkt/read_wkt.hpp (from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/read_wkt.hpp)
==============================================================================
--- /trunk/boost/geometry/extensions/gis/io/wkt/read_wkt.hpp (original)
+++ trunk/boost/geometry/domains/gis/io/wkt/read_wkt.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
@@ -37,7 +37,7 @@
 
 #include <boost/geometry/util/coordinate_cast.hpp>
 
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt.hpp>
+#include <boost/geometry/domains/gis/io/wkt/detail/wkt.hpp>
 
 namespace boost { namespace geometry
 {

Copied: trunk/boost/geometry/domains/gis/io/wkt/read_wkt_multi.hpp (from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp)
==============================================================================
--- /trunk/boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp (original)
+++ trunk/boost/geometry/domains/gis/io/wkt/read_wkt_multi.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
@@ -14,8 +14,8 @@
 #include <boost/geometry/multi/core/tags.hpp>
 #include <boost/geometry/multi/core/point_type.hpp>
 
-#include <boost/geometry/extensions/gis/io/wkt/read_wkt.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt_multi.hpp>
+#include <boost/geometry/domains/gis/io/wkt/read_wkt.hpp>
+#include <boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp>
 
 
 namespace boost { namespace geometry

Copied: trunk/boost/geometry/domains/gis/io/wkt/wkt.hpp (from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/wkt.hpp)
==============================================================================
--- /trunk/boost/geometry/extensions/gis/io/wkt/wkt.hpp (original)
+++ trunk/boost/geometry/domains/gis/io/wkt/wkt.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
@@ -9,11 +9,11 @@
 #define BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WKT_HPP
 
 
-#include <boost/geometry/extensions/gis/io/wkt/read_wkt.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/write_wkt.hpp>
+#include <boost/geometry/domains/gis/io/wkt/read_wkt.hpp>
+#include <boost/geometry/domains/gis/io/wkt/write_wkt.hpp>
 
-#include <boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp>
+#include <boost/geometry/domains/gis/io/wkt/read_wkt_multi.hpp>
+#include <boost/geometry/domains/gis/io/wkt/write_wkt_multi.hpp>
 
 
 #endif // BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WKT_HPP

Copied: trunk/boost/geometry/domains/gis/io/wkt/write_wkt.hpp (from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/write_wkt.hpp)
==============================================================================
--- /trunk/boost/geometry/extensions/gis/io/wkt/write_wkt.hpp (original)
+++ trunk/boost/geometry/domains/gis/io/wkt/write_wkt.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
@@ -26,7 +26,7 @@
 #include <boost/geometry/geometries/concepts/check.hpp>
 #include <boost/geometry/geometries/ring.hpp>
 
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt.hpp>
+#include <boost/geometry/domains/gis/io/wkt/detail/wkt.hpp>
 
 
 namespace boost { namespace geometry
@@ -225,8 +225,8 @@
         assign_point_from_index<0>(segment, points[0]);
         assign_point_from_index<1>(segment, points[1]);
 
- // In Boost.Geometry a segment is represented
- // in WKT-format like (for 2D): LINESTRING(x y,x y)
+ // In Boost.Geometry a segment is represented
+ // in WKT-format like (for 2D): LINESTRING(x y,x y)
         os << "LINESTRING";
         wkt_sequence<sequence>::apply(os, points);
     }

Copied: trunk/boost/geometry/domains/gis/io/wkt/write_wkt_multi.hpp (from r69889, /trunk/boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp)
==============================================================================
--- /trunk/boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp (original)
+++ trunk/boost/geometry/domains/gis/io/wkt/write_wkt_multi.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
@@ -12,8 +12,8 @@
 
 #include <boost/geometry/multi/core/tags.hpp>
 
-#include <boost/geometry/extensions/gis/io/wkt/write_wkt.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt_multi.hpp>
+#include <boost/geometry/domains/gis/io/wkt/write_wkt.hpp>
+#include <boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp>
 
 
 namespace boost { namespace geometry

Deleted: trunk/boost/geometry/extensions/gis/io/wkt/read_wkt.hpp
==============================================================================
--- trunk/boost/geometry/extensions/gis/io/wkt/read_wkt.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
+++ (empty file)
@@ -1,717 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-//
-// Copyright Barend Gehrels 2008-2009, Geodan, Amsterdam, the Netherlands.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_READ_WKT_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_READ_WKT_HPP
-
-#include <string>
-
-#include <boost/lexical_cast.hpp>
-#include <boost/tokenizer.hpp>
-
-#include <boost/algorithm/string.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/range.hpp>
-
-
-#include <boost/type_traits.hpp>
-
-
-#include <boost/geometry/algorithms/assign.hpp>
-#include <boost/geometry/algorithms/append.hpp>
-#include <boost/geometry/algorithms/clear.hpp>
-
-#include <boost/geometry/core/access.hpp>
-#include <boost/geometry/core/coordinate_dimension.hpp>
-#include <boost/geometry/core/exception.hpp>
-#include <boost/geometry/core/exterior_ring.hpp>
-#include <boost/geometry/core/geometry_id.hpp>
-#include <boost/geometry/core/interior_rings.hpp>
-#include <boost/geometry/core/mutable_range.hpp>
-
-#include <boost/geometry/geometries/concepts/check.hpp>
-
-#include <boost/geometry/util/coordinate_cast.hpp>
-
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt.hpp>
-
-namespace boost { namespace geometry
-{
-
-
-
-/*!
-\brief Exception showing things wrong with WKT parsing
-\ingroup wkt
-*/
-struct read_wkt_exception : public geometry::exception
-{
- template <typename Iterator>
- read_wkt_exception(std::string const& msg,
- Iterator const& it, Iterator const& end, std::string const& wkt)
- : message(msg)
- , wkt(wkt)
- {
- if (it != end)
- {
- source = " at '";
- source += it->c_str();
- source += "'";
- }
- complete = message + source + " in '" + wkt.substr(0, 100) + "'";
- }
-
- read_wkt_exception(std::string const& msg, std::string const& wkt)
- : message(msg)
- , wkt(wkt)
- {
- complete = message + "' in (" + wkt.substr(0, 100) + ")";
- }
-
- virtual ~read_wkt_exception() throw() {}
-
- virtual const char* what() const throw()
- {
- return complete.c_str();
- }
-private :
- std::string source;
- std::string message;
- std::string wkt;
- std::string complete;
-};
-
-
-
-#ifndef DOXYGEN_NO_DETAIL
-// (wkt: Well Known Text, defined by OGC for all geometries and implemented by e.g. databases (MySQL, PostGIS))
-namespace detail { namespace wkt {
-
-typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
-
-template <typename Point, std::size_t Dimension, std::size_t DimensionCount>
-struct parsing_assigner
-{
- static inline void apply(tokenizer::iterator& it, tokenizer::iterator end,
- Point& point, std::string const& wkt)
- {
- typedef typename coordinate_type<Point>::type coordinate_type;
-
- // Stop at end of tokens, or at "," ot ")"
- bool finished = (it == end || *it == "," || *it == ")");
-
- try
- {
- // Initialize missing coordinates to default constructor (zero)
- // OR
- // Use lexical_cast for conversion to double/int
- // Note that it is much slower than atof. However, it is more standard
- // and in parsing the change in performance falls probably away against
- // the tokenizing
- set<Dimension>(point, finished
- ? coordinate_type()
- : coordinate_cast<coordinate_type>::apply(*it));
- }
- catch(boost::bad_lexical_cast const& blc)
- {
- throw read_wkt_exception(blc.what(), it, end, wkt);
- }
- catch(std::exception const& e)
- {
- throw read_wkt_exception(e.what(), it, end, wkt);
- }
- catch(...)
- {
- throw read_wkt_exception("", it, end, wkt);
- }
-
- parsing_assigner<Point, Dimension + 1, DimensionCount>::apply(
- (finished ? it : ++it), end, point, wkt);
- }
-};
-
-template <typename Point, std::size_t DimensionCount>
-struct parsing_assigner<Point, DimensionCount, DimensionCount>
-{
- static inline void apply(tokenizer::iterator&, tokenizer::iterator, Point&,
- std::string const&)
- {
- }
-};
-
-
-
-template <typename Iterator>
-inline void handle_open_parenthesis(Iterator& it,
- Iterator const& end, std::string const& wkt)
-{
- if (it == end || *it != "(")
- {
- throw read_wkt_exception("Expected '('", it, end, wkt);
- }
- ++it;
-}
-
-
-template <typename Iterator>
-inline void handle_close_parenthesis(Iterator& it,
- Iterator const& end, std::string const& wkt)
-{
- if (it != end && *it == ")")
- {
- ++it;
- }
- else
- {
- throw read_wkt_exception("Expected ')'", it, end, wkt);
- }
-}
-
-template <typename Iterator>
-inline void check_end(Iterator& it,
- Iterator const& end, std::string const& wkt)
-{
- if (it != end)
- {
- throw read_wkt_exception("Too much tokens", it, end, wkt);
- }
-}
-
-/*!
-\brief Internal, parses coordinate sequences, strings are formated like "(1 2,3 4,...)"
-\param it token-iterator, should be pre-positioned at "(", is post-positions after last ")"
-\param end end-token-iterator
-\param out Output itererator receiving coordinates
-*/
-template <typename Point>
-struct container_inserter
-{
- // Version with output iterator
- template <typename OutputIterator>
- static inline void apply(tokenizer::iterator& it, tokenizer::iterator end,
- std::string const& wkt, OutputIterator out)
- {
- handle_open_parenthesis(it, end, wkt);
-
- Point point;
-
- // Parse points until closing parenthesis
-
- while (it != end && *it != ")")
- {
- parsing_assigner
- <
- Point,
- 0,
- dimension<Point>::value
- >::apply(it, end, point, wkt);
- out = point;
- ++out;
- if (it != end && *it == ",")
- {
- ++it;
- }
- }
-
- handle_close_parenthesis(it, end, wkt);
- }
-};
-
-
-// Geometry is a value-type or reference-type
-template <typename Geometry>
-struct container_appender
-{
- typedef typename geometry::point_type
- <
- typename boost::remove_reference<Geometry>::type
- >::type point_type;
-
- static inline void apply(tokenizer::iterator& it, tokenizer::iterator end,
- std::string const& wkt, Geometry out)
- {
- handle_open_parenthesis(it, end, wkt);
-
- point_type point;
-
- // Parse points until closing parenthesis
-
- while (it != end && *it != ")")
- {
- parsing_assigner
- <
- point_type,
- 0,
- dimension<point_type>::value
- >::apply(it, end, point, wkt);
-
- geometry::append(out, point);
- if (it != end && *it == ",")
- {
- ++it;
- }
- }
-
- handle_close_parenthesis(it, end, wkt);
- }
-};
-
-/*!
-\brief Internal, parses a point from a string like this "(x y)"
-\note used for parsing points and multi-points
-*/
-template <typename P>
-struct point_parser
-{
- static inline void apply(tokenizer::iterator& it, tokenizer::iterator end,
- std::string const& wkt, P& point)
- {
- handle_open_parenthesis(it, end, wkt);
- parsing_assigner<P, 0, dimension<P>::value>::apply(it, end, point, wkt);
- handle_close_parenthesis(it, end, wkt);
- }
-};
-
-
-template <typename Geometry>
-struct linestring_parser
-{
- static inline void apply(tokenizer::iterator& it, tokenizer::iterator end,
- std::string const& wkt, Geometry& geometry)
- {
- container_appender<Geometry&>::apply(it, end, wkt, geometry);
- }
-};
-
-
-template <typename Ring>
-struct ring_parser
-{
- static inline void apply(tokenizer::iterator& it, tokenizer::iterator end,
- std::string const& wkt, Ring& ring)
- {
- // A ring should look like polygon((x y,x y,x y...))
- // So handle the extra opening/closing parentheses
- // and in between parse using the container-inserter
- handle_open_parenthesis(it, end, wkt);
- container_appender<Ring&>::apply(it, end, wkt, ring);
- handle_close_parenthesis(it, end, wkt);
- }
-};
-
-
-
-
-/*!
-\brief Internal, parses a polygon from a string like this "((x y,x y),(x y,x y))"
-\note used for parsing polygons and multi-polygons
-*/
-template <typename Polygon>
-struct polygon_parser
-{
- typedef typename ring_return_type<Polygon>::type ring_return_type;
- typedef container_appender<ring_return_type> appender;
-
- static inline void apply(tokenizer::iterator& it, tokenizer::iterator end,
- std::string const& wkt, Polygon& poly)
- {
-
- handle_open_parenthesis(it, end, wkt);
-
- int n = -1;
-
- // Stop at ")"
- while (it != end && *it != ")")
- {
- // Parse ring
- if (++n == 0)
- {
- appender::apply(it, end, wkt, exterior_ring(poly));
- }
- else
- {
- typename ring_type<Polygon>::type ring;
- appender::apply(it, end, wkt, ring);
- traits::push_back
- <
- typename boost::remove_reference
- <
- typename traits::interior_mutable_type<Polygon>::type
- >::type
- >::apply(interior_rings(poly), ring);
- }
-
- if (it != end && *it == ",")
- {
- // Skip "," after ring is parsed
- ++it;
- }
- }
-
- handle_close_parenthesis(it, end, wkt);
- }
-};
-
-inline bool one_of(tokenizer::iterator const& it, std::string const& value,
- bool& is_present)
-{
- if (boost::iequals(*it, value))
- {
- is_present = true;
- return true;
- }
- return false;
-}
-
-inline bool one_of(tokenizer::iterator const& it, std::string const& value,
- bool& present1, bool& present2)
-{
- if (boost::iequals(*it, value))
- {
- present1 = true;
- present2 = true;
- return true;
- }
- return false;
-}
-
-
-inline void handle_empty_z_m(tokenizer::iterator& it, tokenizer::iterator end,
- bool& has_empty, bool& has_z, bool& has_m)
-{
- has_empty = false;
- has_z = false;
- has_m = false;
-
- // WKT can optionally have Z and M (measured) values as in
- // POINT ZM (1 1 5 60), POINT M (1 1 80), POINT Z (1 1 5)
- // GGL supports any of them as coordinate values, but is not aware
- // of any Measured value.
- while (it != end
- && (one_of(it, "M", has_m)
- || one_of(it, "Z", has_z)
- || one_of(it, "EMPTY", has_empty)
- || one_of(it, "MZ", has_m, has_z)
- || one_of(it, "ZM", has_z, has_m)
- )
- )
- {
- ++it;
- }
-}
-
-/*!
-\brief Internal, starts parsing
-\param tokens boost tokens, parsed with separator " " and keeping separator "()"
-\param geometry string to compare with first token
-*/
-template <typename Geometry>
-inline bool initialize(tokenizer const& tokens,
- std::string const& geometry_name, std::string const& wkt,
- tokenizer::iterator& it)
-{
- it = tokens.begin();
- if (it != tokens.end() && boost::iequals(*it++, geometry_name))
- {
- bool has_empty, has_z, has_m;
-
- handle_empty_z_m(it, tokens.end(), has_empty, has_z, has_m);
-
- if (has_z && dimension<Geometry>::type::value < 3)
- {
- throw read_wkt_exception("Z only allowed for 3 or more dimensions", wkt);
- }
- if (has_empty)
- {
- check_end(it, tokens.end(), wkt);
- return false;
- }
- // M is ignored at all.
-
- return true;
- }
- throw read_wkt_exception(std::string("Should start with '") + geometry_name + "'", wkt);
-}
-
-
-template <typename Geometry, template<typename> class Parser, typename PrefixPolicy>
-struct geometry_parser
-{
- static inline void apply(std::string const& wkt, Geometry& geometry)
- {
- geometry::clear(geometry);
-
- tokenizer tokens(wkt, boost::char_separator<char>(" ", ",()"));
- tokenizer::iterator it;
- if (initialize<Geometry>(tokens, PrefixPolicy::apply(), wkt, it))
- {
- Parser<Geometry>::apply(it, tokens.end(), wkt, geometry);
- check_end(it, tokens.end(), wkt);
- }
- }
-};
-
-
-
-
-
-/*!
-\brief Supports box parsing
-\note OGC does not define the box geometry, and WKT does not support boxes.
- However, to be generic GGL supports reading and writing from and to boxes.
- Boxes are outputted as a standard POLYGON. GGL can read boxes from
- a standard POLYGON, from a POLYGON with 2 points of from a BOX
-\tparam Box the box
-*/
-template <typename Box>
-struct box_parser
-{
- static inline void apply(std::string const& wkt, Box& box)
- {
- bool should_close = false;
- tokenizer tokens(wkt, boost::char_separator<char>(" ", ",()"));
- tokenizer::iterator it = tokens.begin();
- tokenizer::iterator end = tokens.end();
- if (it != end && boost::iequals(*it, "POLYGON"))
- {
- ++it;
- bool has_empty, has_z, has_m;
- handle_empty_z_m(it, end, has_empty, has_z, has_m);
- if (has_empty)
- {
- assign_zero(box);
- return;
- }
- handle_open_parenthesis(it, end, wkt);
- should_close = true;
- }
- else if (it != end && boost::iequals(*it, "BOX"))
- {
- ++it;
- }
- else
- {
- throw read_wkt_exception("Should start with 'POLYGON' or 'BOX'", wkt);
- }
-
- typedef typename point_type<Box>::type point_type;
- std::vector<point_type> points;
- container_inserter<point_type>::apply(it, end, wkt, std::back_inserter(points));
-
- if (should_close)
- {
- handle_close_parenthesis(it, end, wkt);
- }
- check_end(it, end, wkt);
-
- int index = 0;
- int n = boost::size(points);
- if (n == 2)
- {
- index = 1;
- }
- else if (n == 4 || n == 5)
- {
- // In case of 4 or 5 points, we do not check the other ones, just
- // take the opposite corner which is always 2
- index = 2;
- }
- else
- {
- throw read_wkt_exception("Box should have 2,4 or 5 points", wkt);
- }
-
- assign_point_to_index<min_corner>(points.front(), box);
- assign_point_to_index<max_corner>(points[index], box);
- }
-};
-
-
-/*!
-\brief Supports segment parsing
-\note OGC does not define the segment, and WKT does not support segmentes.
- However, it is useful to implement it, also for testing purposes
-\tparam Segment the segment
-*/
-template <typename Segment>
-struct segment_parser
-{
- static inline void apply(std::string const& wkt, Segment& segment)
- {
- tokenizer tokens(wkt, boost::char_separator<char>(" ", ",()"));
- tokenizer::iterator it = tokens.begin();
- tokenizer::iterator end = tokens.end();
- if (it != end &&
- (boost::iequals(*it, "SEGMENT")
- || boost::iequals(*it, "LINESTRING") ))
- {
- ++it;
- }
- else
- {
- throw read_wkt_exception("Should start with 'LINESTRING' or 'SEGMENT'", wkt);
- }
-
- typedef typename point_type<Segment>::type point_type;
- std::vector<point_type> points;
- container_inserter<point_type>::apply(it, end, wkt, std::back_inserter(points));
-
- check_end(it, end, wkt);
-
- if (boost::size(points) == 2)
- {
- assign_point_to_index<0>(points.front(), segment);
- assign_point_to_index<1>(points.back(), segment);
- }
- else
- {
- throw read_wkt_exception("Segment should have 2 points", wkt);
- }
-
- }
-};
-
-
-
-}} // namespace detail::wkt
-#endif // DOXYGEN_NO_DETAIL
-
-#ifndef DOXYGEN_NO_DISPATCH
-namespace dispatch
-{
-
-template <typename Tag, typename Geometry>
-struct read_wkt {};
-
-
-template <typename Point>
-struct read_wkt<point_tag, Point>
- : detail::wkt::geometry_parser
- <
- Point,
- detail::wkt::point_parser,
- detail::wkt::prefix_point
- >
-{};
-
-
-template <typename L>
-struct read_wkt<linestring_tag, L>
- : detail::wkt::geometry_parser
- <
- L,
- detail::wkt::linestring_parser,
- detail::wkt::prefix_linestring
- >
-{};
-
-template <typename Ring>
-struct read_wkt<ring_tag, Ring>
- : detail::wkt::geometry_parser
- <
- Ring,
- detail::wkt::ring_parser,
- detail::wkt::prefix_polygon
- >
-{};
-
-template <typename Geometry>
-struct read_wkt<polygon_tag, Geometry>
- : detail::wkt::geometry_parser
- <
- Geometry,
- detail::wkt::polygon_parser,
- detail::wkt::prefix_polygon
- >
-{};
-
-
-// Box (Non-OGC)
-template <typename Box>
-struct read_wkt<box_tag, Box>
- : detail::wkt::box_parser<Box>
-{};
-
-// Segment (Non-OGC)
-template <typename Segment>
-struct read_wkt<segment_tag, Segment>
- : detail::wkt::segment_parser<Segment>
-{};
-
-
-} // namespace dispatch
-#endif // DOXYGEN_NO_DISPATCH
-
-
-/*!
-\brief Parses OGC Well-Known Text (\ref WKT) into a geometry (any geometry)
-\ingroup wkt
-\param wkt string containing \ref WKT
-\param geometry output geometry
-\par Example:
-\note It is case insensitive and can have the WKT forms "point", "point m", "point z", "point zm", "point mz"
-\note Empty sequences can have forms as "LINESTRING ()" or "POLYGON(())"
-Small example showing how to use read_wkt to build a point
-\dontinclude doxygen_1.cpp
-\skip example_from_wkt_point
-\line {
-\until }
-\par Example:
-Small example showing how to use read_wkt to build a linestring
-\dontinclude doxygen_1.cpp
-\skip example_from_wkt_linestring
-\line {
-\until }
-\par Example:
-Small example showing how to use read_wkt to build a polygon
-\dontinclude doxygen_1.cpp
-\skip example_from_wkt_polygon
-\line {
-\until }
-*/
-template <typename Geometry>
-inline void read_wkt(std::string const& wkt, Geometry& geometry)
-{
- geometry::concept::check<Geometry>();
- dispatch::read_wkt<typename tag<Geometry>::type, Geometry>::apply(wkt, geometry);
-}
-
-/*!
-\brief Parses OGC Well-Known Text (\ref WKT) and outputs using an output iterator
-\ingroup wkt
-\param wkt string containing \ref WKT
-\param out output iterator
-\note Because the output iterator doesn't always have the type value_type, it should be
-specified in the function call.
-\par Example:
-Small example showing how to use read_wkt with an output iterator
-\dontinclude doxygen_1.cpp
-\skip example_from_wkt_output_iterator
-\line {
-\until }
-*/
-template <typename Geometry, typename OutputIterator>
-inline void read_wkt(std::string const& wkt, OutputIterator out)
-{
- geometry::concept::check<Geometry>();
-
- typedef typename point_type<Geometry>::type point_type;
-
- std::string const& tag =
- geometry_id<Geometry>::value == 2 ? "linestring" : "polygon";
-
- detail::wkt::tokenizer tokens(wkt, boost::char_separator<char>(" ", ",()"));
- detail::wkt::tokenizer::iterator it;
- if (detail::wkt::initialize<point_type>(tokens, tag, wkt, it))
- {
- detail::wkt::container_inserter<point_type>::apply(it, tokens.end(), wkt, out);
- }
-}
-
-}} // namespace boost::geometry
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_READ_WKT_HPP

Deleted: trunk/boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp
==============================================================================
--- trunk/boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
+++ (empty file)
@@ -1,106 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-//
-// Copyright Barend Gehrels 2008-2009, Geodan, Amsterdam, the Netherlands.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_READ_WKT_MULTI_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_READ_WKT_MULTI_HPP
-
-#include <string>
-
-#include <boost/geometry/core/mutable_range.hpp>
-#include <boost/geometry/multi/core/tags.hpp>
-#include <boost/geometry/multi/core/point_type.hpp>
-
-#include <boost/geometry/extensions/gis/io/wkt/read_wkt.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt_multi.hpp>
-
-
-namespace boost { namespace geometry
-{
-
-namespace detail { namespace wkt {
-
-template <typename MultiGeometry, template<typename> class Parser, typename PrefixPolicy>
-struct multi_parser
-{
- static inline void apply(std::string const& wkt, MultiGeometry& geometry)
- {
- traits::clear<MultiGeometry>::apply(geometry);
-
- tokenizer tokens(wkt, boost::char_separator<char>(" ", ",()"));
- tokenizer::iterator it;
- if (initialize<MultiGeometry>(tokens, PrefixPolicy::apply(), wkt, it))
- {
- handle_open_parenthesis(it, tokens.end(), wkt);
-
- // Parse sub-geometries
- while(it != tokens.end() && *it != ")")
- {
- traits::resize<MultiGeometry>::apply(geometry, boost::size(geometry) + 1);
- Parser
- <
- typename boost::range_value<MultiGeometry>::type
- >::apply(it, tokens.end(), wkt, geometry.back());
- if (it != tokens.end() && *it == ",")
- {
- // Skip "," after multi-element is parsed
- ++it;
- }
- }
-
- handle_close_parenthesis(it, tokens.end(), wkt);
- }
- }
-};
-
-
-
-
-}} // namespace detail::wkt
-
-#ifndef DOXYGEN_NO_DISPATCH
-namespace dispatch
-{
-
-template <typename MultiGeometry>
-struct read_wkt<multi_point_tag, MultiGeometry>
- : detail::wkt::multi_parser
- <
- MultiGeometry,
- detail::wkt::point_parser,
- detail::wkt::prefix_multipoint
- >
-{};
-
-
-template <typename MultiGeometry>
-struct read_wkt<multi_linestring_tag, MultiGeometry>
- : detail::wkt::multi_parser
- <
- MultiGeometry,
- detail::wkt::linestring_parser,
- detail::wkt::prefix_multilinestring
- >
-{};
-
-
-template <typename MultiGeometry>
-struct read_wkt<multi_polygon_tag, MultiGeometry>
- : detail::wkt::multi_parser
- <
- MultiGeometry,
- detail::wkt::polygon_parser,
- detail::wkt::prefix_multipolygon
- >
-{};
-
-
-} // namespace dispatch
-#endif // DOXYGEN_NO_DISPATCH
-
-}} // namespace boost::geometry
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_READ_WKT_MULTI_HPP

Deleted: trunk/boost/geometry/extensions/gis/io/wkt/wkt.hpp
==============================================================================
--- trunk/boost/geometry/extensions/gis/io/wkt/wkt.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
+++ (empty file)
@@ -1,19 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-//
-// Copyright Barend Gehrels 2008-2009, Geodan, Amsterdam, the Netherlands.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WKT_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WKT_HPP
-
-
-#include <boost/geometry/extensions/gis/io/wkt/read_wkt.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/write_wkt.hpp>
-
-#include <boost/geometry/extensions/gis/io/wkt/read_wkt_multi.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp>
-
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WKT_HPP

Deleted: trunk/boost/geometry/extensions/gis/io/wkt/write_wkt.hpp
==============================================================================
--- trunk/boost/geometry/extensions/gis/io/wkt/write_wkt.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
+++ (empty file)
@@ -1,398 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-//
-// Copyright Barend Gehrels 2008-2009, Geodan, Amsterdam, the Netherlands.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WRITE_WKT_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WRITE_WKT_HPP
-
-#include <ostream>
-#include <string>
-
-#include <boost/array.hpp>
-#include <boost/concept/assert.hpp>
-#include <boost/range.hpp>
-#include <boost/typeof/typeof.hpp>
-
-
-#include <boost/geometry/algorithms/assign.hpp>
-#include <boost/geometry/algorithms/convert.hpp>
-#include <boost/geometry/core/exterior_ring.hpp>
-#include <boost/geometry/core/interior_rings.hpp>
-#include <boost/geometry/core/ring_type.hpp>
-
-#include <boost/geometry/geometries/concepts/check.hpp>
-#include <boost/geometry/geometries/ring.hpp>
-
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt.hpp>
-
-
-namespace boost { namespace geometry
-{
-
-#ifndef DOXYGEN_NO_DETAIL
-namespace detail { namespace wkt
-{
-
-template <typename P, int I, int Count>
-struct stream_coordinate
-{
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>& os, P const& p)
- {
- os << (I > 0 ? " " : "") << get<I>(p);
- stream_coordinate<P, I + 1, Count>::apply(os, p);
- }
-};
-
-template <typename P, int Count>
-struct stream_coordinate<P, Count, Count>
-{
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>&, P const&)
- {}
-};
-
-struct prefix_linestring_par
-{
- static inline const char* apply() { return "LINESTRING("; }
-};
-
-struct prefix_ring_par_par
-{
- // Note, double parentheses are intentional, indicating WKT ring begin/end
- static inline const char* apply() { return "POLYGON(("; }
-};
-
-struct opening_parenthesis
-{
- static inline const char* apply() { return "("; }
-};
-
-struct closing_parenthesis
-{
- static inline const char* apply() { return ")"; }
-};
-
-struct double_closing_parenthesis
-{
- static inline const char* apply() { return "))"; }
-};
-
-
-
-
-/*!
-\brief Stream points as \ref WKT
-*/
-template <typename Point, typename Policy>
-struct wkt_point
-{
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>& os, Point const& p)
- {
- os << Policy::apply() << "(";
- stream_coordinate<Point, 0, dimension<Point>::type::value>::apply(os, p);
- os << ")";
- }
-};
-
-/*!
-\brief Stream ranges as WKT
-\note policy is used to stream prefix/postfix, enabling derived classes to override this
-*/
-template <typename Range, typename PrefixPolicy, typename SuffixPolicy>
-struct wkt_range
-{
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>& os,
- Range const& range)
- {
- typedef typename boost::range_iterator<Range const>::type iterator_type;
-
- bool first = true;
-
- os << PrefixPolicy::apply();
-
- // TODO: check EMPTY here
-
- for (iterator_type it = boost::begin(range);
- it != boost::end(range);
- ++it)
- {
- os << (first ? "" : ",");
- stream_coordinate
- <
- point_type, 0, dimension<point_type>::type::value
- >::apply(os, *it);
- first = false;
- }
-
- os << SuffixPolicy::apply();
- }
-
-private:
- typedef typename boost::range_value<Range>::type point_type;
-};
-
-/*!
-\brief Stream sequence of points as WKT-part, e.g. (1 2),(3 4)
-\note Used in polygon, all multi-geometries
-*/
-
-
-
-template <typename Range>
-struct wkt_sequence
- : wkt_range
- <
- Range,
- opening_parenthesis,
- closing_parenthesis
- >
-{};
-
-
-template <typename Polygon, typename PrefixPolicy>
-struct wkt_poly
-{
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>& os,
- Polygon const& poly)
- {
- typedef typename ring_type<Polygon const>::type ring;
-
- os << PrefixPolicy::apply();
- // TODO: check EMPTY here
- os << "(";
- wkt_sequence<ring>::apply(os, exterior_ring(poly));
-
- typename interior_return_type<Polygon const>::type rings
- = interior_rings(poly);
- for (BOOST_AUTO(it, boost::begin(rings)); it != boost::end(rings); ++it)
- {
- os << ",";
- wkt_sequence<ring>::apply(os, *it);
- }
- os << ")";
- }
-};
-
-
-template <typename Box>
-struct wkt_box
-{
- typedef typename point_type<Box>::type point_type;
-
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>& os,
- Box const& box)
- {
- // Convert to linear ring, then stream
- typedef model::ring<point_type> ring_type;
- ring_type ring;
- geometry::convert(box, ring);
- os << "POLYGON(";
- wkt_sequence<ring_type>::apply(os, ring);
- os << ")";
- }
-
- private:
-
- inline wkt_box()
- {
- // Only streaming of boxes with two dimensions is support, otherwise it is a polyhedron!
- //assert_dimension<B, 2>();
- }
-};
-
-
-template <typename Segment>
-struct wkt_segment
-{
- typedef typename point_type<Segment>::type point_type;
-
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>& os,
- Segment const& segment)
- {
- // Convert to two points, then stream
- typedef boost::array<point_type, 2> sequence;
-
- sequence points;
- assign_point_from_index<0>(segment, points[0]);
- assign_point_from_index<1>(segment, points[1]);
-
- // In Boost.Geometry a segment is represented
- // in WKT-format like (for 2D): LINESTRING(x y,x y)
- os << "LINESTRING";
- wkt_sequence<sequence>::apply(os, points);
- }
-
- private:
-
- inline wkt_segment()
- {}
-};
-
-}} // namespace detail::wkt
-#endif // DOXYGEN_NO_DETAIL
-
-
-#ifndef DOXYGEN_NO_DISPATCH
-namespace dispatch
-{
-
-template <typename Tag, typename Geometry>
-struct wkt
-{
- BOOST_MPL_ASSERT_MSG
- (
- false, NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE
- , (types<Geometry>)
- );
-};
-
-
-template <typename Point>
-struct wkt<point_tag, Point>
- : detail::wkt::wkt_point
- <
- Point,
- detail::wkt::prefix_point
- >
-{};
-
-
-template <typename Linestring>
-struct wkt<linestring_tag, Linestring>
- : detail::wkt::wkt_range
- <
- Linestring,
- detail::wkt::prefix_linestring_par,
- detail::wkt::closing_parenthesis
- >
-{};
-
-
-/*!
-\brief Specialization to stream a box as WKT
-\details A "box" does not exist in WKT.
-It is therefore streamed as a polygon
-*/
-template <typename Box>
-struct wkt<box_tag, Box>
- : detail::wkt::wkt_box<Box>
-{};
-
-template <typename Segment>
-struct wkt<segment_tag, Segment>
- : detail::wkt::wkt_segment<Segment>
-{};
-
-
-/*!
-\brief Specialization to stream a ring as WKT
-\details A "linear_ring" does not exist in WKT.
-A linear ring is equivalent to a polygon without inner rings
-It is therefore streamed as a polygon
-*/
-template <typename Ring>
-struct wkt<ring_tag, Ring>
- : detail::wkt::wkt_range
- <
- Ring,
- detail::wkt::prefix_ring_par_par,
- detail::wkt::double_closing_parenthesis
- >
-{};
-
-
-/*!
-\brief Specialization to stream polygon as WKT
-*/
-template <typename Polygon>
-struct wkt<polygon_tag, Polygon>
- : detail::wkt::wkt_poly
- <
- Polygon,
- detail::wkt::prefix_polygon
- >
-{};
-
-
-} // namespace dispatch
-#endif // DOXYGEN_NO_DISPATCH
-
-
-/*!
-\brief Generic geometry template manipulator class, takes corresponding output class from traits class
-\ingroup wkt
-\details Stream manipulator, streams geometry classes as \ref WKT streams
-\par Example:
-Small example showing how to use the wkt class
-\dontinclude doxygen_1.cpp
-\skip example_as_wkt_point
-\line {
-\until }
-*/
-template <typename Geometry>
-class wkt_manipulator
-{
-public:
-
- inline wkt_manipulator(Geometry const& g)
- : m_geometry(g)
- {}
-
- template <typename Char, typename Traits>
- inline friend std::basic_ostream<Char, Traits>& operator<<(
- std::basic_ostream<Char, Traits>& os,
- wkt_manipulator const& m)
- {
- dispatch::wkt
- <
- typename tag<Geometry>::type,
- Geometry
- >::apply(os, m.m_geometry);
- os.flush();
- return os;
- }
-
-private:
- Geometry const& m_geometry;
-};
-
-/*!
-\brief Main WKT-streaming function
-\ingroup wkt
-\par Example:
-Small example showing how to use the wkt helper function
-\dontinclude doxygen_1.cpp
-\skip example_as_wkt_vector
-\line {
-\until }
-*/
-template <typename Geometry>
-inline wkt_manipulator<Geometry> wkt(Geometry const& geometry)
-{
- concept::check<Geometry const>();
-
- return wkt_manipulator<Geometry>(geometry);
-}
-
-
-// Backward compatibility
-template <typename Geometry>
-inline wkt_manipulator<Geometry> make_wkt(Geometry const& geometry)
-{
- concept::check<Geometry const>();
-
- return wkt_manipulator<Geometry>(geometry);
-}
-
-}} // namespace boost::geometry
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WRITE_WKT_HPP

Deleted: trunk/boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp
==============================================================================
--- trunk/boost/geometry/extensions/gis/io/wkt/write_wkt_multi.hpp 2011-03-12 18:49:21 EST (Sat, 12 Mar 2011)
+++ (empty file)
@@ -1,111 +0,0 @@
-// Boost.Geometry (aka GGL, Generic Geometry Library)
-//
-// Copyright Barend Gehrels 2008-2009, Geodan, Amsterdam, the Netherlands.
-// Use, modification and distribution is subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WRITE_WKT_MULTI_HPP
-#define BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WRITE_WKT_MULTI_HPP
-
-
-
-#include <boost/geometry/multi/core/tags.hpp>
-
-#include <boost/geometry/extensions/gis/io/wkt/write_wkt.hpp>
-#include <boost/geometry/extensions/gis/io/wkt/detail/wkt_multi.hpp>
-
-
-namespace boost { namespace geometry
-{
-
-#ifndef DOXYGEN_NO_DETAIL
-namespace detail { namespace wkt
-{
-
-
-template <typename Multi, typename StreamPolicy, typename PrefixPolicy>
-struct wkt_multi
-{
- template <typename Char, typename Traits>
- static inline void apply(std::basic_ostream<Char, Traits>& os,
- Multi const& geometry)
- {
- os << PrefixPolicy::apply();
- // TODO: check EMPTY here
- os << "(";
-
- for (typename boost::range_iterator<Multi const>::type
- it = boost::begin(geometry);
- it != boost::end(geometry);
- ++it)
- {
- if (it != boost::begin(geometry))
- {
- os << ",";
- }
- StreamPolicy::apply(os, *it);
- }
-
- os << ")";
- }
-};
-
-}} // namespace wkt::impl
-#endif
-
-
-#ifndef DOXYGEN_NO_DISPATCH
-namespace dispatch
-{
-
-
-template <typename Multi>
-struct wkt<multi_point_tag, Multi>
- : detail::wkt::wkt_multi
- <
- Multi,
- detail::wkt::wkt_point
- <
- typename boost::range_value<Multi>::type,
- detail::wkt::prefix_null
- >,
- detail::wkt::prefix_multipoint
- >
-{};
-
-
-template <typename Multi>
-struct wkt<multi_linestring_tag, Multi>
- : detail::wkt::wkt_multi
- <
- Multi,
- detail::wkt::wkt_sequence
- <
- typename boost::range_value<Multi>::type
- >,
- detail::wkt::prefix_multilinestring
- >
-{};
-
-
-template <typename Multi>
-struct wkt<multi_polygon_tag, Multi>
- : detail::wkt::wkt_multi
- <
- Multi,
- detail::wkt::wkt_poly
- <
- typename boost::range_value<Multi>::type,
- detail::wkt::prefix_null
- >,
- detail::wkt::prefix_multipolygon
- >
-{};
-
-} // namespace dispatch
-#endif
-
-}} // namespace boost::geometry
-
-#endif // BOOST_GEOMETRY_EXTENSIONS_GIS_IO_WKT_WRITE_WKT_MULTI_HPP


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk