diff --git a/include/boost/geometry/domains/gis/io/io.hpp b/include/boost/geometry/domains/gis/io/io.hpp deleted file mode 100644 index d1c06234c..000000000 --- a/include/boost/geometry/domains/gis/io/io.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. -// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. -// Copyright (c) 2009-2011 Mateusz Loskot, London, UK. - -// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library -// (geolib/GGL), copyright (c) 1995-2010 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 -#include - -#include -#include - -namespace boost { namespace geometry -{ - -struct format_wkt {}; -struct format_wkb {}; -struct format_dsv {}; - -#ifndef DOXYGEN_NO_DISPATCH -namespace dispatch -{ - -template -struct read -{ -}; - -template -struct read -{ - static inline void apply(Geometry& geometry, std::string const& wkt) - { - read_wkt::type, Geometry>::apply(wkt, geometry); - } -}; - - -} // namespace dispatch -#endif // DOXYGEN_NO_DISPATCH - - - -template -inline void read(Geometry& geometry, std::string const& wkt) -{ - geometry::concept::check(); - dispatch::read::apply(geometry, wkt); -} - -}} // namespace boost::geometry - - -#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_HPP diff --git a/include/boost/geometry/domains/gis/io/wkt/detail/wkt.hpp b/include/boost/geometry/domains/gis/io/wkt/detail/wkt.hpp deleted file mode 100644 index 576a1688f..000000000 --- a/include/boost/geometry/domains/gis/io/wkt/detail/wkt.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. -// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. -// Copyright (c) 2009-2011 Mateusz Loskot, London, UK. - -// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library -// (geolib/GGL), copyright (c) 1995-2010 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_WKT_DETAIL_WKT_HPP -#define BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_DETAIL_WKT_HPP - - -namespace boost { namespace geometry -{ - -#ifndef DOXYGEN_NO_DETAIL -namespace detail { namespace wkt { - - -struct prefix_point -{ - static inline const char* apply() { return "POINT"; } -}; - -struct prefix_polygon -{ - static inline const char* apply() { return "POLYGON"; } -}; - -struct prefix_linestring -{ - static inline const char* apply() { return "LINESTRING"; } -}; - - - -}} // namespace wkt::impl -#endif - - -}} // namespace boost::geometry - - -#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_DETAIL_WKT_HPP diff --git a/include/boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp b/include/boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp deleted file mode 100644 index 4cf7bc00a..000000000 --- a/include/boost/geometry/domains/gis/io/wkt/detail/wkt_multi.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. -// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. -// Copyright (c) 2009-2011 Mateusz Loskot, London, UK. - -// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library -// (geolib/GGL), copyright (c) 1995-2010 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_WKT_DETAIL_WKT_MULTI_HPP -#define BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_DETAIL_WKT_MULTI_HPP - - -#include -#include - - -namespace boost { namespace geometry -{ - -#ifndef DOXYGEN_NO_DETAIL -namespace detail { namespace wkt { - -struct prefix_null -{ - static inline const char* apply() { return ""; } -}; - -struct prefix_multipoint -{ - static inline const char* apply() { return "MULTIPOINT"; } -}; - -struct prefix_multilinestring -{ - static inline const char* apply() { return "MULTILINESTRING"; } -}; - -struct prefix_multipolygon -{ - static inline const char* apply() { return "MULTIPOLYGON"; } -}; - - - -}} // namespace wkt::impl -#endif - - -}} // namespace boost::geometry - -#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_DETAIL_WKT_MULTI_HPP diff --git a/include/boost/geometry/domains/gis/io/wkt/read.hpp b/include/boost/geometry/domains/gis/io/wkt/read.hpp deleted file mode 100644 index 6ae5f3b87..000000000 --- a/include/boost/geometry/domains/gis/io/wkt/read.hpp +++ /dev/null @@ -1,692 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. -// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. -// Copyright (c) 2009-2011 Mateusz Loskot, London, UK. - -// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library -// (geolib/GGL), copyright (c) 1995-2010 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_WKT_READ_HPP -#define BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_READ_HPP - -#include - -#include -#include - -#include -#include -#include - - -#include - - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include - -namespace boost { namespace geometry -{ - - - -/*! -\brief Exception showing things wrong with WKT parsing -\ingroup wkt -*/ -struct read_wkt_exception : public geometry::exception -{ - template - 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 > tokenizer; - -template -struct parsing_assigner -{ - static inline void apply(tokenizer::iterator& it, tokenizer::iterator end, - Point& point, std::string const& wkt) - { - typedef typename coordinate_type::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(point, finished - ? coordinate_type() - : coordinate_cast::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::apply( - (finished ? it : ++it), end, point, wkt); - } -}; - -template -struct parsing_assigner -{ - static inline void apply(tokenizer::iterator&, tokenizer::iterator, Point&, - std::string const&) - { - } -}; - - - -template -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 -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 -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 -struct container_inserter -{ - // Version with output iterator - template - 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::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 -struct container_appender -{ - typedef typename geometry::point_type - < - typename boost::remove_reference::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::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 -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::value>::apply(it, end, point, wkt); - handle_close_parenthesis(it, end, wkt); - } -}; - - -template -struct linestring_parser -{ - static inline void apply(tokenizer::iterator& it, tokenizer::iterator end, - std::string const& wkt, Geometry& geometry) - { - container_appender::apply(it, end, wkt, geometry); - } -}; - - -template -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::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 -struct polygon_parser -{ - typedef typename ring_return_type::type ring_return_type; - typedef container_appender 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::type ring; - appender::apply(it, end, wkt, ring); - traits::push_back - < - typename boost::remove_reference - < - typename traits::interior_mutable_type::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 -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::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 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(" ", ",()")); - tokenizer::iterator it; - if (initialize(tokens, PrefixPolicy::apply(), wkt, it)) - { - Parser::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 -struct box_parser -{ - static inline void apply(std::string const& wkt, Box& box) - { - bool should_close = false; - tokenizer tokens(wkt, boost::char_separator(" ", ",()")); - 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::type point_type; - std::vector points; - container_inserter::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); - } - - geometry::detail::assign_point_to_index(points.front(), box); - geometry::detail::assign_point_to_index(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 -struct segment_parser -{ - static inline void apply(std::string const& wkt, Segment& segment) - { - tokenizer tokens(wkt, boost::char_separator(" ", ",()")); - 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::type point_type; - std::vector points; - container_inserter::apply(it, end, wkt, std::back_inserter(points)); - - check_end(it, end, wkt); - - if (boost::size(points) == 2) - { - geometry::detail::assign_point_to_index<0>(points.front(), segment); - geometry::detail::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 -struct read_wkt {}; - - -template -struct read_wkt - : detail::wkt::geometry_parser - < - Point, - detail::wkt::point_parser, - detail::wkt::prefix_point - > -{}; - - -template -struct read_wkt - : detail::wkt::geometry_parser - < - L, - detail::wkt::linestring_parser, - detail::wkt::prefix_linestring - > -{}; - -template -struct read_wkt - : detail::wkt::geometry_parser - < - Ring, - detail::wkt::ring_parser, - detail::wkt::prefix_polygon - > -{}; - -template -struct read_wkt - : detail::wkt::geometry_parser - < - Geometry, - detail::wkt::polygon_parser, - detail::wkt::prefix_polygon - > -{}; - - -// Box (Non-OGC) -template -struct read_wkt - : detail::wkt::box_parser -{}; - -// Segment (Non-OGC) -template -struct read_wkt - : detail::wkt::segment_parser -{}; - - -} // 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 -inline void read_wkt(std::string const& wkt, Geometry& geometry) -{ - geometry::concept::check(); - dispatch::read_wkt::type, Geometry>::apply(wkt, geometry); -} - -}} // namespace boost::geometry - - -#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_READ_HPP diff --git a/include/boost/geometry/domains/gis/io/wkt/read_multi.hpp b/include/boost/geometry/domains/gis/io/wkt/read_multi.hpp deleted file mode 100644 index 0d9a2b649..000000000 --- a/include/boost/geometry/domains/gis/io/wkt/read_multi.hpp +++ /dev/null @@ -1,112 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. -// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. -// Copyright (c) 2009-2011 Mateusz Loskot, London, UK. - -// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library -// (geolib/GGL), copyright (c) 1995-2010 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_WKT_READ_MULTI_HPP -#define BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_READ_MULTI_HPP - -#include - -#include -#include -#include - -#include -#include - - -namespace boost { namespace geometry -{ - -namespace detail { namespace wkt { - -template class Parser, typename PrefixPolicy> -struct multi_parser -{ - static inline void apply(std::string const& wkt, MultiGeometry& geometry) - { - traits::clear::apply(geometry); - - tokenizer tokens(wkt, boost::char_separator(" ", ",()")); - tokenizer::iterator it; - if (initialize(tokens, PrefixPolicy::apply(), wkt, it)) - { - handle_open_parenthesis(it, tokens.end(), wkt); - - // Parse sub-geometries - while(it != tokens.end() && *it != ")") - { - traits::resize::apply(geometry, boost::size(geometry) + 1); - Parser - < - typename boost::range_value::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 -struct read_wkt - : detail::wkt::multi_parser - < - MultiGeometry, - detail::wkt::point_parser, - detail::wkt::prefix_multipoint - > -{}; - - -template -struct read_wkt - : detail::wkt::multi_parser - < - MultiGeometry, - detail::wkt::linestring_parser, - detail::wkt::prefix_multilinestring - > -{}; - - -template -struct read_wkt - : 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_DOMAINS_GIS_IO_WKT_READ_MULTI_HPP diff --git a/include/boost/geometry/domains/gis/io/wkt/write.hpp b/include/boost/geometry/domains/gis/io/wkt/write.hpp deleted file mode 100644 index 0f1dbb909..000000000 --- a/include/boost/geometry/domains/gis/io/wkt/write.hpp +++ /dev/null @@ -1,394 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. -// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. -// Copyright (c) 2009-2011 Mateusz Loskot, London, UK. - -// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library -// (geolib/GGL), copyright (c) 1995-2010 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_WKT_WRITE_HPP -#define BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_WRITE_HPP - -#include -#include - -#include -#include -#include -#include - - -#include -#include -#include -#include -#include - -#include -#include - -#include - - -namespace boost { namespace geometry -{ - -#ifndef DOXYGEN_NO_DETAIL -namespace detail { namespace wkt -{ - -template -struct stream_coordinate -{ - template - static inline void apply(std::basic_ostream& os, P const& p) - { - os << (I > 0 ? " " : "") << get(p); - stream_coordinate::apply(os, p); - } -}; - -template -struct stream_coordinate -{ - template - static inline void apply(std::basic_ostream&, 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 -struct wkt_point -{ - template - static inline void apply(std::basic_ostream& os, Point const& p) - { - os << Policy::apply() << "("; - stream_coordinate::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 -struct wkt_range -{ - template - static inline void apply(std::basic_ostream& os, - Range const& range) - { - typedef typename boost::range_iterator::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::type::value - >::apply(os, *it); - first = false; - } - - os << SuffixPolicy::apply(); - } - -private: - typedef typename boost::range_value::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 -struct wkt_sequence - : wkt_range - < - Range, - opening_parenthesis, - closing_parenthesis - > -{}; - - -template -struct wkt_poly -{ - template - static inline void apply(std::basic_ostream& os, - Polygon const& poly) - { - typedef typename ring_type::type ring; - - os << PrefixPolicy::apply(); - // TODO: check EMPTY here - os << "("; - wkt_sequence::apply(os, exterior_ring(poly)); - - typename interior_return_type::type rings - = interior_rings(poly); - for (BOOST_AUTO_TPL(it, boost::begin(rings)); it != boost::end(rings); ++it) - { - os << ","; - wkt_sequence::apply(os, *it); - } - os << ")"; - } -}; - - -template -struct wkt_box -{ - typedef typename point_type::type point_type; - - template - static inline void apply(std::basic_ostream& os, - Box const& box) - { - // Convert to ring, then stream - typedef model::ring ring_type; - ring_type ring; - geometry::convert(box, ring); - os << "POLYGON("; - wkt_sequence::apply(os, ring); - os << ")"; - } - - private: - - inline wkt_box() - { - // Only streaming of boxes with two dimensions is support, otherwise it is a polyhedron! - //assert_dimension(); - } -}; - - -template -struct wkt_segment -{ - typedef typename point_type::type point_type; - - template - static inline void apply(std::basic_ostream& os, - Segment const& segment) - { - // Convert to two points, then stream - typedef boost::array sequence; - - sequence points; - geometry::detail::assign_point_from_index<0>(segment, points[0]); - geometry::detail::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::apply(os, points); - } - - private: - - inline wkt_segment() - {} -}; - -}} // namespace detail::wkt -#endif // DOXYGEN_NO_DETAIL - - -#ifndef DOXYGEN_NO_DISPATCH -namespace dispatch -{ - -template -struct wkt -{ - BOOST_MPL_ASSERT_MSG - ( - false, NOT_YET_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE - , (types) - ); -}; - - -template -struct wkt - : detail::wkt::wkt_point - < - Point, - detail::wkt::prefix_point - > -{}; - - -template -struct wkt - : 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 -struct wkt - : detail::wkt::wkt_box -{}; - -template -struct wkt - : detail::wkt::wkt_segment -{}; - - -/*! -\brief Specialization to stream a ring as WKT -\details A ring or "linear_ring" does not exist in WKT. -A ring is equivalent to a polygon without inner rings -It is therefore streamed as a polygon -*/ -template -struct wkt - : detail::wkt::wkt_range - < - Ring, - detail::wkt::prefix_ring_par_par, - detail::wkt::double_closing_parenthesis - > -{}; - - -/*! -\brief Specialization to stream polygon as WKT -*/ -template -struct wkt - : 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 -class wkt_manipulator -{ -public: - - inline wkt_manipulator(Geometry const& g) - : m_geometry(g) - {} - - template - inline friend std::basic_ostream& operator<<( - std::basic_ostream& os, - wkt_manipulator const& m) - { - dispatch::wkt - < - typename tag::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 -inline wkt_manipulator wkt(Geometry const& geometry) -{ - concept::check(); - - return wkt_manipulator(geometry); -} - -}} // namespace boost::geometry - -#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_WRITE_HPP diff --git a/include/boost/geometry/domains/gis/io/wkt/write_multi.hpp b/include/boost/geometry/domains/gis/io/wkt/write_multi.hpp deleted file mode 100644 index a8810a815..000000000 --- a/include/boost/geometry/domains/gis/io/wkt/write_multi.hpp +++ /dev/null @@ -1,115 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2007-2011 Barend Gehrels, Amsterdam, the Netherlands. -// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. -// Copyright (c) 2009-2011 Mateusz Loskot, London, UK. - -// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library -// (geolib/GGL), copyright (c) 1995-2010 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_WKT_WRITE_MULTI_HPP -#define BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_WRITE_MULTI_HPP - -#include - -#include -#include - - -namespace boost { namespace geometry -{ - -#ifndef DOXYGEN_NO_DETAIL -namespace detail { namespace wkt -{ - - -template -struct wkt_multi -{ - template - static inline void apply(std::basic_ostream& os, - Multi const& geometry) - { - os << PrefixPolicy::apply(); - // TODO: check EMPTY here - os << "("; - - for (typename boost::range_iterator::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 -struct wkt - : detail::wkt::wkt_multi - < - Multi, - detail::wkt::wkt_point - < - typename boost::range_value::type, - detail::wkt::prefix_null - >, - detail::wkt::prefix_multipoint - > -{}; - - -template -struct wkt - : detail::wkt::wkt_multi - < - Multi, - detail::wkt::wkt_sequence - < - typename boost::range_value::type - >, - detail::wkt::prefix_multilinestring - > -{}; - - -template -struct wkt - : detail::wkt::wkt_multi - < - Multi, - detail::wkt::wkt_poly - < - typename boost::range_value::type, - detail::wkt::prefix_null - >, - detail::wkt::prefix_multipolygon - > -{}; - -} // namespace dispatch -#endif - -}} // namespace boost::geometry - -#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_WRITE_MULTI_HPP diff --git a/include/boost/geometry/domains/gis/io/wkt/wkt.hpp b/include/boost/geometry/multi/geometries/multi_geometries.hpp similarity index 60% rename from include/boost/geometry/domains/gis/io/wkt/wkt.hpp rename to include/boost/geometry/multi/geometries/multi_geometries.hpp index 662012b1d..0e98b22fb 100644 --- a/include/boost/geometry/domains/gis/io/wkt/wkt.hpp +++ b/include/boost/geometry/multi/geometries/multi_geometries.hpp @@ -11,13 +11,11 @@ // 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_WKT_WKT_HPP -#define BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_WKT_HPP +#ifndef BOOST_GEOMETRY_MULTI_GEOMETRIES_MULTI_GEOMETRIES_HPP +#define BOOST_GEOMETRY_MULTI_GEOMETRIES_MULTI_GEOMETRIES_HPP -#include -#include +#include +#include +#include -#include -#include - -#endif // BOOST_GEOMETRY_DOMAINS_GIS_IO_WKT_WKT_HPP +#endif // BOOST_GEOMETRY_MULTI_GEOMETRIES_MULTI_GEOMETRIES_HPP