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); } }
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); // If first point definition starts with "(" then parse points as (x y) // otherwise as "x y" bool using_brackets = (it != tokens.end() && *it == "("); while(it != tokens.end() && *it != ")") { traits::resize<MultiGeometry>::apply(geometry, boost::size(geometry) + 1); if (using_brackets) { point_parser < typename boost::range_value<MultiGeometry>::type >::apply(it, tokens.end(), wkt, *(boost::end(geometry) - 1)); } else { noparenthesis_point_parser < typename boost::range_value<MultiGeometry>::type >::apply(it, tokens.end(), wkt, *(boost::end(geometry) - 1)); } if (it != tokens.end() && *it == ",") { // Skip "," after point is parsed ++it; } } handle_close_parenthesis(it, tokens.end(), wkt); } check_end(it, tokens.end(), wkt); }