From 6567f7fab9bc59135bd22713cddc7da336b61ed0 Mon Sep 17 00:00:00 2001 From: Barend Gehrels Date: Mon, 23 Sep 2013 21:54:07 +0000 Subject: [PATCH] [geometry] merged to release [SVN r85862] --- doc/doxy/Doxyfile | 1 + .../doxygen_input/sourcecode/boost.vsprops | 20 - .../doxygen_input/sourcecode/doxygen_1.vcproj | 194 ----- .../doxygen_input/sourcecode/doxygen_2.vcproj | 182 ----- .../doxygen_input/sourcecode/doxygen_3.vcproj | 182 ----- .../doxygen_input/sourcecode/doxygen_4.vcproj | 182 ----- .../doxygen_input/sourcecode/doxygen_5.vcproj | 182 ----- .../sourcecode/doxygen_examples.sln | 43 - doc/html/img/index/rtree/build_non_ovl.png | Bin 13759 -> 21818 bytes doc/html/img/index/rtree/build_ovl.png | Bin 11785 -> 21274 bytes .../img/index/rtree/intersects_linestring.png | Bin 0 -> 2753 bytes .../img/index/rtree/intersects_segment.png | Bin 0 -> 2228 bytes doc/html/img/index/rtree/query_non_ovl.png | Bin 18225 -> 26830 bytes doc/html/img/index/rtree/query_ovl.png | Bin 17247 -> 27056 bytes doc/index/introduction.qbk | 22 +- doc/index/rtree/query.qbk | 85 +- doc/make_qbk.py | 2 + doc/quickref.xml | 6 + doc/release_notes.qbk | 36 + .../tools/doxygen_xml2qbk/configuration.hpp | 7 +- .../doxygen_xml2qbk/doxygen_elements.hpp | 2 +- .../tools/doxygen_xml2qbk/doxygen_xml2qbk.cpp | 4 +- .../doxygen_xml2qbk/doxygen_xml_parser.hpp | 43 +- .../doxygen_xml2qbk/quickbook_output.hpp | 35 +- .../algorithms/length_with_strategy.cpp | 2 +- .../algorithms/transform_with_strategy.cpp | 6 +- example/06_a_transformation_example.cpp | 2 +- example/06_b_transformation_example.cpp | 8 +- example/07_a_graph_route_example.cpp | 2 +- example/07_b_graph_route_example.cpp | 2 +- example/boost.vsprops | 20 - example/c04_b_custom_triangle_example.cpp | 7 +- example/c08_custom_non_std_example.cpp | 68 +- example/c10_custom_cs_example.cpp | 2 +- example/c11_custom_cs_transform_example.cpp | 16 +- example/ml01_multipolygon_simplify.vcproj | 171 ---- example/ml02_distance_strategy.vcproj | 171 ---- example/with_external_libs/gd.vsprops | 16 - example/with_external_libs/postgresql.vsprops | 20 - example/with_external_libs/qt.vsprops | 22 - example/with_external_libs/shapelib.vsprops | 15 - example/with_external_libs/soci.vsprops | 16 - example/with_external_libs/wxwidgets.vsprops | 20 - example/with_external_libs/x01_qt_example.sln | 19 - .../with_external_libs/x01_qt_example.vcproj | 176 ----- example/with_external_libs/x02_gd_example.sln | 20 - .../with_external_libs/x02_gd_example.vcproj | 236 ------ .../x03_a_soci_example.vcproj | 744 ------------------ .../x03_b_soci_example.vcproj | 744 ------------------ .../x03_c_soci_example.vcproj | 744 ------------------ .../x03_d_soci_example.vcproj | 744 ------------------ .../with_external_libs/x03_soci_examples.sln | 37 - .../x04_wxwidgets_world_mapper.cpp | 4 +- .../x04_wxwidgets_world_mapper.sln | 19 - .../x04_wxwidgets_world_mapper.vcproj | 217 ----- .../x04_wxwidgets_world_mapper_readme.txt | 8 - .../x05_shapelib_example.sln | 19 - .../x05_shapelib_example.vcproj | 202 ----- .../x06_qt_world_mapper.cpp | 2 +- .../x06_qt_world_mapper.sln | 19 - .../x06_qt_world_mapper.vcproj | 180 ----- .../x06_qt_world_mapper_readme.txt | 8 - .../boost/geometry/algorithms/centroid.hpp | 48 +- .../algorithms/detail/assign_values.hpp | 70 +- .../geometry/algorithms/detail/disjoint.hpp | 122 +++ .../overlay/append_no_dups_or_spikes.hpp | 66 ++ .../detail/overlay/assign_parents.hpp | 4 + .../detail/overlay/backtrack_check_si.hpp | 2 +- .../detail/overlay/copy_segments.hpp | 8 +- .../detail/overlay/enrichment_info.hpp | 3 +- .../algorithms/detail/overlay/get_turns.hpp | 15 +- .../algorithms/detail/overlay/overlay.hpp | 4 + .../detail/overlay/self_turn_points.hpp | 8 - .../algorithms/detail/overlay/traverse.hpp | 8 +- .../detail/point_is_spike_or_equal.hpp | 71 ++ .../algorithms/detail/point_on_border.hpp | 2 - .../detail/sections/sectionalize.hpp | 4 +- .../boost/geometry/algorithms/disjoint.hpp | 61 +- .../boost/geometry/algorithms/distance.hpp | 97 +-- .../boost/geometry/algorithms/num_points.hpp | 3 - .../boost/geometry/algorithms/simplify.hpp | 8 +- include/boost/geometry/algorithms/unique.hpp | 2 - include/boost/geometry/geometries/point.hpp | 2 +- .../algorithms/segment_intersection.hpp | 6 +- .../index/detail/rtree/node/node_auto_ptr.hpp | 2 + .../detail/rtree/node/node_d_mem_dynamic.hpp | 6 +- .../detail/rtree/node/node_d_mem_static.hpp | 6 +- .../detail/rtree/node/node_s_mem_dynamic.hpp | 6 +- .../detail/rtree/node/node_s_mem_static.hpp | 6 +- .../index/detail/rtree/query_iterators.hpp | 465 +++++++++-- .../index/detail/rtree/rstar/insert.hpp | 4 +- .../index/detail/rtree/utilities/gl_draw.hpp | 4 +- .../index/detail/rtree/utilities/print.hpp | 4 +- .../detail/rtree/utilities/statistics.hpp | 2 +- .../detail/rtree/visitors/distance_query.hpp | 6 + .../index/detail/rtree/visitors/insert.hpp | 4 +- .../index/detail/rtree/visitors/remove.hpp | 4 +- .../detail/rtree/visitors/spatial_query.hpp | 18 +- .../geometry/index/detail/serialization.hpp | 581 ++++++++++++++ .../index/detail/type_erased_iterators.hpp | 60 -- .../boost/geometry/index/detail/varray.hpp | 1 + .../geometry/index/detail/varray_detail.hpp | 76 +- include/boost/geometry/index/predicates.hpp | 8 - include/boost/geometry/index/rtree.hpp | 312 +++++++- include/boost/geometry/io/svg/svg_mapper.hpp | 29 +- .../geometry/multi/algorithms/distance.hpp | 14 +- .../concepts/multi_linestring_concept.hpp | 5 + .../concepts/multi_point_concept.hpp | 5 + .../concepts/multi_polygon_concept.hpp | 5 + include/boost/geometry/multi/io/wkt/read.hpp | 6 +- .../agnostic/simplify_douglas_peucker.hpp | 28 +- .../strategies/cartesian/cart_intersect.hpp | 3 +- .../cartesian/centroid_bashein_detmer.hpp | 25 +- .../cartesian/distance_projected_point.hpp | 158 ++-- .../cartesian/distance_pythagoras.hpp | 230 ++---- .../strategies/concepts/distance_concept.hpp | 77 +- .../strategies/concepts/simplify_concept.hpp | 29 +- .../strategies/default_distance_result.hpp | 4 +- .../boost/geometry/strategies/distance.hpp | 42 +- .../geometry/strategies/intersection.hpp | 1 - .../strategies/spherical/area_huiller.hpp | 3 +- .../spherical/distance_cross_track.hpp | 186 ++--- .../spherical/distance_haversine.hpp | 192 ++--- .../transform/inverse_transformer.hpp | 19 +- .../strategies/transform/map_transformer.hpp | 18 +- .../transform/matrix_transformers.hpp | 195 +++-- include/boost/geometry/util/math.hpp | 19 +- index/example/Jamfile.v2 | 1 + index/example/benchmark_experimental.cpp | 92 ++- index/example/glut_vis.cpp | 111 ++- index/example/random_test.cpp | 8 +- index/example/serialize.cpp | 166 ++++ index/test/rtree/interprocess/Jamfile.v2 | 1 + .../rtree_interprocess_linear.cpp | 3 +- .../rtree_interprocess_linear_dyn.cpp | 3 +- .../rtree_interprocess_quadratic.cpp | 3 +- .../rtree_interprocess_quadratic_dyn.cpp | 3 +- .../interprocess/rtree_interprocess_rstar.cpp | 3 +- .../rtree_interprocess_rstar_dyn.cpp | 3 +- .../rtree/interprocess/test_interprocess.hpp | 19 +- index/test/rtree/test_rtree.hpp | 54 +- test/algorithms/Jamfile.v2 | 14 +- test/algorithms/algorithms_tests.sln | 193 ----- test/algorithms/append.vcproj | 174 ---- test/algorithms/area.vcproj | 174 ---- test/algorithms/assign.vcproj | 174 ---- test/algorithms/buffer.vcproj | 174 ---- test/algorithms/centroid.cpp | 3 + test/algorithms/centroid.vcproj | 174 ---- test/algorithms/comparable_distance.vcproj | 174 ---- test/algorithms/convert.vcproj | 174 ---- test/algorithms/convex_hull.vcproj | 174 ---- test/algorithms/correct.vcproj | 174 ---- test/algorithms/covered_by.vcproj | 174 ---- test/algorithms/detail/detail.sln | 19 - test/algorithms/detail/partition.vcproj | 174 ---- .../detail/sections/range_by_section.vcproj | 174 ---- .../detail/sections/sectionalize.sln | 25 - .../detail/sections/sectionalize.vcproj | 174 ---- test/algorithms/difference.cpp | 44 +- test/algorithms/difference.vcproj | 174 ---- test/algorithms/disjoint.vcproj | 174 ---- test/algorithms/distance.cpp | 10 +- test/algorithms/distance.vcproj | 174 ---- test/algorithms/envelope.vcproj | 174 ---- test/algorithms/equals.vcproj | 174 ---- test/algorithms/expand.vcproj | 174 ---- test/algorithms/for_each.vcproj | 174 ---- test/algorithms/intersection.cpp | 37 +- test/algorithms/intersection.vcproj | 176 ----- test/algorithms/intersects.cpp | 38 +- test/algorithms/intersects.vcproj | 174 ---- test/algorithms/length.vcproj | 174 ---- test/algorithms/make.vcproj | 174 ---- test/algorithms/overlaps.vcproj | 174 ---- test/algorithms/overlay/assemble.vcproj | 174 ---- test/algorithms/overlay/ccw_traverse.vcproj | 174 ---- test/algorithms/overlay/dissolver.vcproj | 174 ---- .../overlay/enrich_intersection_points.vcproj | 174 ---- test/algorithms/overlay/get_turn_info.vcproj | 174 ---- test/algorithms/overlay/get_turns.vcproj | 174 ---- .../overlay/merge_intersection_points.vcproj | 173 ---- test/algorithms/overlay/overlay.sln | 61 -- test/algorithms/overlay/overlay_cases.hpp | 12 + test/algorithms/overlay/relative_order.vcproj | 174 ---- test/algorithms/overlay/robustness/Jamfile.v2 | 26 + .../overlay/robustness/interior_triangles.cpp | 3 +- .../robustness/interior_triangles.vcproj | 223 ------ .../robustness/intersection_pies.vcproj | 223 ------ .../robustness/intersection_stars.vcproj | 223 ------ .../overlay/robustness/intersects.cpp | 3 +- .../overlay/robustness/intersects.vcproj | 223 ------ .../robustness/random_ellipses_stars.vcproj | 223 ------ .../robustness/recursive_polygons.vcproj | 223 ------ .../overlay/robustness/robustness.sln | 55 -- .../overlay/robustness/star_comb.cpp | 2 - .../overlay/robustness/star_comb.vcproj | 223 ------ test/algorithms/overlay/select_rings.vcproj | 174 ---- .../overlay/self_intersection_points.vcproj | 174 ---- test/algorithms/overlay/split_rings.vcproj | 173 ---- test/algorithms/overlay/traverse.vcproj | 174 ---- test/algorithms/perimeter.vcproj | 174 ---- test/algorithms/reverse.vcproj | 174 ---- test/algorithms/simplify.vcproj | 174 ---- test/algorithms/test_difference.hpp | 4 +- test/algorithms/test_distance.hpp | 43 +- test/algorithms/test_intersection.hpp | 6 +- test/algorithms/test_simplify.hpp | 8 +- test/algorithms/test_union.hpp | 2 +- test/algorithms/touches.vcproj | 174 ---- test/algorithms/transform.vcproj | 174 ---- test/algorithms/union.cpp | 31 +- test/algorithms/union.vcproj | 176 ----- test/algorithms/unique.vcproj | 174 ---- test/algorithms/within.vcproj | 174 ---- test/arithmetic/arithmetic.vcproj | 169 ---- test/arithmetic/arithmetic_tests.sln | 25 - test/arithmetic/dot_product.vcproj | 169 ---- test/boost.vsprops | 21 - test/concepts/concepts_tests.sln | 25 - test/concepts/linestring_concept.vcproj | 172 ---- test/core/access.vcproj | 174 ---- test/core/core.sln | 37 - test/core/radian_access.vcproj | 174 ---- test/core/reverse_dispatch.vcproj | 174 ---- test/core/ring.vcproj | 174 ---- test/geometries/boost_array_as_point.vcproj | 174 ---- test/geometries/boost_fusion.vcproj | 174 ---- test/geometries/boost_polygon.vcproj | 174 ---- test/geometries/boost_polygon_overlay.vcproj | 174 ---- test/geometries/boost_range.vcproj | 174 ---- test/geometries/box.vcproj | 174 ---- test/geometries/concepts/check.sln | 19 - test/geometries/concepts/check.vcproj | 173 ---- test/geometries/custom_linestring.vcproj | 174 ---- test/geometries/geometries_tests.sln | 61 -- test/geometries/segment.vcproj | 174 ---- test/geometry_test_common.hpp | 35 +- test/io/wkt/io_wkt_tests.sln | 19 - test/io/wkt/wkt.vcproj | 174 ---- test/iterators/closing_iterator.vcproj | 178 ----- test/iterators/ever_circling_iterator.vcproj | 178 ----- test/iterators/iterators.sln | 25 - test/multi/algorithms/Jamfile.v2 | 7 +- test/multi/algorithms/multi_area.vcproj | 174 ---- test/multi/algorithms/multi_centroid.vcproj | 174 ---- test/multi/algorithms/multi_convert.vcproj | 174 ---- .../multi/algorithms/multi_convex_hull.vcproj | 174 ---- test/multi/algorithms/multi_correct.vcproj | 174 ---- test/multi/algorithms/multi_covered_by.vcproj | 174 ---- test/multi/algorithms/multi_difference.cpp | 9 +- test/multi/algorithms/multi_difference.vcproj | 174 ---- .../algorithms/multi_difference_spike.cpp | 105 +++ test/multi/algorithms/multi_disjoint.vcproj | 174 ---- test/multi/algorithms/multi_distance.cpp | 20 +- test/multi/algorithms/multi_distance.vcproj | 174 ---- test/multi/algorithms/multi_envelope.vcproj | 174 ---- test/multi/algorithms/multi_equals.vcproj | 174 ---- test/multi/algorithms/multi_for_each.vcproj | 174 ---- test/multi/algorithms/multi_intersection.cpp | 7 +- .../algorithms/multi_intersection.vcproj | 174 ---- test/multi/algorithms/multi_length.vcproj | 174 ---- .../algorithms/multi_num_geometries.vcproj | 174 ---- .../multi_num_interior_rings.vcproj | 174 ---- test/multi/algorithms/multi_num_points.vcproj | 174 ---- test/multi/algorithms/multi_perimeter.vcproj | 174 ---- test/multi/algorithms/multi_reverse.vcproj | 174 ---- test/multi/algorithms/multi_simplify.vcproj | 174 ---- test/multi/algorithms/multi_touches.vcproj | 174 ---- test/multi/algorithms/multi_transform.cpp | 5 +- test/multi/algorithms/multi_transform.vcproj | 174 ---- test/multi/algorithms/multi_union.cpp | 7 +- test/multi/algorithms/multi_union.vcproj | 174 ---- test/multi/algorithms/multi_unique.vcproj | 174 ---- test/multi/algorithms/multi_within.vcproj | 174 ---- .../algorithms/overlay/multi_overlay.sln | 19 - .../algorithms/overlay/multi_traverse.vcproj | 174 ---- test/multi/io/dsv/dsv.sln | 19 - test/multi/io/dsv/dsv.vcproj | 174 ---- test/multi/io/wkt/io_wkt_tests.sln | 27 - test/multi/io/wkt/wkt.vcproj | 174 ---- test/multi/multi_tests.sln | 163 ---- test/policies/compare.vcproj | 174 ---- test/policies/policy_tests.sln | 19 - .../convex_hull/random_multi_points.sln | 20 - .../convex_hull/random_multi_points.vcproj | 223 ------ .../buffer/recursive_polygons_buffer.sln | 20 - .../buffer/recursive_polygons_buffer.vcproj | 222 ------ .../recursive_polygons_linear_areal.sln | 20 - .../recursive_polygons_linear_areal.vcproj | 223 ------ test/strategies/cross_track.cpp | 14 +- test/strategies/cross_track.vcproj | 174 ---- test/strategies/haversine.cpp | 44 +- test/strategies/haversine.vcproj | 174 ---- test/strategies/projected_point.cpp | 31 +- test/strategies/projected_point.vcproj | 174 ---- test/strategies/pythagoras.cpp | 60 +- test/strategies/pythagoras.vcproj | 174 ---- test/strategies/segment_intersection.vcproj | 174 ---- .../segment_intersection_collinear.vcproj | 174 ---- test/strategies/spherical_side.vcproj | 174 ---- test/strategies/strategies_tests.sln | 73 -- test/strategies/transform_cs.vcproj | 174 ---- test/strategies/transformer.cpp | 16 +- test/strategies/transformer.vcproj | 174 ---- test/strategies/within.vcproj | 174 ---- test/ttmath.vsprops | 15 - test/util/as_range.vcproj | 174 ---- test/util/calculation_type.vcproj | 174 ---- test/util/for_each_coordinate.vcproj | 174 ---- test/util/rational.vcproj | 174 ---- test/util/select_most_precise.vcproj | 174 ---- test/util/util_tests.sln | 49 -- test/util/write_dsv.vcproj | 174 ---- test/views/box_view.vcproj | 178 ----- test/views/closeable_view.vcproj | 176 ----- test/views/reversible_closeable.vcproj | 176 ----- test/views/reversible_view.vcproj | 176 ----- test/views/segment_view.vcproj | 178 ----- test/views/views.sln | 43 - 320 files changed, 3411 insertions(+), 30291 deletions(-) delete mode 100644 doc/doxy/doxygen_input/sourcecode/boost.vsprops delete mode 100644 doc/doxy/doxygen_input/sourcecode/doxygen_1.vcproj delete mode 100644 doc/doxy/doxygen_input/sourcecode/doxygen_2.vcproj delete mode 100644 doc/doxy/doxygen_input/sourcecode/doxygen_3.vcproj delete mode 100644 doc/doxy/doxygen_input/sourcecode/doxygen_4.vcproj delete mode 100644 doc/doxy/doxygen_input/sourcecode/doxygen_5.vcproj delete mode 100644 doc/doxy/doxygen_input/sourcecode/doxygen_examples.sln create mode 100644 doc/html/img/index/rtree/intersects_linestring.png create mode 100644 doc/html/img/index/rtree/intersects_segment.png delete mode 100644 example/boost.vsprops delete mode 100644 example/ml01_multipolygon_simplify.vcproj delete mode 100644 example/ml02_distance_strategy.vcproj delete mode 100644 example/with_external_libs/gd.vsprops delete mode 100644 example/with_external_libs/postgresql.vsprops delete mode 100644 example/with_external_libs/qt.vsprops delete mode 100644 example/with_external_libs/shapelib.vsprops delete mode 100644 example/with_external_libs/soci.vsprops delete mode 100644 example/with_external_libs/wxwidgets.vsprops delete mode 100644 example/with_external_libs/x01_qt_example.sln delete mode 100644 example/with_external_libs/x01_qt_example.vcproj delete mode 100644 example/with_external_libs/x02_gd_example.sln delete mode 100644 example/with_external_libs/x02_gd_example.vcproj delete mode 100644 example/with_external_libs/x03_a_soci_example.vcproj delete mode 100644 example/with_external_libs/x03_b_soci_example.vcproj delete mode 100644 example/with_external_libs/x03_c_soci_example.vcproj delete mode 100644 example/with_external_libs/x03_d_soci_example.vcproj delete mode 100644 example/with_external_libs/x03_soci_examples.sln delete mode 100644 example/with_external_libs/x04_wxwidgets_world_mapper.sln delete mode 100644 example/with_external_libs/x04_wxwidgets_world_mapper.vcproj delete mode 100644 example/with_external_libs/x05_shapelib_example.sln delete mode 100644 example/with_external_libs/x05_shapelib_example.vcproj delete mode 100644 example/with_external_libs/x06_qt_world_mapper.sln delete mode 100644 example/with_external_libs/x06_qt_world_mapper.vcproj create mode 100644 include/boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp create mode 100644 include/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp create mode 100644 include/boost/geometry/index/detail/serialization.hpp delete mode 100644 include/boost/geometry/index/detail/type_erased_iterators.hpp create mode 100644 index/example/serialize.cpp delete mode 100644 test/algorithms/algorithms_tests.sln delete mode 100644 test/algorithms/append.vcproj delete mode 100644 test/algorithms/area.vcproj delete mode 100644 test/algorithms/assign.vcproj delete mode 100644 test/algorithms/buffer.vcproj delete mode 100644 test/algorithms/centroid.vcproj delete mode 100644 test/algorithms/comparable_distance.vcproj delete mode 100644 test/algorithms/convert.vcproj delete mode 100644 test/algorithms/convex_hull.vcproj delete mode 100644 test/algorithms/correct.vcproj delete mode 100644 test/algorithms/covered_by.vcproj delete mode 100644 test/algorithms/detail/detail.sln delete mode 100644 test/algorithms/detail/partition.vcproj delete mode 100644 test/algorithms/detail/sections/range_by_section.vcproj delete mode 100644 test/algorithms/detail/sections/sectionalize.sln delete mode 100644 test/algorithms/detail/sections/sectionalize.vcproj delete mode 100644 test/algorithms/difference.vcproj delete mode 100644 test/algorithms/disjoint.vcproj delete mode 100644 test/algorithms/distance.vcproj delete mode 100644 test/algorithms/envelope.vcproj delete mode 100644 test/algorithms/equals.vcproj delete mode 100644 test/algorithms/expand.vcproj delete mode 100644 test/algorithms/for_each.vcproj delete mode 100644 test/algorithms/intersection.vcproj delete mode 100644 test/algorithms/intersects.vcproj delete mode 100644 test/algorithms/length.vcproj delete mode 100644 test/algorithms/make.vcproj delete mode 100644 test/algorithms/overlaps.vcproj delete mode 100644 test/algorithms/overlay/assemble.vcproj delete mode 100644 test/algorithms/overlay/ccw_traverse.vcproj delete mode 100644 test/algorithms/overlay/dissolver.vcproj delete mode 100644 test/algorithms/overlay/enrich_intersection_points.vcproj delete mode 100644 test/algorithms/overlay/get_turn_info.vcproj delete mode 100644 test/algorithms/overlay/get_turns.vcproj delete mode 100644 test/algorithms/overlay/merge_intersection_points.vcproj delete mode 100644 test/algorithms/overlay/overlay.sln delete mode 100644 test/algorithms/overlay/relative_order.vcproj create mode 100644 test/algorithms/overlay/robustness/Jamfile.v2 delete mode 100644 test/algorithms/overlay/robustness/interior_triangles.vcproj delete mode 100644 test/algorithms/overlay/robustness/intersection_pies.vcproj delete mode 100644 test/algorithms/overlay/robustness/intersection_stars.vcproj delete mode 100644 test/algorithms/overlay/robustness/intersects.vcproj delete mode 100644 test/algorithms/overlay/robustness/random_ellipses_stars.vcproj delete mode 100644 test/algorithms/overlay/robustness/recursive_polygons.vcproj delete mode 100644 test/algorithms/overlay/robustness/robustness.sln delete mode 100644 test/algorithms/overlay/robustness/star_comb.vcproj delete mode 100644 test/algorithms/overlay/select_rings.vcproj delete mode 100644 test/algorithms/overlay/self_intersection_points.vcproj delete mode 100644 test/algorithms/overlay/split_rings.vcproj delete mode 100644 test/algorithms/overlay/traverse.vcproj delete mode 100644 test/algorithms/perimeter.vcproj delete mode 100644 test/algorithms/reverse.vcproj delete mode 100644 test/algorithms/simplify.vcproj delete mode 100644 test/algorithms/touches.vcproj delete mode 100644 test/algorithms/transform.vcproj delete mode 100644 test/algorithms/union.vcproj delete mode 100644 test/algorithms/unique.vcproj delete mode 100644 test/algorithms/within.vcproj delete mode 100644 test/arithmetic/arithmetic.vcproj delete mode 100644 test/arithmetic/arithmetic_tests.sln delete mode 100644 test/arithmetic/dot_product.vcproj delete mode 100644 test/boost.vsprops delete mode 100644 test/concepts/concepts_tests.sln delete mode 100644 test/concepts/linestring_concept.vcproj delete mode 100644 test/core/access.vcproj delete mode 100644 test/core/core.sln delete mode 100644 test/core/radian_access.vcproj delete mode 100644 test/core/reverse_dispatch.vcproj delete mode 100644 test/core/ring.vcproj delete mode 100644 test/geometries/boost_array_as_point.vcproj delete mode 100644 test/geometries/boost_fusion.vcproj delete mode 100644 test/geometries/boost_polygon.vcproj delete mode 100644 test/geometries/boost_polygon_overlay.vcproj delete mode 100644 test/geometries/boost_range.vcproj delete mode 100644 test/geometries/box.vcproj delete mode 100644 test/geometries/concepts/check.sln delete mode 100644 test/geometries/concepts/check.vcproj delete mode 100644 test/geometries/custom_linestring.vcproj delete mode 100644 test/geometries/geometries_tests.sln delete mode 100644 test/geometries/segment.vcproj delete mode 100644 test/io/wkt/io_wkt_tests.sln delete mode 100644 test/io/wkt/wkt.vcproj delete mode 100644 test/iterators/closing_iterator.vcproj delete mode 100644 test/iterators/ever_circling_iterator.vcproj delete mode 100644 test/iterators/iterators.sln delete mode 100644 test/multi/algorithms/multi_area.vcproj delete mode 100644 test/multi/algorithms/multi_centroid.vcproj delete mode 100644 test/multi/algorithms/multi_convert.vcproj delete mode 100644 test/multi/algorithms/multi_convex_hull.vcproj delete mode 100644 test/multi/algorithms/multi_correct.vcproj delete mode 100644 test/multi/algorithms/multi_covered_by.vcproj delete mode 100644 test/multi/algorithms/multi_difference.vcproj create mode 100644 test/multi/algorithms/multi_difference_spike.cpp delete mode 100644 test/multi/algorithms/multi_disjoint.vcproj delete mode 100644 test/multi/algorithms/multi_distance.vcproj delete mode 100644 test/multi/algorithms/multi_envelope.vcproj delete mode 100644 test/multi/algorithms/multi_equals.vcproj delete mode 100644 test/multi/algorithms/multi_for_each.vcproj delete mode 100644 test/multi/algorithms/multi_intersection.vcproj delete mode 100644 test/multi/algorithms/multi_length.vcproj delete mode 100644 test/multi/algorithms/multi_num_geometries.vcproj delete mode 100644 test/multi/algorithms/multi_num_interior_rings.vcproj delete mode 100644 test/multi/algorithms/multi_num_points.vcproj delete mode 100644 test/multi/algorithms/multi_perimeter.vcproj delete mode 100644 test/multi/algorithms/multi_reverse.vcproj delete mode 100644 test/multi/algorithms/multi_simplify.vcproj delete mode 100644 test/multi/algorithms/multi_touches.vcproj delete mode 100644 test/multi/algorithms/multi_transform.vcproj delete mode 100644 test/multi/algorithms/multi_union.vcproj delete mode 100644 test/multi/algorithms/multi_unique.vcproj delete mode 100644 test/multi/algorithms/multi_within.vcproj delete mode 100644 test/multi/algorithms/overlay/multi_overlay.sln delete mode 100644 test/multi/algorithms/overlay/multi_traverse.vcproj delete mode 100644 test/multi/io/dsv/dsv.sln delete mode 100644 test/multi/io/dsv/dsv.vcproj delete mode 100644 test/multi/io/wkt/io_wkt_tests.sln delete mode 100644 test/multi/io/wkt/wkt.vcproj delete mode 100644 test/multi/multi_tests.sln delete mode 100644 test/policies/compare.vcproj delete mode 100644 test/policies/policy_tests.sln delete mode 100644 test/robustness/convex_hull/random_multi_points.sln delete mode 100644 test/robustness/convex_hull/random_multi_points.vcproj delete mode 100644 test/robustness/overlay/buffer/recursive_polygons_buffer.sln delete mode 100644 test/robustness/overlay/buffer/recursive_polygons_buffer.vcproj delete mode 100644 test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.sln delete mode 100644 test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.vcproj delete mode 100644 test/strategies/cross_track.vcproj delete mode 100644 test/strategies/haversine.vcproj delete mode 100644 test/strategies/projected_point.vcproj delete mode 100644 test/strategies/pythagoras.vcproj delete mode 100644 test/strategies/segment_intersection.vcproj delete mode 100644 test/strategies/segment_intersection_collinear.vcproj delete mode 100644 test/strategies/spherical_side.vcproj delete mode 100644 test/strategies/strategies_tests.sln delete mode 100644 test/strategies/transform_cs.vcproj delete mode 100644 test/strategies/transformer.vcproj delete mode 100644 test/strategies/within.vcproj delete mode 100644 test/ttmath.vsprops delete mode 100644 test/util/as_range.vcproj delete mode 100644 test/util/calculation_type.vcproj delete mode 100644 test/util/for_each_coordinate.vcproj delete mode 100644 test/util/rational.vcproj delete mode 100644 test/util/select_most_precise.vcproj delete mode 100644 test/util/util_tests.sln delete mode 100644 test/util/write_dsv.vcproj delete mode 100644 test/views/box_view.vcproj delete mode 100644 test/views/closeable_view.vcproj delete mode 100644 test/views/reversible_closeable.vcproj delete mode 100644 test/views/reversible_view.vcproj delete mode 100644 test/views/segment_view.vcproj delete mode 100644 test/views/views.sln diff --git a/doc/doxy/Doxyfile b/doc/doxy/Doxyfile index 880e69b0c..2cd86526b 100644 --- a/doc/doxy/Doxyfile +++ b/doc/doxy/Doxyfile @@ -54,6 +54,7 @@ ALIASES = qbk{1}="\xmlonly \1 \endxmlonly" \ tparam_box="Any type fulfilling a Box Concept" \ tparam_box_or_segment="Any type fulfilling a Box Concept or a Segment Concept" \ tparam_calculation="numeric type for calculation (e.g. high precision); if [*void] then it is extracted automatically from the coordinate type and (if necessary) promoted to floating point" \ + tparam_radius="numeric type for radius (of sphere, earth)" \ tparam_container="container type, for example std::vector, std::deque" \ tparam_dimension_required="Dimension, this template parameter is required. Should contain \\[0 .. n-1\\] for an n-dimensional geometry" \ tparam_first_point="first point type" \ diff --git a/doc/doxy/doxygen_input/sourcecode/boost.vsprops b/doc/doxy/doxygen_input/sourcecode/boost.vsprops deleted file mode 100644 index 68eaf1ffa..000000000 --- a/doc/doxy/doxygen_input/sourcecode/boost.vsprops +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/doc/doxy/doxygen_input/sourcecode/doxygen_1.vcproj b/doc/doxy/doxygen_input/sourcecode/doxygen_1.vcproj deleted file mode 100644 index 72b68d7b6..000000000 --- a/doc/doxy/doxygen_input/sourcecode/doxygen_1.vcproj +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/doxy/doxygen_input/sourcecode/doxygen_2.vcproj b/doc/doxy/doxygen_input/sourcecode/doxygen_2.vcproj deleted file mode 100644 index 78e45ef4e..000000000 --- a/doc/doxy/doxygen_input/sourcecode/doxygen_2.vcproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/doxy/doxygen_input/sourcecode/doxygen_3.vcproj b/doc/doxy/doxygen_input/sourcecode/doxygen_3.vcproj deleted file mode 100644 index 0a326ba5e..000000000 --- a/doc/doxy/doxygen_input/sourcecode/doxygen_3.vcproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/doxy/doxygen_input/sourcecode/doxygen_4.vcproj b/doc/doxy/doxygen_input/sourcecode/doxygen_4.vcproj deleted file mode 100644 index d65ca80c1..000000000 --- a/doc/doxy/doxygen_input/sourcecode/doxygen_4.vcproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/doxy/doxygen_input/sourcecode/doxygen_5.vcproj b/doc/doxy/doxygen_input/sourcecode/doxygen_5.vcproj deleted file mode 100644 index 23505e8c9..000000000 --- a/doc/doxy/doxygen_input/sourcecode/doxygen_5.vcproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/doxy/doxygen_input/sourcecode/doxygen_examples.sln b/doc/doxy/doxygen_input/sourcecode/doxygen_examples.sln deleted file mode 100644 index d7fd0b326..000000000 --- a/doc/doxy/doxygen_input/sourcecode/doxygen_examples.sln +++ /dev/null @@ -1,43 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxygen_1", "doxygen_1.vcproj", "{861F130D-2849-4B50-B240-049DBD9D3F18}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxygen_2", "doxygen_2.vcproj", "{6CF6A521-57E0-4DA4-9D17-ED5D29E4208C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxygen_3", "doxygen_3.vcproj", "{45D4139F-BC5B-4D48-BAB8-9901C53ECCC9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxygen_4", "doxygen_4.vcproj", "{CBEDAEC7-EC87-4F91-9C45-F9505A052A44}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doxygen_5", "doxygen_5.vcproj", "{0CDE9E15-C937-4D05-B9BF-A2D96B8EAD33}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {861F130D-2849-4B50-B240-049DBD9D3F18}.Debug|Win32.ActiveCfg = Debug|Win32 - {861F130D-2849-4B50-B240-049DBD9D3F18}.Debug|Win32.Build.0 = Debug|Win32 - {861F130D-2849-4B50-B240-049DBD9D3F18}.Release|Win32.ActiveCfg = Release|Win32 - {861F130D-2849-4B50-B240-049DBD9D3F18}.Release|Win32.Build.0 = Release|Win32 - {6CF6A521-57E0-4DA4-9D17-ED5D29E4208C}.Debug|Win32.ActiveCfg = Debug|Win32 - {6CF6A521-57E0-4DA4-9D17-ED5D29E4208C}.Debug|Win32.Build.0 = Debug|Win32 - {6CF6A521-57E0-4DA4-9D17-ED5D29E4208C}.Release|Win32.ActiveCfg = Release|Win32 - {6CF6A521-57E0-4DA4-9D17-ED5D29E4208C}.Release|Win32.Build.0 = Release|Win32 - {45D4139F-BC5B-4D48-BAB8-9901C53ECCC9}.Debug|Win32.ActiveCfg = Debug|Win32 - {45D4139F-BC5B-4D48-BAB8-9901C53ECCC9}.Debug|Win32.Build.0 = Debug|Win32 - {45D4139F-BC5B-4D48-BAB8-9901C53ECCC9}.Release|Win32.ActiveCfg = Release|Win32 - {45D4139F-BC5B-4D48-BAB8-9901C53ECCC9}.Release|Win32.Build.0 = Release|Win32 - {CBEDAEC7-EC87-4F91-9C45-F9505A052A44}.Debug|Win32.ActiveCfg = Debug|Win32 - {CBEDAEC7-EC87-4F91-9C45-F9505A052A44}.Debug|Win32.Build.0 = Debug|Win32 - {CBEDAEC7-EC87-4F91-9C45-F9505A052A44}.Release|Win32.ActiveCfg = Release|Win32 - {CBEDAEC7-EC87-4F91-9C45-F9505A052A44}.Release|Win32.Build.0 = Release|Win32 - {0CDE9E15-C937-4D05-B9BF-A2D96B8EAD33}.Debug|Win32.ActiveCfg = Debug|Win32 - {0CDE9E15-C937-4D05-B9BF-A2D96B8EAD33}.Debug|Win32.Build.0 = Debug|Win32 - {0CDE9E15-C937-4D05-B9BF-A2D96B8EAD33}.Release|Win32.ActiveCfg = Release|Win32 - {0CDE9E15-C937-4D05-B9BF-A2D96B8EAD33}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/doc/html/img/index/rtree/build_non_ovl.png b/doc/html/img/index/rtree/build_non_ovl.png index 8bcb0d675abf002c07c608565900c9633f52b6e5..4aaedfe36da5e447a8de3d3452b09ec56fbe67af 100644 GIT binary patch literal 21818 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 literal 13759 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 D_Lp#E+>b$f`0EC=YtFk46>Oa5hc#~xw)x% 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 diff --git a/doc/html/img/index/rtree/intersects_linestring.png b/doc/html/img/index/rtree/intersects_linestring.png new file mode 100644 index 0000000000000000000000000000000000000000..d7d84d210fb67ecbb1a51c9b6691419c85dff6b7 GIT binary patch literal 2753 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 literal 0 HcmV?d00001 diff --git a/doc/html/img/index/rtree/intersects_segment.png b/doc/html/img/index/rtree/intersects_segment.png new file mode 100644 index 0000000000000000000000000000000000000000..213af34bfec91e66b45c0fdbda13ced66ff44812 GIT binary patch literal 2228 zcmeAS@N?(olHy`uVBq!ia0y~yU^olH9Bd2>4AOhPWHK-?uqAoByDF!Z|}wy-L?>D4LmWmmNjOkyY}L= z)LHEth1wT-bSQcJne+bS(-luT4jp})XVP%`Z{2=&hLbfFEC;gxL{uMqTlRU1SAqoJ z-{R{M(~lobmwueY^Z3pC$A_N(SCD9`3^h<}5m>*m*Il}8`tg7LQ_TAerFN))`tj?L z6-|Lc}M{o$FmJbt18^L@Ly1&cU0H^Cn-uakG8Wp-qdA-%VS-aWnsBrIR}Igw&EP zc|UPJyL$c0gv$(@ePW;9y0%ZruX#^XrobY`g95x=r_(#wUW6OCFy}1T@hXxtc1^{> zRJ-^4>)#!zw969md6iwTAR&mGfmf8XD`xpdU~WdT8I zH+9W-z2tD1+;mcMXMvQ7?u@)5sVN7amT`Ws-(UAn(rL%lP}y$9w3Drty#F3;eEOLG zV2Fp;r2jh~vK6OWKHgdIZ|@()MOu+3K5xJG>VZ!BiR7$usYMDiE=|1LkkG-#;%uTI z0d_4%TZV&yf|LNyMFtmUy#?)IC|VD%I3*-f5*Cvhy3 zIcW2n&+;szO`3M>rROav=XWh^f4$*_+Sc0mBB>_F^M1{nSTB3A9LVH&wqZkM=PWMs zIc*7k;^&rb+RSdjTd?Hv6eH&+R;4Yc6U>)Oa!b!H{#da6_A<_8G0P>}1s?5Pps%*= zuj|qJLyuPenLa;py78$yH*}Y0x*KFS*Dg0cmF0bE_36y0g!hi0+)sP-%;sBMed_y! z*PX9zj%-%7QI_y4UY8)3Y@OC29jxcSONe3l$rEvff3_UY`kr-fmVn$lCxbc5ehV0> z`UmPhHZh%?y!XYY&$E@!S$Zzo{bYya8^Kw2bISUrO=GY)+joYy=W^Amv^nb6&nB#W zJN==FI+wb)X;%Bu(=orJs&;Bmy?mwRYTY77tM_a6H)L?Ixio*Bu;!ZfpAI$_=Bt~v zCjFbcx?tz3$n5vGz4E1(YsMN_Ps(2ZPwsv6mbdgf&To{qKz4!4T7kdD^N3@*$L71x;F zmvJt?x2|Bfg?aDgkaKae2Q;~-@0ME}%^1!1@wv%d&gEZki(2q1EZ4j+PhH))tXfjU z!gp1|vJ6$miz)_v%I%C78C;*4T)qBzzh2C&wv;@U!|(ipudr^-H`uPW@w=Li`2M0< z&sv0~e=6O7CpJUG_1;{YW4B&wa$ByO)0U97y5s%32QpdfSL=iXma>=}xfbx@X6(Y~ z`|lMWMJ=AVHD>N*26quAhDD4HCJYxDS{GEc#b<;)HStJU7a7W|z5F2C!v>H?1b7ve zGxj~ay6o!Fwks0i{hJ<{D9n&tXSna7$zg#!R=X8T`9+;Hp1JAIzHqAg+U0fc_P77} z;N}Y@G2bmG6lOuYtKk zu~lxDh4;$1A}Nuld!nyfg2K^pt;|-vDOKg_%N;k$)UxEfzj``!x#Tf{LyX2ZObSDc z>S8V0%kqxY&Hs9QRYG6IzpyPAqx>fC*82QLC(*%=`O6~{_k)QCGJ_`Hn7L&CQ!}1| zS$A8LAB$P=fc8)k@GJh1Gj;K)OTSiHS=!yV{(iJzR`c7~%bHJ25^GZ}w+nC4JM!}R z>$Tql{3b`P(G_Jn_oqhnt5VoolgpBNUrm0mF@Bm}FYKHj^3vpd+FaeuaqngpO))x| z=_T&xx%}pRy>F6*QVcH40+28OF&GvxcCcA=UhQj0-Q589J7| zH*vXCcVxqNt2uMnt`>i(S~Q34EXVT|UtRpb-f{@sGw1S}P=%1iem$?N_xk?IKH=-n z+Z7*P>wo;s?&aLIZ!~9IxtbP0l+XkK2vi#+ literal 0 HcmV?d00001 diff --git a/doc/html/img/index/rtree/query_non_ovl.png b/doc/html/img/index/rtree/query_non_ovl.png index 537265fab0e3196f5cd53bbe0bf723f68525848b..2594aea4aaffd9e957fff511cbcb12d71c73a963 100644 GIT binary patch literal 26830 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 literal 18225 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 literal 17247 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 F1OVn)Qn&yB diff --git a/doc/index/introduction.qbk b/doc/index/introduction.qbk index 9f1a61886..cb7bcf1d3 100644 --- a/doc/index/introduction.qbk +++ b/doc/index/introduction.qbk @@ -49,11 +49,11 @@ This method is faster and results in R-trees with better internal structure. Thi The examples of structures of trees created by use of different algorithms and exemplary operations times are presented below. [table -[[] [Linear algorithm] [Quadratic algorithm] [R*-tree] [Packing algorithm (trunk)]] +[[] [Linear algorithm] [Quadratic algorithm] [R*-tree] [Packing algorithm]] [[*Example structure*] [[$img/index/rtree/linear.png]] [[$img/index/rtree/quadratic.png]] [[$img/index/rtree/rstar.png]] [[$img/index/rtree/bulk.png]]] [[*1M Values inserts*] [1.76s] [2.47s] [6.19s] [1.67s]] [[*100k spatial queries*] [2.21s] [0.51s] [0.12s] [0.07s]] -[[*100k knn queries*] [6.37s] [2.09s] [0.64s] [0.52]] +[[*100k knn queries*] [6.37s] [2.09s] [0.64s] [0.52s]] ] The performance of the R-tree for different values of Max parameter and Min=0.5*Max is presented in the table below. @@ -74,25 +74,31 @@ Key features of this implementation of the __rtree__ are: * capable to store arbitrary __value__ type, * three different balancing algorithms - linear, quadratic or rstar, +* creation using packing algorithm, * parameters (including maximal and minimal number of elements) may be passed as compile- or run-time parameters, in compile-time version nodes elements are stored in static-size containers, * advanced queries - e.g. search for 5 nearest Values to some point and intersecting some Geometry but not within the other one, +* iterative queries - by use of iterators, * C++11 conformant: move semantics, stateful allocators, * capable to store __value__ type with no default constructor, * in-memory storage (shared memory by use of Boost.Interprocess allocator). -[heading Planned and experimental features] +[heading Planned features] Below you can find features that will (or probably will) be added in the future releases: +[/ Done * rstar optimization (planned for release in Boost 1.55), * bulk loading (planned for release in Boost 1.55), -* iterative queries - query iterators / type-erased query iterators (experimental), -* path/ray query predicate - search for Values along Segment or LineString, closest to the starting point (experimental), -* persistent storage. -[/ * 'reversed' spatial predicates or additional spatial predicates like contains(), -* other geometries as Values, e.g. NSpheres. Rings would probably require using move semantics instead of copying +* iterative queries - query iterators / type-erased query iterators, +/] +* path/ray query predicate - search for Values along Segment or LineString, closest to the starting point, +* user-defined distance calculation in nearest() predicate, +* serialization, +* persistent storage. +[/ Maybe +* other geometries as Indexables, e.g. NSpheres. Rings would probably require using move semantics instead of copying * bounding tree - rtree variation capable to use other Geometries as bounds, e.g. NSpheres, Rings/convex polygons/ (moving required), Capsules, Elipses, Variants etc. * moving instead of copying + optimizations for movable/nonthrowing/trivialy copied elements * passing more than one nearest/path predicate - "returned value is one of k1 nearest values to p1 and ... and one of kN nearest values to pN" diff --git a/doc/index/rtree/query.qbk b/doc/index/rtree/query.qbk index 493654602..7f10db949 100644 --- a/doc/index/rtree/query.qbk +++ b/doc/index/rtree/query.qbk @@ -24,32 +24,44 @@ For example queries may be used to retrieve Values: [h4 Performing a query] -There are three ways to perform a query presented below. All of them returns `__value__`s intersecting some -region defined as a `__box__`. +There are various ways to perform a query. They are presented below. +All of them returns `__value__`s intersecting some region defined as a `__box__`. -Method call +Member function call std::vector<__value__> returned_values; __box__ box_region(...); rt.query(bgi::intersects(box_region), std::back_inserter(returned_values)); -Function call +Free function call std::vector<__value__> returned_values; __box__ box_region(...); - index::query(rt, bgi::intersects(box_region), std::back_inserter(returned_values)); + bgi::query(rt, bgi::intersects(box_region), std::back_inserter(returned_values)); -Use of pipe operator generating a range +Range generated by `operator|` __box__ box_region(...); - BOOST_FOREACH(__value__ & v, rt | index::adaptors::queried(bgi::intersects(box_region))) + BOOST_FOREACH(__value__ & v, rt | bgi::adaptors::queried(bgi::intersects(box_region))) ; // do something with v +Query iterators returned by member functions + + std::vector<__value__> returned_values; + __box__ box_region(...); + std::copy(rt.qbegin(bgi::intersects(box_region)), rt.qend(), std::back_inserter(returned_values)); + +Query iterators returned by free functions + + std::vector<__value__> returned_values; + __box__ box_region(...); + std::copy(bgi::qbegin(rt, bgi::intersects(box_region)), bgi::qend(rt), std::back_inserter(returned_values)); + [h4 Spatial predicates] Queries using spatial predicates returns `__value__`s which are related somehow to some Geometry - box, polygon, etc. -Names of spatial predicates correspond to names of __boost_geometry__ algorithms. Examples of some -basic queries may be found in tables below. The query region and result `Value`s are orange. +Names of spatial predicates correspond to names of __boost_geometry__ algorithms (boolean operations). +Examples of some basic queries may be found in the tables below. The query region and result `Value`s are orange. [table [[intersects(Box)] [covered_by(Box)] [disjoint(Box)] [overlaps(Box)] [within(Box)]] @@ -57,15 +69,17 @@ basic queries may be found in tables below. The query region and result `Value`s ] [table -[[intersects(Ring)] [intersects(Polygon)] [intersects(MultiPolygon)]] -[[[$img/index/rtree/intersects_ring.png]] [[$img/index/rtree/intersects_poly.png]] [[$img/index/rtree/intersects_mpoly.png]]] +[[intersects(Ring)] [intersects(Polygon)] [intersects(MultiPolygon)] [intersects(Segment)] [intersects(Linestring)]] +[[[$img/index/rtree/intersects_ring.png]] [[$img/index/rtree/intersects_poly.png]] [[$img/index/rtree/intersects_mpoly.png]] [[$img/index/rtree/intersects_segment.png]] [[$img/index/rtree/intersects_linestring.png]]] ] -To use a spatial predicate one may use one of the functions defined in `boost::geometry::index` namespace. +Spatial predicates are generated by functions defined in `boost::geometry::index` namespace. - rt.query(index::intersects(box), std::back_inserter(result)); + rt.query(index::contains(box), std::back_inserter(result)); rt.query(index::covered_by(box), std::back_inserter(result)); + rt.query(index::covers(box), std::back_inserter(result)); rt.query(index::disjont(box), std::back_inserter(result)); + rt.query(index::intersects(box), std::back_inserter(result)); rt.query(index::overlaps(box), std::back_inserter(result)); rt.query(index::within(box), std::back_inserter(result)); @@ -75,39 +89,21 @@ All spatial predicates may be negated, e.g.: // the same as rt.query(index::disjoint(box), std::back_inserter(result)); -[h4 Distance predicates] - -[h5 Nearest neighbours queries] +[h4 Nearest neighbours queries] Nearest neighbours queries returns `__value__`s which are closest to some point in space. -Additionally it is possible to define how the distance to the `Value` should be calculated. -The example of knn query is presented below. 5 `__value__`s nearest to some point are orange. +The example of knn query is presented below. 5 `__value__`s nearest to the point are orange. [$img/index/rtree/knn.png] -[h5 k nearest neighbours] - -There are three ways of performing knn queries. Following queries returns -`k` `__value__`s closest to some point in space. For `__box__`es -`__indexable__`s the distance to the nearest point is calculated by default. - -Method call +To perform the knn query one must pass the nearest predicate generated by the +`nearest()` function defined in `boost::geometry::index` namespace. +The following query returns `k` `__value__`s closest to some point in space. +For non-point `__indexable__`s the shortest distance is calculated. std::vector<__value__> returned_values; __point__ pt(...); - rt.query(index::nearest(pt, k), std::back_inserter(returned_values)); - -Function call - - std::vector<__value__> returned_values; - __point__ pt(...); - index::query(rt, index::nearest(pt, k), std::back_inserter(returned_values)); - -Use of `operator |` - - __point__ pt(...); - BOOST_FOREACH(__value__ & v, rt | index::adaptors::queried(index::nearest(pt, k))) - ; // do something with v + rt.query(bgi::nearest(pt, k), std::back_inserter(returned_values)); [h4 User-defined unary predicate] @@ -177,6 +173,19 @@ Of course it's possible to connect different types of predicates together. BOOST_FOREACH(Value & v, rt | index::adaptors::queried(index::nearest(pt, k) && index::covered_by(b))) ; // do something with v +[h4 Breaking or pausing the query] + +The query performed using query iterators may be paused and resumed if needed, e.g. when the query takes too long, +or stopped at some point, e.g when all interesting values were gathered. + + for ( Rtree::const_query_iterator it = tree.qbegin(bgi::nearest(pt, 10000)) ; + it != tree.qend() ; ++it ) + { + // do something with value + if ( has_enough_nearest_values() ) + break; + } + [h4 Inserting query results into the other R-tree] There are several ways of inserting Values returned by a query to the other R-tree container. diff --git a/doc/make_qbk.py b/doc/make_qbk.py index c776ca5f7..ae8adfda7 100755 --- a/doc/make_qbk.py +++ b/doc/make_qbk.py @@ -31,10 +31,12 @@ cmd = cmd + " --convenience_header_path ../../../boost/geometry/" cmd = cmd + " --convenience_headers geometry.hpp,geometries/geometries.hpp,multi/multi.hpp" cmd = cmd + " --skip_namespace boost::geometry::" cmd = cmd + " --copyright src/copyright_block.qbk" +cmd = cmd + " --output_member_variables false" cmd = cmd + " > generated/%s.qbk" def call_doxygen(): os.chdir("doxy"); + os.system("rm -f doxygen_output/xml/*.xml") os.system(doxygen_cmd) os.chdir("..") diff --git a/doc/quickref.xml b/doc/quickref.xml index 87952f4d7..987cad233 100644 --- a/doc/quickref.xml +++ b/doc/quickref.xml @@ -680,6 +680,8 @@ remove(Iterator, Iterator) remove(Range const &) query(Predicates const &, OutIter) + qbegin(Predicates const &) + qend() size() empty() clear() @@ -701,6 +703,8 @@ remove(rtree<...> &, Iterator, Iterator) remove(rtree<...> &, Range const &) query(rtree<...> const &, Predicates const &, OutIter) + qbegin(rtree<...> const &, Predicates const &) + qend(rtree<...> const &) clear(rtree<...> &) size(rtree<...> const &) empty(rtree<...> const &) @@ -728,7 +732,9 @@ Predicates (boost::geometry::index::) + contains(Geometry const &) covered_by(Geometry const &) + covers(Geometry const &) disjoint(Geometry const &) intersects(Geometry const &) overlaps(Geometry const &) diff --git a/doc/release_notes.qbk b/doc/release_notes.qbk index 3f0779452..a5842810a 100644 --- a/doc/release_notes.qbk +++ b/doc/release_notes.qbk @@ -13,6 +13,42 @@ [section:release_notes Release Notes] +[/=================] +[heading Boost 1.55] +[/=================] + +[*Additional functionality] + +* Added centroid for segment type +* Added intersects() and disjoints() for Segment-Box and Linestring-Box +* Added rtree creation using packing algorithm +* Added contains() and covers() spatial query predicates +* Added iterative queries + +[*Documentation] + +[*Bugfixes] + +* In some cases .back() or .clear() was called, violating the usage of Concepts. Fixed for the reported cases + +[*Solved tickets] + +* [@https://svn.boost.org/trac/boost/ticket/6958 6958] Intersection generates self-intersection. Caused by spike, fixed +* [@https://svn.boost.org/trac/boost/ticket/8364 8364] Invalid input exception, caused by spikes in previous steps, fixed +* [@https://svn.boost.org/trac/boost/ticket/8365 8365] Invalid input exception, caused by spikes in previous steps, fixed +* [@https://svn.boost.org/trac/boost/ticket/8969 8969] boost::geometry::model::point single argument constructor should be explicit +* [@https://svn.boost.org/trac/boost/ticket/8825 8825] Patch adding member variable documentation to doxygen_xml2qbk +* [@https://svn.boost.org/trac/boost/ticket/8652 8652] Intersection fails for triangle-triangle intersection. Caused by spike, fixed +* [@https://svn.boost.org/trac/boost/ticket/9047 9047] Boost files that include themselves (strategies/intersection.hpp), fixed + +[*Internal changes] + +* Distance-strategy TODO +* Transform-strategy TODO +* Spikes (could be generated in difference) in integer-based overlays are now avoided during generation +* Cleanup, removed old MSVC2005 project files, let all tests pass green (also in extensions) +* R*-tree balancing algorithm optimized + [/=================] [heading Boost 1.54] [/=================] diff --git a/doc/src/docutils/tools/doxygen_xml2qbk/configuration.hpp b/doc/src/docutils/tools/doxygen_xml2qbk/configuration.hpp index 3cb8ddf83..cb21cfdca 100644 --- a/doc/src/docutils/tools/doxygen_xml2qbk/configuration.hpp +++ b/doc/src/docutils/tools/doxygen_xml2qbk/configuration.hpp @@ -29,10 +29,15 @@ struct configuration std::vector convenience_headers; std::string skip_namespace; + bool output_member_variables; enum output_style_type {def, alt}; output_style_type output_style; - configuration() : output_style(def) {} + + configuration() + : output_style(def) + , output_member_variables(false) + {} }; diff --git a/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_elements.hpp b/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_elements.hpp index 04d50dcfa..43fc98bce 100644 --- a/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_elements.hpp +++ b/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_elements.hpp @@ -164,7 +164,7 @@ struct class_or_struct : public element std::vector functions; std::vector typedefs; - std::vector variables; + std::vector variables; std::vector base_classes; }; diff --git a/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml2qbk.cpp b/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml2qbk.cpp index 87ac68e07..f3a67fbec 100644 --- a/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml2qbk.cpp +++ b/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml2qbk.cpp @@ -42,7 +42,7 @@ #include #include -static const std::string version = "1.1.0"; +static const std::string version = "1.1.1"; inline std::string program_description(bool decorated) { @@ -95,6 +95,8 @@ int main(int argc, char** argv) ("output_style", po::value(&output_style), "Docbook output style. Available values: 'alt'") + ("output_member_variables", po::value(&config.output_member_variables), + "Output member variables inside the class") ; po::variables_map varmap; diff --git a/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml_parser.hpp b/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml_parser.hpp index 0a98f4296..119a57364 100644 --- a/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml_parser.hpp +++ b/doc/src/docutils/tools/doxygen_xml2qbk/doxygen_xml_parser.hpp @@ -691,13 +691,44 @@ static void parse(rapidxml::xml_node<>* node, configuration const& config, docum } else if (kind == "variable") { - if (boost::equals(get_attribute(node, "static"), "yes") - && boost::equals(get_attribute(node, "mutable"), "no") - && boost::equals(get_attribute(node, "prot"), "public")) + if (boost::equals(get_attribute(node, "prot"), "public")) { - std::string name = parse_named_node(node->first_node(), "name"); - doc.cos.variables.push_back(base_element(name)); - doc.cos.variables.back().id = id; + parameter p; + p.id = id; + for(rapidxml::xml_node<>* var_node = node->first_node(); var_node; var_node=var_node->next_sibling()) + { + if(boost::equals(var_node->name(), "name")) + { + p.name = var_node->value(); + } + else if(boost::equals(var_node->name(), "type")) + { + get_contents(var_node->first_node(), p.fulltype); + p.type = p.fulltype; + //boost::replace_all(p.type, " const", ""); + //boost::trim(p.type); + //boost::replace_all(p.type, "&", ""); + //boost::replace_all(p.type, "*", ""); + boost::trim(p.type); + + // If alt output is used retrieve type with QBK links + if ( configuration::alt == config.output_style ) + { + p.fulltype_without_links = p.fulltype; + p.fulltype.clear(); + parse_para(var_node->first_node(), config, p.fulltype, p.skip); + } + } + else if(boost::equals(var_node->name(), "briefdescription")) + { + parse_para(var_node->first_node(), config, p.brief_description, p.skip); + } + else if(p.brief_description.empty() && boost::equals(var_node->name(), "detaileddescription")) + { + parse_para(var_node->first_node(), config, p.brief_description, p.skip); + } + } + doc.cos.variables.push_back(p); } } diff --git a/doc/src/docutils/tools/doxygen_xml2qbk/quickbook_output.hpp b/doc/src/docutils/tools/doxygen_xml2qbk/quickbook_output.hpp index 34295b7d4..0f2d9de2a 100644 --- a/doc/src/docutils/tools/doxygen_xml2qbk/quickbook_output.hpp +++ b/doc/src/docutils/tools/doxygen_xml2qbk/quickbook_output.hpp @@ -544,9 +544,38 @@ void quickbook_output(class_or_struct const& cos, configuration const& config, s out << std::endl; } - out << "{" << std::endl - << " // ..." << std::endl - << "};" << std::endl + out << "{" << std::endl; + if (! cos.variables.empty() && config.output_member_variables) + { + size_t maxlength = 0; + BOOST_FOREACH(parameter const& p, cos.variables) + { + if (! p.skip) + { + size_t length = 6 + p.fulltype.size() + p.name.size(); + if (length > maxlength) maxlength = length; + } + } + BOOST_FOREACH(parameter const& p, cos.variables) + { + if (! p.skip) + { + size_t length = 4 + p.fulltype.size() + p.name.size(); + out << " " << p.fulltype << " " << p.name << ";"; + if (! p.brief_description.empty()) + { + while(length++ < maxlength) out << " "; + out << "// " << p.brief_description; + } + out << std::endl; + } + } + } + else + { + out << " // ..." << std::endl; + } + out << "};" << std::endl << "``" << std::endl << std::endl; quickbook_markup(cos.qbk_markup, markup_after, markup_synopsis, out); diff --git a/doc/src/examples/algorithms/length_with_strategy.cpp b/doc/src/examples/algorithms/length_with_strategy.cpp index 99c15fb19..4a643c894 100644 --- a/doc/src/examples/algorithms/length_with_strategy.cpp +++ b/doc/src/examples/algorithms/length_with_strategy.cpp @@ -24,7 +24,7 @@ int main() line.push_back(P(5, 52)); double const mean_radius = 6371.0; /*< [@http://en.wikipedia.org/wiki/Earth_radius Wiki] >*/ std::cout << "length is " - << length(line, strategy::distance::haversine

(mean_radius) ) + << length(line, strategy::distance::haversine(mean_radius) ) << " kilometers " << std::endl; return 0; diff --git a/doc/src/examples/algorithms/transform_with_strategy.cpp b/doc/src/examples/algorithms/transform_with_strategy.cpp index df44d6336..d55e5e2d1 100644 --- a/doc/src/examples/algorithms/transform_with_strategy.cpp +++ b/doc/src/examples/algorithms/transform_with_strategy.cpp @@ -25,17 +25,17 @@ int main() // Translate over (1.5, 1.5) point_type p2; - trans::translate_transformer translate(1.5, 1.5); + trans::translate_transformer translate(1.5, 1.5); boost::geometry::transform(p1, p2, translate); // Scale with factor 3.0 point_type p3; - trans::scale_transformer scale(3.0); + trans::scale_transformer scale(3.0); boost::geometry::transform(p1, p3, scale); // Rotate with respect to the origin (0,0) over 90 degrees (clockwise) point_type p4; - trans::rotate_transformer rotate(90.0); + trans::rotate_transformer rotate(90.0); boost::geometry::transform(p1, p4, rotate); std::cout diff --git a/example/06_a_transformation_example.cpp b/example/06_a_transformation_example.cpp index 367d5e16f..01a560173 100644 --- a/example/06_a_transformation_example.cpp +++ b/example/06_a_transformation_example.cpp @@ -29,7 +29,7 @@ int main() point_2d p2; // Example: translate a point over (5,5) - strategy::transform::translate_transformer translate(5, 5); + strategy::transform::translate_transformer translate(5, 5); transform(p, p2, translate); std::cout << "transformed point " << boost::geometry::dsv(p2) << std::endl; diff --git a/example/06_b_transformation_example.cpp b/example/06_b_transformation_example.cpp index 5dd972548..db125ff53 100644 --- a/example/06_b_transformation_example.cpp +++ b/example/06_b_transformation_example.cpp @@ -127,25 +127,25 @@ int main() svg.put(g1, "g1"); // G1 - Translate -> G2 - translate_transformer translate(0, 250); + translate_transformer translate(0, 250); model::polygon g2; transform(g1, g2, translate); std::clog << "translated:\t" << boost::geometry::dsv(g2) << std::endl; svg.put(g2, "g2=g1.translate(0,250)"); // G2 - Scale -> G3 - scale_transformer scale(0.5, 0.5); + scale_transformer scale(0.5, 0.5); model::polygon g3; transform(g2, g3, scale); std::clog << "scaled:\t" << boost::geometry::dsv(g3) << std::endl; svg.put(g3, "g3=g2.scale(0.5,0.5)"); // G3 - Combine rotate and translate -> G4 - rotate_transformer rotate(45); + rotate_transformer rotate(45); // Compose matrix for the two transformation // Create transformer attached to the transformation matrix - ublas_transformer + ublas_transformer combined(boost::numeric::ublas::prod(rotate.matrix(), translate.matrix())); //combined(rotate.matrix()); diff --git a/example/07_a_graph_route_example.cpp b/example/07_a_graph_route_example.cpp index 735d2dfa7..5b476ffb5 100644 --- a/example/07_a_graph_route_example.cpp +++ b/example/07_a_graph_route_example.cpp @@ -306,7 +306,7 @@ int main() << std::fixed << std::setprecision(0); // To calculate distance, declare and construct a strategy with average earth radius - boost::geometry::strategy::distance::haversine haversine(6372795.0); + boost::geometry::strategy::distance::haversine haversine(6372795.0); // Main functionality: calculate shortest routes from/to all cities diff --git a/example/07_b_graph_route_example.cpp b/example/07_b_graph_route_example.cpp index 843a84e6f..5490dc5fb 100644 --- a/example/07_b_graph_route_example.cpp +++ b/example/07_b_graph_route_example.cpp @@ -293,7 +293,7 @@ int main() << std::fixed << std::setprecision(0); // To calculate distance, declare and construct a strategy with average earth radius - boost::geometry::strategy::distance::haversine haversine(6372795.0); + boost::geometry::strategy::distance::haversine haversine(6372795.0); // Main functionality: calculate shortest routes from/to all cities diff --git a/example/boost.vsprops b/example/boost.vsprops deleted file mode 100644 index e376ce44a..000000000 --- a/example/boost.vsprops +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/example/c04_b_custom_triangle_example.cpp b/example/c04_b_custom_triangle_example.cpp index a48100529..320dc6ede 100644 --- a/example/c04_b_custom_triangle_example.cpp +++ b/example/c04_b_custom_triangle_example.cpp @@ -38,10 +38,11 @@ BOOST_GEOMETRY_REGISTER_RING_TEMPLATED(triangle) namespace boost { namespace geometry { namespace dispatch { // Specializations of area dispatch structure, implement algorithm -template -struct area, S> +template +struct area, ring_tag> { - static inline double apply(triangle

const& t, S const&) + template + static inline double apply(triangle const& t, Strategy const&) { return 0.5 * ((get<0>(t[1]) - get<0>(t[0])) * (get<1>(t[2]) - get<1>(t[0])) - (get<0>(t[2]) - get<0>(t[0])) * (get<1>(t[1]) - get<1>(t[0]))); diff --git a/example/c08_custom_non_std_example.cpp b/example/c08_custom_non_std_example.cpp index 966c6298b..d60f4a079 100644 --- a/example/c08_custom_non_std_example.cpp +++ b/example/c08_custom_non_std_example.cpp @@ -65,41 +65,59 @@ class my_polygon // Adaption: implement iterator and range-extension, and register with Boost.Geometry // 1) implement iterator (const and non-const versions) -template +template struct custom_iterator : public boost::iterator_facade < - custom_iterator, + custom_iterator, my_point, boost::random_access_traversal_tag, - typename boost::geometry::add_const_if_c::type& + typename boost::mpl::if_ + < + boost::is_const, + my_point const, + my_point + >::type& > { // Constructor for begin() - explicit custom_iterator(typename boost::geometry::add_const_if_c::type& polygon) + explicit custom_iterator(MyPolygon& polygon) : m_polygon(&polygon) , m_index(0) {} // Constructor for end() - explicit custom_iterator(bool, typename boost::geometry::add_const_if_c::type& polygon) + explicit custom_iterator(bool, MyPolygon& polygon) : m_polygon(&polygon) , m_index(polygon.point_count()) {} + // Default constructor + explicit custom_iterator() + : m_polygon(NULL) + , m_index(-1) + {} + + typedef typename boost::mpl::if_ + < + boost::is_const, + my_point const, + my_point + >::type my_point_type; private: friend class boost::iterator_core_access; + typedef boost::iterator_facade < - custom_iterator, + custom_iterator, my_point, boost::random_access_traversal_tag, - typename boost::geometry::add_const_if_c::type& + my_point_type& > facade; - typename boost::geometry::add_const_if_c::type* m_polygon; + MyPolygon* m_polygon; int m_index; bool equal(custom_iterator const& other) const @@ -134,7 +152,7 @@ private: } // const and non-const dereference of this iterator - typename boost::geometry::add_const_if_c::type& dereference() const + my_point_type& dereference() const { return m_polygon->get_point(m_index); } @@ -150,12 +168,12 @@ namespace boost { template<> struct range_mutable_iterator { - typedef custom_iterator type; + typedef custom_iterator type; }; template<> struct range_const_iterator { - typedef custom_iterator type; + typedef custom_iterator type; }; // RangeEx @@ -168,24 +186,24 @@ namespace boost // 2b) free-standing function for Boost.Range ADP -inline custom_iterator range_begin(my_polygon& polygon) +inline custom_iterator range_begin(my_polygon& polygon) { - return custom_iterator(polygon); + return custom_iterator(polygon); } -inline custom_iterator range_begin(my_polygon const& polygon) +inline custom_iterator range_begin(my_polygon const& polygon) { - return custom_iterator(polygon); + return custom_iterator(polygon); } -inline custom_iterator range_end(my_polygon& polygon) +inline custom_iterator range_end(my_polygon& polygon) { - return custom_iterator(true, polygon); + return custom_iterator(true, polygon); } -inline custom_iterator range_end(my_polygon const& polygon) +inline custom_iterator range_end(my_polygon const& polygon) { - return custom_iterator(true, polygon); + return custom_iterator(true, polygon); } @@ -210,6 +228,14 @@ template<> struct resize } }; +template<> struct clear +{ + static inline void apply(my_polygon& polygon) + { + polygon.erase_all(); + } +}; + }}} @@ -225,8 +251,8 @@ BOOST_GEOMETRY_REGISTER_RING(my_polygon) void walk_using_iterator(my_polygon const& polygon) { - for (custom_iterator it = custom_iterator(polygon); - it != custom_iterator(true, polygon); + for (custom_iterator it = custom_iterator(polygon); + it != custom_iterator(true, polygon); ++it) { std::cout << boost::geometry::dsv(*it) << std::endl; diff --git a/example/c10_custom_cs_example.cpp b/example/c10_custom_cs_example.cpp index b71ad8976..6676955d7 100644 --- a/example/c10_custom_cs_example.cpp +++ b/example/c10_custom_cs_example.cpp @@ -56,7 +56,7 @@ namespace boost { namespace geometry { namespace strategy { namespace distance { template struct default_strategy { - typedef haversine type; + typedef haversine type; }; }}}}} // namespaces diff --git a/example/c11_custom_cs_transform_example.cpp b/example/c11_custom_cs_transform_example.cpp index 38a3f012a..896ee069a 100644 --- a/example/c11_custom_cs_transform_example.cpp +++ b/example/c11_custom_cs_transform_example.cpp @@ -32,9 +32,9 @@ template<> struct cs_tag { typedef cartesian_tag type; }; // 3: sample implementation of a shift // to convert coordinate system "cart" to "cart_shirted5" -template struct shift { + template inline bool apply(P1 const& p1, P2& p2) const { namespace bg = boost::geometry; @@ -52,16 +52,16 @@ namespace boost { namespace geometry { namespace strategy { namespace transform template struct default_strategy { - typedef shift type; + typedef shift type; }; }}}}} // namespaces // 5: implement a distance strategy between the two different ones -template struct shift_and_calc_distance { + template inline double apply(P1 const& p1, P2 const& p2) const { P2 p1_shifted; @@ -77,14 +77,14 @@ typedef boost::geometry::model::point point2; // 7: register the distance strategy namespace boost { namespace geometry { namespace strategy { namespace distance { namespace services { - template - struct tag > + template <> + struct tag { typedef strategy_tag_distance_point_point type; }; - template - struct return_type > + template + struct return_type { typedef double type; }; @@ -92,7 +92,7 @@ namespace boost { namespace geometry { namespace strategy { namespace distance { template <> struct default_strategy { - typedef shift_and_calc_distance type; + typedef shift_and_calc_distance type; }; diff --git a/example/ml01_multipolygon_simplify.vcproj b/example/ml01_multipolygon_simplify.vcproj deleted file mode 100644 index fe5492da9..000000000 --- a/example/ml01_multipolygon_simplify.vcproj +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/ml02_distance_strategy.vcproj b/example/ml02_distance_strategy.vcproj deleted file mode 100644 index 0b04ecfac..000000000 --- a/example/ml02_distance_strategy.vcproj +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/gd.vsprops b/example/with_external_libs/gd.vsprops deleted file mode 100644 index 209165c2e..000000000 --- a/example/with_external_libs/gd.vsprops +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/example/with_external_libs/postgresql.vsprops b/example/with_external_libs/postgresql.vsprops deleted file mode 100644 index 6a95d3e1c..000000000 --- a/example/with_external_libs/postgresql.vsprops +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/example/with_external_libs/qt.vsprops b/example/with_external_libs/qt.vsprops deleted file mode 100644 index 8de8e56ac..000000000 --- a/example/with_external_libs/qt.vsprops +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/example/with_external_libs/shapelib.vsprops b/example/with_external_libs/shapelib.vsprops deleted file mode 100644 index fcd579559..000000000 --- a/example/with_external_libs/shapelib.vsprops +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/example/with_external_libs/soci.vsprops b/example/with_external_libs/soci.vsprops deleted file mode 100644 index c397b1241..000000000 --- a/example/with_external_libs/soci.vsprops +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/example/with_external_libs/wxwidgets.vsprops b/example/with_external_libs/wxwidgets.vsprops deleted file mode 100644 index a5a0836fc..000000000 --- a/example/with_external_libs/wxwidgets.vsprops +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/example/with_external_libs/x01_qt_example.sln b/example/with_external_libs/x01_qt_example.sln deleted file mode 100644 index 6af3e9304..000000000 --- a/example/with_external_libs/x01_qt_example.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x01_qt_example", "x01_qt_example.vcproj", "{242C6ADC-3A10-4B69-81F7-5669E0582A8B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Debug|Win32.ActiveCfg = Debug|Win32 - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Debug|Win32.Build.0 = Debug|Win32 - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Release|Win32.ActiveCfg = Release|Win32 - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/example/with_external_libs/x01_qt_example.vcproj b/example/with_external_libs/x01_qt_example.vcproj deleted file mode 100644 index eba736e3f..000000000 --- a/example/with_external_libs/x01_qt_example.vcproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x02_gd_example.sln b/example/with_external_libs/x02_gd_example.sln deleted file mode 100644 index 1ab96a86f..000000000 --- a/example/with_external_libs/x02_gd_example.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x02_gd_example", "x02_gd_example.vcproj", "{A73F21AC-6F32-41A9-A86C-53BD4DC84B05}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A73F21AC-6F32-41A9-A86C-53BD4DC84B05}.Debug|Win32.ActiveCfg = Debug|Win32 - {A73F21AC-6F32-41A9-A86C-53BD4DC84B05}.Debug|Win32.Build.0 = Debug|Win32 - {A73F21AC-6F32-41A9-A86C-53BD4DC84B05}.Release|Win32.ActiveCfg = Release|Win32 - {A73F21AC-6F32-41A9-A86C-53BD4DC84B05}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/example/with_external_libs/x02_gd_example.vcproj b/example/with_external_libs/x02_gd_example.vcproj deleted file mode 100644 index 20471a0a6..000000000 --- a/example/with_external_libs/x02_gd_example.vcproj +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x03_a_soci_example.vcproj b/example/with_external_libs/x03_a_soci_example.vcproj deleted file mode 100644 index 2f6665a51..000000000 --- a/example/with_external_libs/x03_a_soci_example.vcproj +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x03_b_soci_example.vcproj b/example/with_external_libs/x03_b_soci_example.vcproj deleted file mode 100644 index 35781e542..000000000 --- a/example/with_external_libs/x03_b_soci_example.vcproj +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x03_c_soci_example.vcproj b/example/with_external_libs/x03_c_soci_example.vcproj deleted file mode 100644 index 05a4ae022..000000000 --- a/example/with_external_libs/x03_c_soci_example.vcproj +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x03_d_soci_example.vcproj b/example/with_external_libs/x03_d_soci_example.vcproj deleted file mode 100644 index d699d5186..000000000 --- a/example/with_external_libs/x03_d_soci_example.vcproj +++ /dev/null @@ -1,744 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x03_soci_examples.sln b/example/with_external_libs/x03_soci_examples.sln deleted file mode 100644 index 49ea1a3be..000000000 --- a/example/with_external_libs/x03_soci_examples.sln +++ /dev/null @@ -1,37 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x03_a_soci_example", "x03_a_soci_example.vcproj", "{C3B3143D-F354-4036-9DA1-5975D8A4F166}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x03_b_soci_example", "x03_b_soci_example.vcproj", "{5EFD08EE-10CB-4D3E-9907-4E9A7F3AB1C1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x03_c_soci_example", "x03_c_soci_example.vcproj", "{5EFD08FE-10CB-4D3E-9907-4E9A2F3AB1C1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x03_d_soci_example", "x03_d_soci_example.vcproj", "{5EFD08FE-10CB-4D3E-9917-4E9A2F3AB1C1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C3B3143D-F354-4036-9DA1-5975D8A4F166}.Debug|Win32.ActiveCfg = Debug|Win32 - {C3B3143D-F354-4036-9DA1-5975D8A4F166}.Debug|Win32.Build.0 = Debug|Win32 - {C3B3143D-F354-4036-9DA1-5975D8A4F166}.Release|Win32.ActiveCfg = Release|Win32 - {C3B3143D-F354-4036-9DA1-5975D8A4F166}.Release|Win32.Build.0 = Release|Win32 - {5EFD08EE-10CB-4D3E-9907-4E9A7F3AB1C1}.Debug|Win32.ActiveCfg = Debug|Win32 - {5EFD08EE-10CB-4D3E-9907-4E9A7F3AB1C1}.Debug|Win32.Build.0 = Debug|Win32 - {5EFD08EE-10CB-4D3E-9907-4E9A7F3AB1C1}.Release|Win32.ActiveCfg = Release|Win32 - {5EFD08EE-10CB-4D3E-9907-4E9A7F3AB1C1}.Release|Win32.Build.0 = Release|Win32 - {5EFD08FE-10CB-4D3E-9907-4E9A2F3AB1C1}.Debug|Win32.ActiveCfg = Debug|Win32 - {5EFD08FE-10CB-4D3E-9907-4E9A2F3AB1C1}.Debug|Win32.Build.0 = Debug|Win32 - {5EFD08FE-10CB-4D3E-9907-4E9A2F3AB1C1}.Release|Win32.ActiveCfg = Release|Win32 - {5EFD08FE-10CB-4D3E-9907-4E9A2F3AB1C1}.Release|Win32.Build.0 = Release|Win32 - {5EFD08FE-10CB-4D3E-9917-4E9A2F3AB1C1}.Debug|Win32.ActiveCfg = Debug|Win32 - {5EFD08FE-10CB-4D3E-9917-4E9A2F3AB1C1}.Debug|Win32.Build.0 = Debug|Win32 - {5EFD08FE-10CB-4D3E-9917-4E9A2F3AB1C1}.Release|Win32.ActiveCfg = Release|Win32 - {5EFD08FE-10CB-4D3E-9917-4E9A2F3AB1C1}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/example/with_external_libs/x04_wxwidgets_world_mapper.cpp b/example/with_external_libs/x04_wxwidgets_world_mapper.cpp index 1a8bde389..d3d2cc186 100644 --- a/example/with_external_libs/x04_wxwidgets_world_mapper.cpp +++ b/example/with_external_libs/x04_wxwidgets_world_mapper.cpp @@ -159,13 +159,13 @@ private: typedef boost::geometry::strategy::transform::map_transformer < - point_2d, wxPoint, + double, 2, 2, true, true > map_transformer_type; typedef boost::geometry::strategy::transform::inverse_transformer < - wxPoint, point_2d + double, 2, 2 > inverse_transformer_type; boost::shared_ptr m_map_transformer; diff --git a/example/with_external_libs/x04_wxwidgets_world_mapper.sln b/example/with_external_libs/x04_wxwidgets_world_mapper.sln deleted file mode 100644 index 9761bba39..000000000 --- a/example/with_external_libs/x04_wxwidgets_world_mapper.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x04_wxwidgets_world_mapper", "x04_wxwidgets_world_mapper.vcproj", "{DD1D469B-29A8-4873-A596-9CCCB24F54FA}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DD1D469B-29A8-4873-A596-9CCCB24F54FA}.Debug|Win32.ActiveCfg = Debug|Win32 - {DD1D469B-29A8-4873-A596-9CCCB24F54FA}.Debug|Win32.Build.0 = Debug|Win32 - {DD1D469B-29A8-4873-A596-9CCCB24F54FA}.Release|Win32.ActiveCfg = Release|Win32 - {DD1D469B-29A8-4873-A596-9CCCB24F54FA}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/example/with_external_libs/x04_wxwidgets_world_mapper.vcproj b/example/with_external_libs/x04_wxwidgets_world_mapper.vcproj deleted file mode 100644 index 3d4ed9ab1..000000000 --- a/example/with_external_libs/x04_wxwidgets_world_mapper.vcproj +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x04_wxwidgets_world_mapper_readme.txt b/example/with_external_libs/x04_wxwidgets_world_mapper_readme.txt index ed3df6cb0..cba0c8eeb 100644 --- a/example/with_external_libs/x04_wxwidgets_world_mapper_readme.txt +++ b/example/with_external_libs/x04_wxwidgets_world_mapper_readme.txt @@ -16,15 +16,7 @@ the mouse, and indicating position of the mouse in latitude/longitude and in pix To compile this program: Install wxWidgets (if not done before) -Install Boost (if not done before) -Using MSVC: - - edit the file wxwidgets.vsprops - - set the UserMacro WXWIDGETS to point to your wxWidgets distribution - - edit the file boost.vsprops - - set the UserMacro BOOST_ROOT to point to your Boost distribution - - alternatively you can include Boost and/or wxWidgets in your standard include path - Using Linux/gcc - check if installation is OK, http://wiki.wxwidgets.org/Installing_and_configuring_under_Ubuntu - compile using e.g. gcc -o x04_wxwidgets -I../../../.. x04_wxwidgets_world_mapper.cpp `wx-config --cxxflags` `wx-config --libs` diff --git a/example/with_external_libs/x05_shapelib_example.sln b/example/with_external_libs/x05_shapelib_example.sln deleted file mode 100644 index 48693bb6a..000000000 --- a/example/with_external_libs/x05_shapelib_example.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x05_shapelib_example", "x05_shapelib_example.vcproj", "{92ECE1AC-1A5D-4554-A8AD-690AC266210D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {92ECE1AC-1A5D-4554-A8AD-690AC266210D}.Debug|Win32.ActiveCfg = Debug|Win32 - {92ECE1AC-1A5D-4554-A8AD-690AC266210D}.Debug|Win32.Build.0 = Debug|Win32 - {92ECE1AC-1A5D-4554-A8AD-690AC266210D}.Release|Win32.ActiveCfg = Release|Win32 - {92ECE1AC-1A5D-4554-A8AD-690AC266210D}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/example/with_external_libs/x05_shapelib_example.vcproj b/example/with_external_libs/x05_shapelib_example.vcproj deleted file mode 100644 index d9c6a1d3f..000000000 --- a/example/with_external_libs/x05_shapelib_example.vcproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x06_qt_world_mapper.cpp b/example/with_external_libs/x06_qt_world_mapper.cpp index 8f0cf3477..b4a060c84 100644 --- a/example/with_external_libs/x06_qt_world_mapper.cpp +++ b/example/with_external_libs/x06_qt_world_mapper.cpp @@ -91,7 +91,7 @@ class WorldMapper : public QWidget private: typedef boost::geometry::strategy::transform::map_transformer < - point_2d, QPointF, + double, 2, 2, true, true > map_transformer_type; diff --git a/example/with_external_libs/x06_qt_world_mapper.sln b/example/with_external_libs/x06_qt_world_mapper.sln deleted file mode 100644 index 32cfaf4ad..000000000 --- a/example/with_external_libs/x06_qt_world_mapper.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x06_qt_world_mapper", "x06_qt_world_mapper.vcproj", "{242C6ADC-3A10-4B69-81F7-5669E0582A8B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Debug|Win32.ActiveCfg = Debug|Win32 - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Debug|Win32.Build.0 = Debug|Win32 - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Release|Win32.ActiveCfg = Release|Win32 - {242C6ADC-3A10-4B69-81F7-5669E0582A8B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/example/with_external_libs/x06_qt_world_mapper.vcproj b/example/with_external_libs/x06_qt_world_mapper.vcproj deleted file mode 100644 index efee2124e..000000000 --- a/example/with_external_libs/x06_qt_world_mapper.vcproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/with_external_libs/x06_qt_world_mapper_readme.txt b/example/with_external_libs/x06_qt_world_mapper_readme.txt index 8c67025e2..131bcca21 100644 --- a/example/with_external_libs/x06_qt_world_mapper_readme.txt +++ b/example/with_external_libs/x06_qt_world_mapper_readme.txt @@ -12,14 +12,6 @@ It will show a basic Qt Widget, displaying world countries To compile this program: Install Qt (if not done before) -Install Boost (if not done before) - -Using MSVC: - - edit the file qt.vsprops - - set the UserMacro QT to point to your Qt distribution - - edit the file boost.vsprops - - set the UserMacro BOOST_ROOT to point to your Boost distribution - - alternatively you can include Boost and/or Qt in your standard include path Using Linux/gcc - install Qt with sudo apt-get install libqt4-dev diff --git a/include/boost/geometry/algorithms/centroid.hpp b/include/boost/geometry/algorithms/centroid.hpp index 9be51f409..f673c133d 100644 --- a/include/boost/geometry/algorithms/centroid.hpp +++ b/include/boost/geometry/algorithms/centroid.hpp @@ -90,55 +90,56 @@ struct centroid_point template < - typename Box, + typename Indexed, typename Point, std::size_t Dimension, std::size_t DimensionCount > -struct centroid_box_calculator +struct centroid_indexed_calculator { typedef typename select_coordinate_type < - Box, Point + Indexed, Point >::type coordinate_type; - static inline void apply(Box const& box, Point& centroid) + static inline void apply(Indexed const& indexed, Point& centroid) { - coordinate_type const c1 = get(box); - coordinate_type const c2 = get(box); + coordinate_type const c1 = get(indexed); + coordinate_type const c2 = get(indexed); coordinate_type m = c1 + c2; - m /= 2.0; + coordinate_type const two = 2; + m /= two; set(centroid, m); - centroid_box_calculator + centroid_indexed_calculator < - Box, Point, + Indexed, Point, Dimension + 1, DimensionCount - >::apply(box, centroid); + >::apply(indexed, centroid); } }; -template -struct centroid_box_calculator +template +struct centroid_indexed_calculator { - static inline void apply(Box const& , Point& ) + static inline void apply(Indexed const& , Point& ) { } }; -struct centroid_box +struct centroid_indexed { - template - static inline void apply(Box const& box, Point& centroid, + template + static inline void apply(Indexed const& indexed, Point& centroid, Strategy const&) { - centroid_box_calculator + centroid_indexed_calculator < - Box, Point, - 0, dimension::type::value - >::apply(box, centroid); + Indexed, Point, + 0, dimension::type::value + >::apply(indexed, centroid); } }; @@ -279,7 +280,12 @@ struct centroid template struct centroid - : detail::centroid::centroid_box + : detail::centroid::centroid_indexed +{}; + +template +struct centroid + : detail::centroid::centroid_indexed {}; template diff --git a/include/boost/geometry/algorithms/detail/assign_values.hpp b/include/boost/geometry/algorithms/detail/assign_values.hpp index ed4713493..82dd6bec6 100644 --- a/include/boost/geometry/algorithms/detail/assign_values.hpp +++ b/include/boost/geometry/algorithms/detail/assign_values.hpp @@ -46,36 +46,30 @@ namespace detail { namespace assign { -template -< - typename Box, std::size_t Index, - std::size_t Dimension, std::size_t DimensionCount -> +template struct initialize { - typedef typename coordinate_type::type coordinate_type; - - static inline void apply(Box& box, coordinate_type const& value) + template + static inline void apply(Box& box, typename coordinate_type::type const& value) { geometry::set(box, value); - initialize::apply(box, value); + initialize::apply(box, value); } }; -template -struct initialize +template +struct initialize { - typedef typename coordinate_type::type coordinate_type; - - static inline void apply(Box&, coordinate_type const& ) + template + static inline void apply(Box&, typename coordinate_type::type const&) {} }; -template struct assign_zero_point { + template static inline void apply(Point& point) { geometry::assign_value(point, 0); @@ -83,44 +77,38 @@ struct assign_zero_point }; -template struct assign_inverse_box_or_segment { - typedef typename point_type::type point_type; + template static inline void apply(BoxOrSegment& geometry) { + typedef typename point_type::type point_type; typedef typename coordinate_type::type bound_type; - initialize - < - BoxOrSegment, 0, 0, dimension::type::value - >::apply( - geometry, boost::numeric::bounds::highest()); - initialize - < - BoxOrSegment, 1, 0, dimension::type::value - >::apply( - geometry, boost::numeric::bounds::lowest()); + initialize<0, 0, dimension::type::value>::apply( + geometry, boost::numeric::bounds::highest() + ); + initialize<1, 0, dimension::type::value>::apply( + geometry, boost::numeric::bounds::lowest() + ); } }; -template struct assign_zero_box_or_segment { + template static inline void apply(BoxOrSegment& geometry) { typedef typename coordinate_type::type coordinate_type; - initialize - < - BoxOrSegment, 0, 0, dimension::type::value - >::apply(geometry, coordinate_type()); - initialize - < - BoxOrSegment, 1, 0, dimension::type::value - >::apply(geometry, coordinate_type()); + initialize<0, 0, dimension::type::value>::apply( + geometry, coordinate_type() + ); + initialize<1, 0, dimension::type::value>::apply( + geometry, coordinate_type() + ); } }; @@ -312,17 +300,17 @@ struct assign_zero {}; template struct assign_zero - : detail::assign::assign_zero_point + : detail::assign::assign_zero_point {}; template struct assign_zero - : detail::assign::assign_zero_box_or_segment + : detail::assign::assign_zero_box_or_segment {}; template struct assign_zero - : detail::assign::assign_zero_box_or_segment + : detail::assign::assign_zero_box_or_segment {}; @@ -331,12 +319,12 @@ struct assign_inverse {}; template struct assign_inverse - : detail::assign::assign_inverse_box_or_segment + : detail::assign::assign_inverse_box_or_segment {}; template struct assign_inverse - : detail::assign::assign_inverse_box_or_segment + : detail::assign::assign_inverse_box_or_segment {}; diff --git a/include/boost/geometry/algorithms/detail/disjoint.hpp b/include/boost/geometry/algorithms/detail/disjoint.hpp index e944e5169..f25e8a843 100644 --- a/include/boost/geometry/algorithms/detail/disjoint.hpp +++ b/include/boost/geometry/algorithms/detail/disjoint.hpp @@ -165,6 +165,128 @@ struct box_box } }; +// Segment - Box intersection +// Based on Ray-AABB intersection +// http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm + +// TODO - later maybe move to strategy::intersects and add a policy to conditionally extract intersection points + +template +struct segment_box_intersection_dim +{ + //BOOST_STATIC_ASSERT(I < dimension::value); + //BOOST_STATIC_ASSERT(I < dimension::value); + //BOOST_STATIC_ASSERT(dimension::value == dimension::value); + + typedef typename coordinate_type::type point_coordinate; + + template static inline + bool apply(Point const& p0, Point const& p1, Box const& b, RelativeDistance & t_near, RelativeDistance & t_far) + { + //// WARNING! - RelativeDistance must be IEEE float for this to work (division by 0) + //BOOST_STATIC_ASSERT(boost::is_float::value); + //// Ray origin is in segment point 0 + //RelativeDistance ray_d = geometry::get(p1) - geometry::get(p0); + //RelativeDistance tn = ( geometry::get(b) - geometry::get(p0) ) / ray_d; + //RelativeDistance tf = ( geometry::get(b) - geometry::get(p0) ) / ray_d; + + // TODO - should we support also unsigned integers? + BOOST_STATIC_ASSERT(!boost::is_unsigned::value); + point_coordinate ray_d = geometry::get(p1) - geometry::get(p0); + RelativeDistance tn, tf; + if ( is_zero(ray_d) ) + { + tn = dist_div_by_zero(geometry::get(b) - geometry::get(p0)); + tf = dist_div_by_zero(geometry::get(b) - geometry::get(p0)); + } + else + { + tn = static_cast(geometry::get(b) - geometry::get(p0)) / ray_d; + tf = static_cast(geometry::get(b) - geometry::get(p0)) / ray_d; + } + + if ( tf < tn ) + ::std::swap(tn, tf); + + if ( t_near < tn ) + t_near = tn; + if ( tf < t_far ) + t_far = tf; + + return 0 <= t_far && t_near <= t_far && t_near <= 1; + } + + template static inline + R dist_div_by_zero(T const& val) + { + if ( is_zero(val) ) + return 0; + else if ( val < 0 ) + return -(::std::numeric_limits::max)(); + else + return (::std::numeric_limits::max)(); + } + + template static inline + bool is_zero(T const& val) + { + // ray_d == 0 is here because eps of rational is 0 which isn't < than 0 + return val == 0 || math::abs(val) < ::std::numeric_limits::epsilon(); + } +}; + +template +struct segment_box_intersection_impl +{ + BOOST_STATIC_ASSERT(0 < CurrentDimension); + + typedef segment_box_intersection_dim for_dim; + + template + static inline bool apply(Point const& p0, Point const& p1, Box const& b, + RelativeDistance & t_near, RelativeDistance & t_far) + { + return segment_box_intersection_impl::apply(p0, p1, b, t_near, t_far) + && for_dim::apply(p0, p1, b, t_near, t_far); + } +}; + +template +struct segment_box_intersection_impl +{ + typedef segment_box_intersection_dim for_dim; + + template + static inline bool apply(Point const& p0, Point const& p1, Box const& b, + RelativeDistance & t_near, RelativeDistance & t_far) + { + return for_dim::apply(p0, p1, b, t_near, t_far); + } +}; + +template +struct segment_box_intersection +{ + typedef segment_box_intersection_impl::value> impl; + + static inline bool apply(Point const& p0, Point const& p1, Box const& b) + { + typedef + typename geometry::promote_floating_point< + typename geometry::select_most_precise< + typename coordinate_type::type, + typename coordinate_type::type + >::type + >::type relative_distance_type; + + relative_distance_type t_near = -(::std::numeric_limits::max)(); + relative_distance_type t_far = (::std::numeric_limits::max)(); + + // relative_distance = 0 < t_near ? t_near : 0; + + return impl::apply(p0, p1, b, t_near, t_far); + } +}; template < diff --git a/include/boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp b/include/boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp new file mode 100644 index 000000000..29094de90 --- /dev/null +++ b/include/boost/geometry/algorithms/detail/overlay/append_no_dups_or_spikes.hpp @@ -0,0 +1,66 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2012 Barend Gehrels, 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_ALGORITHMS_DETAIL_OVERLAY_APPEND_NO_DUPS_OR_SPIKES_HPP +#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_APPEND_NO_DUPS_OR_SPIKES_HPP + +#include + +#include +#include +#include + + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace overlay +{ + +template +inline void append_no_dups_or_spikes(Range& range, Point const& point) +{ +#ifdef BOOST_GEOMETRY_DEBUG_INTERSECTION + std::cout << " add: (" + << geometry::get<0>(point) << ", " << geometry::get<1>(point) << ")" + << std::endl; +#endif + + traits::push_back::apply(range, point); + + // If a point is equal, or forming a spike, remove the pen-ultimate point because this one caused the spike. + // If so, the now-new-pen-ultimate point can again cause a spike (possibly at a corner). So keep doing this. + // Besides spikes it will also avoid duplicates. + while(boost::size(range) >= 3 + && point_is_spike_or_equal(point, *(boost::end(range) - 3), *(boost::end(range) - 2))) + { + // Use the Concept/traits, so resize and append again + traits::resize::apply(range, boost::size(range) - 2); + traits::push_back::apply(range, point); + } + + // There might still be one duplicate not catched by the condition above + if (boost::size(range) == 2 + && geometry::detail::equals::equals_point_point(*boost::begin(range), point)) + { + traits::clear::apply(range); + traits::push_back::apply(range, point); + } +} + + +}} // namespace detail::overlay +#endif // DOXYGEN_NO_DETAIL + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_APPEND_NO_DUPS_OR_SPIKES_HPP diff --git a/include/boost/geometry/algorithms/detail/overlay/assign_parents.hpp b/include/boost/geometry/algorithms/detail/overlay/assign_parents.hpp index 5063f49eb..646219d46 100644 --- a/include/boost/geometry/algorithms/detail/overlay/assign_parents.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/assign_parents.hpp @@ -18,6 +18,10 @@ #include +#ifdef BOOST_GEOMETRY_TIME_OVERLAY +# include +#endif + namespace boost { namespace geometry { diff --git a/include/boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp b/include/boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp index 012b3aca3..ef840d86a 100644 --- a/include/boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/backtrack_check_si.hpp @@ -101,7 +101,7 @@ public : // Make bad output clean rings.resize(size_at_start); - ring.clear(); + geometry::traits::clear::type>::apply(ring); // Reject this as a starting point operation.visited.set_rejected(); diff --git a/include/boost/geometry/algorithms/detail/overlay/copy_segments.hpp b/include/boost/geometry/algorithms/detail/overlay/copy_segments.hpp index 805f3923e..8d487d599 100644 --- a/include/boost/geometry/algorithms/detail/overlay/copy_segments.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/copy_segments.hpp @@ -27,7 +27,7 @@ #include #include -#include +#include namespace boost { namespace geometry { @@ -93,7 +93,7 @@ struct copy_segments_ring for (size_type i = 0; i < count; ++i, ++it) { - detail::overlay::append_no_duplicates(current_output, *it); + detail::overlay::append_no_dups_or_spikes(current_output, *it); } } }; @@ -129,7 +129,7 @@ struct copy_segments_linestring for (size_type i = 0; i < count; ++i, ++it) { - detail::overlay::append_no_duplicates(current_output, *it); + detail::overlay::append_no_dups_or_spikes(current_output, *it); } } }; @@ -195,7 +195,7 @@ struct copy_segments_box // (see comments in ring-version) for (int i = 0; i < count; i++, index++) { - detail::overlay::append_no_duplicates(current_output, bp[index % 5]); + detail::overlay::append_no_dups_or_spikes(current_output, bp[index % 5]); } } diff --git a/include/boost/geometry/algorithms/detail/overlay/enrichment_info.hpp b/include/boost/geometry/algorithms/detail/overlay/enrichment_info.hpp index 8c8ed9618..d92a0a969 100644 --- a/include/boost/geometry/algorithms/detail/overlay/enrichment_info.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/enrichment_info.hpp @@ -40,7 +40,8 @@ struct enrichment_info point_tag, P >::type - >::type + >::type, + P, P >::type distance_type; inline enrichment_info() diff --git a/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp b/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp index 782ea7fd2..23487872a 100644 --- a/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp @@ -256,7 +256,6 @@ public : advance_to_non_duplicate_next(nd_next2, it2, sec2); typedef typename boost::range_value::type turn_info; - typedef typename turn_info::point_type ip; turn_info ti; ti.operations[0].seg_id = segment_identifier(source_id1, @@ -838,13 +837,13 @@ inline void get_turns(Geometry1 const& geometry1, { concept::check_concepts_and_equal_dimensions(); - typedef typename strategy_intersection - < - typename cs_tag::type, - Geometry1, - Geometry2, - typename boost::range_value::type - >::segment_intersection_strategy_type segment_intersection_strategy_type; + //typedef typename strategy_intersection + // < + // typename cs_tag::type, + // Geometry1, + // Geometry2, + // typename boost::range_value::type + // >::segment_intersection_strategy_type segment_intersection_strategy_type; typedef detail::overlay::get_turn_info < diff --git a/include/boost/geometry/algorithms/detail/overlay/overlay.hpp b/include/boost/geometry/algorithms/detail/overlay/overlay.hpp index af9a8d991..39432dc50 100644 --- a/include/boost/geometry/algorithms/detail/overlay/overlay.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/overlay.hpp @@ -40,6 +40,10 @@ # include #endif +#ifdef BOOST_GEOMETRY_TIME_OVERLAY +# include +#endif + namespace boost { namespace geometry { diff --git a/include/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp b/include/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp index 9c4c99394..e5f32d993 100644 --- a/include/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp @@ -275,14 +275,6 @@ inline void self_turns(Geometry const& geometry, { concept::check(); - typedef typename strategy_intersection - < - typename cs_tag::type, - Geometry, - Geometry, - typename boost::range_value::type - >::segment_intersection_strategy_type strategy_type; - typedef detail::overlay::get_turn_info < typename point_type::type, diff --git a/include/boost/geometry/algorithms/detail/overlay/traverse.hpp b/include/boost/geometry/algorithms/detail/overlay/traverse.hpp index 72665922b..e41a01510 100644 --- a/include/boost/geometry/algorithms/detail/overlay/traverse.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/traverse.hpp @@ -13,7 +13,7 @@ #include -#include +#include #include #include #include @@ -139,7 +139,8 @@ inline bool assign_next_ip(G1 const& g1, G2 const& g2, seg_id = info.seg_id; } - detail::overlay::append_no_duplicates(current_output, ip->point); + detail::overlay::append_no_dups_or_spikes(current_output, ip->point); + return true; } @@ -277,8 +278,7 @@ public : set_visited_for_continue(*it, *iit); ring_type current_output; - detail::overlay::append_no_duplicates(current_output, - it->point, true); + geometry::append(current_output, it->point); turn_iterator current = it; turn_operation_iterator_type current_iit = iit; diff --git a/include/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp b/include/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp new file mode 100644 index 000000000..23078bf64 --- /dev/null +++ b/include/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp @@ -0,0 +1,71 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2008-2013 Bruno Lalande, Paris, France. +// Copyright (c) 2009-2013 Mateusz Loskot, London, UK. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. + +// 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_ALGORITHMS_DETAIL_POINT_IS_EQUAL_OR_SPIKE_HPP +#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_POINT_IS_EQUAL_OR_SPIKE_HPP + +#include +#include +#include +#include + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DETAIL +namespace detail +{ + +template +static inline bool point_is_spike_or_equal(Point1 const& last_point, Point2 const& segment_a, Point3 const& segment_b) +{ + typedef typename strategy::side::services::default_strategy + < + typename cs_tag::type + >::type side_strategy; + + typedef Point1 vector_type; + + int const side = side_strategy::apply(last_point, segment_a, segment_b); + if (side == 0) + { + // Last point is collinear w.r.t previous segment. + // Check if it is equal + vector_type diff1; + conversion::convert_point_to_point(last_point, diff1); + geometry::subtract_point(diff1, segment_b); + int const sgn_x1 = math::sign(geometry::get<0>(diff1)); + int const sgn_y1 = math::sign(geometry::get<1>(diff1)); + if (sgn_x1 == 0 && sgn_y1 == 0) + { + return true; + } + + // Check if it moves forward + vector_type diff2; + conversion::convert_point_to_point(segment_b, diff2); + geometry::subtract_point(diff2, segment_a); + int const sgn_x2 = math::sign(geometry::get<0>(diff2)); + int const sgn_y2 = math::sign(geometry::get<1>(diff2)); + + return sgn_x1 != sgn_x2 || sgn_y1 != sgn_y2; + } + return false; +} + +} // namespace detail +#endif + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_POINT_IS_EQUAL_OR_SPIKE_HPP diff --git a/include/boost/geometry/algorithms/detail/point_on_border.hpp b/include/boost/geometry/algorithms/detail/point_on_border.hpp index b7e15ba3f..70113ab3a 100644 --- a/include/boost/geometry/algorithms/detail/point_on_border.hpp +++ b/include/boost/geometry/algorithms/detail/point_on_border.hpp @@ -229,8 +229,6 @@ inline bool point_on_border(Point& point, concept::check(); concept::check(); - typedef typename point_type::type point_type; - return dispatch::point_on_border < typename tag::type, diff --git a/include/boost/geometry/algorithms/detail/sections/sectionalize.hpp b/include/boost/geometry/algorithms/detail/sections/sectionalize.hpp index 2ec63aa42..f5588522f 100644 --- a/include/boost/geometry/algorithms/detail/sections/sectionalize.hpp +++ b/include/boost/geometry/algorithms/detail/sections/sectionalize.hpp @@ -81,7 +81,7 @@ struct section , non_duplicate_index(-1) { assign_inverse(bounding_box); - for (register std::size_t i = 0; i < DimensionCount; i++) + for (std::size_t i = 0; i < DimensionCount; i++) { directions[i] = 0; } @@ -367,8 +367,6 @@ struct sectionalize_range static inline void apply(Range const& range, Sections& sections, ring_identifier ring_id) { - typedef model::referring_segment segment_type; - cview_type cview(range); view_type view(cview); diff --git a/include/boost/geometry/algorithms/disjoint.hpp b/include/boost/geometry/algorithms/disjoint.hpp index ade4e57d5..cd384d380 100644 --- a/include/boost/geometry/algorithms/disjoint.hpp +++ b/include/boost/geometry/algorithms/disjoint.hpp @@ -3,6 +3,7 @@ // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. @@ -172,6 +173,51 @@ struct general_areal } }; +template +struct disjoint_segment_box +{ + static inline bool apply(Segment const& segment, Box const& box) + { + typedef typename point_type::type point_type; + point_type p0, p1; + geometry::detail::assign_point_from_index<0>(segment, p0); + geometry::detail::assign_point_from_index<1>(segment, p1); + + return ! detail::disjoint::segment_box_intersection::apply(p0, p1, box); + } +}; + +template +struct disjoint_linestring_box +{ + static inline bool apply(Linestring const& linestring, Box const& box) + { + typedef typename ::boost::range_value::type point_type; + typedef typename ::boost::range_const_iterator::type const_iterator; + typedef typename ::boost::range_size::type size_type; + + const size_type count = ::boost::size(linestring); + + if ( count == 0 ) + return false; + else if ( count == 1 ) + return detail::disjoint::point_box::value> + ::apply(*::boost::begin(linestring), box); + else + { + const_iterator it0 = ::boost::begin(linestring); + const_iterator it1 = ::boost::begin(linestring) + 1; + const_iterator last = ::boost::end(linestring); + + for ( ; it1 != last ; ++it0, ++it1 ) + { + if ( detail::disjoint::segment_box_intersection::apply(*it0, *it1, box) ) + return false; + } + return true; + } + } +}; }} // namespace detail::disjoint #endif // DOXYGEN_NO_DETAIL @@ -249,9 +295,9 @@ struct disjoint {}; -template -struct disjoint - : detail::disjoint::disjoint_segment +template +struct disjoint + : detail::disjoint::disjoint_segment {}; template @@ -259,6 +305,15 @@ struct disjoint : detail::disjoint::disjoint_linear {}; +template +struct disjoint + : detail::disjoint::disjoint_segment_box +{}; + +template +struct disjoint + : detail::disjoint::disjoint_linestring_box +{}; } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH diff --git a/include/boost/geometry/algorithms/distance.hpp b/include/boost/geometry/algorithms/distance.hpp index 0fd5c43f4..a810fd7b8 100644 --- a/include/boost/geometry/algorithms/distance.hpp +++ b/include/boost/geometry/algorithms/distance.hpp @@ -53,8 +53,8 @@ using strategy::distance::services::return_type; template struct point_to_point { - static inline typename return_type::type apply(P1 const& p1, - P2 const& p2, Strategy const& strategy) + static inline typename return_type::type + apply(P1 const& p1, P2 const& p2, Strategy const& strategy) { boost::ignore_unused_variable_warning(strategy); return strategy.apply(p1, p2); @@ -65,8 +65,8 @@ struct point_to_point template struct point_to_segment { - static inline typename return_type::type apply(Point const& point, - Segment const& segment, Strategy const& ) + static inline typename return_type::type>::type + apply(Point const& point, Segment const& segment, Strategy const& ) { typename strategy::distance::services::default_strategy < @@ -96,7 +96,7 @@ template > struct point_to_range { - typedef typename return_type::type return_type; + typedef typename return_type::type>::type return_type; static inline return_type apply(Point const& point, Range const& range, PPStrategy const& pp_strategy, PSStrategy const& ps_strategy) @@ -161,7 +161,7 @@ struct point_to_ring { typedef std::pair < - typename return_type::type, bool + typename return_type::type>::type, bool > distance_containment; static inline distance_containment apply(Point const& point, @@ -195,7 +195,7 @@ template > struct point_to_polygon { - typedef typename return_type::type return_type; + typedef typename return_type::type>::type return_type; typedef std::pair distance_containment; static inline distance_containment apply(Point const& point, @@ -288,7 +288,14 @@ struct distance > : distance { - static inline typename return_type::type apply( + typedef typename strategy::distance::services::return_type + < + Strategy, + typename point_type::type, + typename point_type::type + >::type return_type; + + static inline return_type apply( Geometry1 const& g1, Geometry2 const& g2, Strategy const& strategy) @@ -302,44 +309,6 @@ struct distance } }; -// If reversal is needed and we got the strategy by default, invert it before -// proceeding to the reversal. -template -< - typename Geometry1, typename Geometry2, - typename Tag1, typename Tag2, typename StrategyTag -> -struct distance -< - Geometry1, Geometry2, - typename detail::distance::default_strategy::type, - Tag1, Tag2, StrategyTag, - true -> - : distance - < - Geometry2, Geometry1, - typename detail::distance::default_strategy::type, - Tag2, Tag1, StrategyTag, - false - > -{ - typedef typename detail::distance::default_strategy::type reversed_strategy; - - static inline typename strategy::distance::services::return_type::type apply( - Geometry1 const& g1, - Geometry2 const& g2, - typename detail::distance::default_strategy::type const&) - { - return distance - < - Geometry2, Geometry1, reversed_strategy, - Tag2, Tag1, StrategyTag, - false - >::apply(g2, g1, reversed_strategy()); - } -}; - // Point-point template @@ -363,9 +332,10 @@ struct distance > { - static inline typename return_type::type apply(Point const& point, - Linestring const& linestring, - Strategy const& strategy) + static inline typename return_type::type>::type + apply(Point const& point, + Linestring const& linestring, + Strategy const& strategy) { typedef typename strategy::distance::services::default_strategy < @@ -394,9 +364,10 @@ struct distance false > { - static inline typename return_type::type apply(Point const& point, - Linestring const& linestring, - Strategy const& strategy) + static inline typename return_type::type>::type + apply(Point const& point, + Linestring const& linestring, + Strategy const& strategy) { typedef typename Strategy::point_strategy_type pp_strategy_type; return detail::distance::point_to_range @@ -415,7 +386,7 @@ struct distance false > { - typedef typename return_type::type return_type; + typedef typename return_type::type>::type return_type; static inline return_type apply(Point const& point, Ring const& ring, @@ -450,7 +421,7 @@ struct distance false > { - typedef typename return_type::type return_type; + typedef typename return_type::type>::type return_type; static inline return_type apply(Point const& point, Polygon const& polygon, @@ -496,8 +467,10 @@ struct distance false > { - static inline typename return_type::type apply(Point const& point, - Segment const& segment, Strategy const& strategy) + static inline typename return_type::type>::type + apply(Point const& point, + Segment const& segment, + Strategy const& strategy) { typename point_type::type p[2]; @@ -549,9 +522,15 @@ for distance, it is probably so that there is no specialization for return_type<...> for your strategy. */ template -inline typename strategy::distance::services::return_type::type distance( - Geometry1 const& geometry1, Geometry2 const& geometry2, - Strategy const& strategy) +inline typename strategy::distance::services::return_type + < + Strategy, + typename point_type::type, + typename point_type::type + >::type +distance(Geometry1 const& geometry1, + Geometry2 const& geometry2, + Strategy const& strategy) { concept::check(); concept::check(); diff --git a/include/boost/geometry/algorithms/num_points.hpp b/include/boost/geometry/algorithms/num_points.hpp index 923ae8297..af7ee1d0c 100644 --- a/include/boost/geometry/algorithms/num_points.hpp +++ b/include/boost/geometry/algorithms/num_points.hpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -82,8 +81,6 @@ struct polygon_count: private range_count template static inline std::size_t apply(Polygon const& poly, bool add_for_open) { - typedef typename geometry::ring_type::type ring_type; - std::size_t n = range_count::apply( exterior_ring(poly), add_for_open); diff --git a/include/boost/geometry/algorithms/simplify.hpp b/include/boost/geometry/algorithms/simplify.hpp index 7e3aca401..2bd097f13 100644 --- a/include/boost/geometry/algorithms/simplify.hpp +++ b/include/boost/geometry/algorithms/simplify.hpp @@ -252,7 +252,9 @@ inline void simplify(Geometry const& geometry, Geometry& out, { concept::check(); - BOOST_CONCEPT_ASSERT( (geometry::concept::SimplifyStrategy) ); + BOOST_CONCEPT_ASSERT( + (concept::SimplifyStrategy::type>) + ); geometry::clear(out); @@ -322,7 +324,9 @@ inline void simplify_insert(Geometry const& geometry, OutputIterator out, Distance const& max_distance, Strategy const& strategy) { concept::check(); - BOOST_CONCEPT_ASSERT( (geometry::concept::SimplifyStrategy) ); + BOOST_CONCEPT_ASSERT( + (concept::SimplifyStrategy::type>) + ); dispatch::simplify_insert::apply(geometry, out, max_distance, strategy); } diff --git a/include/boost/geometry/algorithms/unique.hpp b/include/boost/geometry/algorithms/unique.hpp index e11dc13c4..b64f7565c 100644 --- a/include/boost/geometry/algorithms/unique.hpp +++ b/include/boost/geometry/algorithms/unique.hpp @@ -57,8 +57,6 @@ struct polygon_unique template static inline void apply(Polygon& polygon, ComparePolicy const& policy) { - typedef typename geometry::ring_type::type ring_type; - range_unique::apply(exterior_ring(polygon), policy); typename interior_return_type::type rings diff --git a/include/boost/geometry/geometries/point.hpp b/include/boost/geometry/geometries/point.hpp index b53114731..1a6382082 100644 --- a/include/boost/geometry/geometries/point.hpp +++ b/include/boost/geometry/geometries/point.hpp @@ -71,7 +71,7 @@ public: {} /// @brief Constructor to set one, two or three values - inline point(CoordinateType const& v0, CoordinateType const& v1 = 0, CoordinateType const& v2 = 0) + explicit inline point(CoordinateType const& v0, CoordinateType const& v1 = 0, CoordinateType const& v2 = 0) { if (DimensionCount >= 1) m_values[0] = v0; if (DimensionCount >= 2) m_values[1] = v1; diff --git a/include/boost/geometry/index/detail/algorithms/segment_intersection.hpp b/include/boost/geometry/index/detail/algorithms/segment_intersection.hpp index 4ae82c6ba..a6ad30181 100644 --- a/include/boost/geometry/index/detail/algorithms/segment_intersection.hpp +++ b/include/boost/geometry/index/detail/algorithms/segment_intersection.hpp @@ -34,8 +34,10 @@ namespace dispatch { template struct box_segment_intersection_dim { - BOOST_STATIC_ASSERT(I < dimension::value); - BOOST_STATIC_ASSERT(I < dimension::value); + BOOST_STATIC_ASSERT(0 <= dimension::value); + BOOST_STATIC_ASSERT(0 <= dimension::value); + BOOST_STATIC_ASSERT(I < size_t(dimension::value)); + BOOST_STATIC_ASSERT(I < size_t(dimension::value)); BOOST_STATIC_ASSERT(dimension::value == dimension::value); // WARNING! - RelativeDistance must be IEEE float for this to work diff --git a/include/boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp b/include/boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp index 359d4380d..c19e123b6 100644 --- a/include/boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp +++ b/include/boost/geometry/index/detail/rtree/node/node_auto_ptr.hpp @@ -17,6 +17,8 @@ namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { +// TODO - change the name to node_scoped_ptr + template class node_auto_ptr { diff --git a/include/boost/geometry/index/detail/rtree/node/node_d_mem_dynamic.hpp b/include/boost/geometry/index/detail/rtree/node/node_d_mem_dynamic.hpp index 832335f24..1e3cd58d5 100644 --- a/include/boost/geometry/index/detail/rtree/node/node_d_mem_dynamic.hpp +++ b/include/boost/geometry/index/detail/rtree/node/node_d_mem_dynamic.hpp @@ -183,9 +183,9 @@ public: typename node::type >::other::pointer node_pointer; - typedef typename Allocator::template rebind< - typename internal_node::type - >::other::pointer internal_node_pointer; +// typedef typename Allocator::template rebind< +// typename internal_node::type +// >::other::pointer internal_node_pointer; typedef typename Allocator::template rebind< typename internal_node::type diff --git a/include/boost/geometry/index/detail/rtree/node/node_d_mem_static.hpp b/include/boost/geometry/index/detail/rtree/node/node_d_mem_static.hpp index bfbe0ae93..184c48e44 100644 --- a/include/boost/geometry/index/detail/rtree/node/node_d_mem_static.hpp +++ b/include/boost/geometry/index/detail/rtree/node/node_d_mem_static.hpp @@ -130,9 +130,9 @@ public: typename node::type >::other::pointer node_pointer; - typedef typename Allocator::template rebind< - typename internal_node::type - >::other::pointer internal_node_pointer; +// typedef typename Allocator::template rebind< +// typename internal_node::type +// >::other::pointer internal_node_pointer; typedef typename Allocator::template rebind< typename internal_node::type diff --git a/include/boost/geometry/index/detail/rtree/node/node_s_mem_dynamic.hpp b/include/boost/geometry/index/detail/rtree/node/node_s_mem_dynamic.hpp index a37856c55..8cf7c9c0d 100644 --- a/include/boost/geometry/index/detail/rtree/node/node_s_mem_dynamic.hpp +++ b/include/boost/geometry/index/detail/rtree/node/node_s_mem_dynamic.hpp @@ -115,9 +115,9 @@ public: typename node::type >::other::pointer node_pointer; - typedef typename Allocator::template rebind< - typename internal_node::type - >::other::pointer internal_node_pointer; +// typedef typename Allocator::template rebind< +// typename internal_node::type +// >::other::pointer internal_node_pointer; typedef typename Allocator::template rebind< typename node::type diff --git a/include/boost/geometry/index/detail/rtree/node/node_s_mem_static.hpp b/include/boost/geometry/index/detail/rtree/node/node_s_mem_static.hpp index fa9fb456f..d5d68cbd1 100644 --- a/include/boost/geometry/index/detail/rtree/node/node_s_mem_static.hpp +++ b/include/boost/geometry/index/detail/rtree/node/node_s_mem_static.hpp @@ -111,9 +111,9 @@ public: typename node::type >::other::pointer node_pointer; - typedef typename Allocator::template rebind< - typename internal_node::type - >::other::pointer internal_node_pointer; +// typedef typename Allocator::template rebind< +// typename internal_node::type +// >::other::pointer internal_node_pointer; typedef typename Allocator::template rebind< typename node::type diff --git a/include/boost/geometry/index/detail/rtree/query_iterators.hpp b/include/boost/geometry/index/detail/rtree/query_iterators.hpp index 8d0dbdd9d..8366fca19 100644 --- a/include/boost/geometry/index/detail/rtree/query_iterators.hpp +++ b/include/boost/geometry/index/detail/rtree/query_iterators.hpp @@ -11,9 +11,12 @@ #ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP -namespace boost { namespace geometry { namespace index { +#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_VIRTUAL +//#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_FUNCTION +//#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_TYPE_ERASURE +//#define BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE -namespace detail { namespace rtree { +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { template struct end_query_iterator @@ -50,15 +53,10 @@ struct end_query_iterator return *this; } - friend bool operator==(end_query_iterator l, end_query_iterator r) + friend bool operator==(end_query_iterator const& /*l*/, end_query_iterator const& /*r*/) { return true; } - - friend bool operator!=(end_query_iterator l, end_query_iterator r) - { - return false; - } }; template @@ -81,8 +79,7 @@ public: inline spatial_query_iterator(node_pointer root, Translator const& t, Predicates const& p) : m_visitor(t, p) { - detail::rtree::apply_visitor(m_visitor, *root); - m_visitor.increment(); + m_visitor.initialize(root); } reference operator*() const @@ -113,30 +110,15 @@ public: return l.m_visitor == r.m_visitor; } - friend bool operator==(spatial_query_iterator const& l, end_query_iterator) + friend bool operator==(spatial_query_iterator const& l, end_query_iterator const& /*r*/) { return l.m_visitor.is_end(); } - friend bool operator==(end_query_iterator, spatial_query_iterator const& r) + friend bool operator==(end_query_iterator const& /*l*/, spatial_query_iterator const& r) { return r.m_visitor.is_end(); } - - friend bool operator!=(spatial_query_iterator const& l, spatial_query_iterator const& r) - { - return !(l.m_visitor == r.m_visitor); - } - - friend bool operator!=(spatial_query_iterator const& l, end_query_iterator) - { - return !l.m_visitor.is_end(); - } - - friend bool operator!=(end_query_iterator, spatial_query_iterator const& r) - { - return !r.m_visitor.is_end(); - } private: visitor_type m_visitor; @@ -162,8 +144,7 @@ public: inline distance_query_iterator(node_pointer root, Translator const& t, Predicates const& p) : m_visitor(t, p) { - detail::rtree::apply_visitor(m_visitor, *root); - m_visitor.increment(); + m_visitor.initialize(root); } reference operator*() const @@ -194,37 +175,425 @@ public: return l.m_visitor == r.m_visitor; } - friend bool operator==(distance_query_iterator const& l, end_query_iterator) + friend bool operator==(distance_query_iterator const& l, end_query_iterator const& /*r*/) { return l.m_visitor.is_end(); } - friend bool operator==(end_query_iterator, distance_query_iterator const& r) + friend bool operator==(end_query_iterator const& /*l*/, distance_query_iterator const& r) { return r.m_visitor.is_end(); } - friend bool operator!=(distance_query_iterator const& l, distance_query_iterator const& r) - { - return !(l.m_visitor == r.m_visitor); - } - - friend bool operator!=(distance_query_iterator const& l, end_query_iterator) - { - return !l.m_visitor.is_end(); - } - - friend bool operator!=(end_query_iterator, distance_query_iterator const& r) - { - return !r.m_visitor.is_end(); - } - private: visitor_type m_visitor; }; -}} // namespace detail::rtree +template +inline bool operator!=(L const& l, R const& r) +{ + return !(l == r); +} -}}} // namespace boost::geometry::index +}}}}}} // namespace boost::geometry::index::detail::rtree::iterators + +#if defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_VIRTUAL) || defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_FUNCTION) + +#if defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_VIRTUAL) + +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { + +template +class query_iterator_base +{ +public: + typedef std::input_iterator_tag iterator_category; + typedef Value value_type; + typedef typename Allocators::const_reference reference; + typedef typename Allocators::difference_type difference_type; + typedef typename Allocators::const_pointer pointer; + + virtual ~query_iterator_base() {} + + virtual query_iterator_base * clone() const = 0; + + virtual bool is_end() const = 0; + virtual reference dereference() const = 0; + virtual void increment() = 0; + virtual bool equals(query_iterator_base const&) const = 0; +}; + +template +class query_iterator_wrapper + : public query_iterator_base +{ + typedef query_iterator_base base_t; + +public: + typedef std::input_iterator_tag iterator_category; + typedef Value value_type; + typedef typename Allocators::const_reference reference; + typedef typename Allocators::difference_type difference_type; + typedef typename Allocators::const_pointer pointer; + + explicit query_iterator_wrapper(Iterator const& it) : m_iterator(it) {} + + virtual base_t * clone() const { return new query_iterator_wrapper(m_iterator); } + + virtual bool is_end() const { return m_iterator == end_query_iterator(); } + virtual reference dereference() const { return *m_iterator; } + virtual void increment() { ++m_iterator; } + virtual bool equals(base_t const& r) const + { + const query_iterator_wrapper * p = dynamic_cast(boost::addressof(r)); + BOOST_ASSERT_MSG(p, "those iterators can't be compared"); + return m_iterator == p->m_iterator; + } + +private: + Iterator m_iterator; +}; + +#elif defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_FUNCTION) + +#include +#include + +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { + +template +class query_iterator_base +{ +public: + typedef std::input_iterator_tag iterator_category; + typedef Value value_type; + typedef typename Allocators::const_reference reference; + typedef typename Allocators::difference_type difference_type; + typedef typename Allocators::const_pointer pointer; + + virtual ~query_iterator_base() {} + + boost::function clone; + boost::function is_end; + boost::function dereference; + boost::function increment; + boost::function equals; +}; + +template +class query_iterator_wrapper + : public query_iterator_base +{ + typedef query_iterator_base base_t; + +public: + typedef std::input_iterator_tag iterator_category; + typedef Value value_type; + typedef typename Allocators::const_reference reference; + typedef typename Allocators::difference_type difference_type; + typedef typename Allocators::const_pointer pointer; + + explicit query_iterator_wrapper(Iterator const& it) + : m_iterator(it) + { + base_t::clone = boost::bind(&query_iterator_wrapper::clone_, this); + base_t::is_end = boost::bind(&query_iterator_wrapper::is_end_, this); + base_t::dereference = boost::bind(&query_iterator_wrapper::dereference_, this); + base_t::increment = boost::bind(&query_iterator_wrapper::increment_, this); + base_t::equals = boost::bind(&query_iterator_wrapper::equals_, this, _1); + } + +private: + base_t * clone_() const { return new query_iterator_wrapper(m_iterator); } + + bool is_end_() const { return m_iterator == end_query_iterator(); } + reference dereference_() const { return *m_iterator; } + void increment_() { ++m_iterator; } + bool equals_(base_t const& r) const + { + const query_iterator_wrapper * p = dynamic_cast(boost::addressof(r)); + BOOST_ASSERT_MSG(p, "those iterators can't be compared"); + return m_iterator == p->m_iterator; + } + +private: + Iterator m_iterator; +}; + +#endif + +template +class query_iterator +{ + typedef query_iterator_base iterator_base; + typedef std::auto_ptr iterator_ptr; + +public: + typedef std::input_iterator_tag iterator_category; + typedef Value value_type; + typedef typename Allocators::const_reference reference; + typedef typename Allocators::difference_type difference_type; + typedef typename Allocators::const_pointer pointer; + + query_iterator() {} + + template + query_iterator(It const& it) + : m_ptr(static_cast( + new query_iterator_wrapper(it) )) + {} + + query_iterator(end_query_iterator const& /*it*/) + {} + + query_iterator(query_iterator const& o) + : m_ptr(o.m_ptr.get() ? o.m_ptr->clone() : 0) + {} + +#ifndef BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE + query_iterator & operator=(query_iterator const& o) + { + m_ptr.reset(o.m_ptr.get() ? o.m_ptr->clone() : 0); + return *this; + } +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + query_iterator(query_iterator && o) + : m_ptr(o.m_ptr.get()) + { + o.m_ptr.release(); + } + query_iterator & operator=(query_iterator && o) + { + if ( this != boost::addressof(o) ) + { + m_ptr.reset(o.m_ptr.get()); + o.m_ptr.release(); + } + return *this; + } +#endif +#else // !BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE +private: + BOOST_COPYABLE_AND_MOVABLE(query_iterator) +public: + query_iterator & operator=(BOOST_COPY_ASSIGN_REF(query_iterator) o) + { + m_ptr.reset(o.m_ptr.get() ? o.m_ptr->clone() : 0); + return *this; + } + query_iterator(BOOST_RV_REF(query_iterator) o) + : m_ptr(o.m_ptr.get()) + { + o.m_ptr.release(); + } + query_iterator & operator=(BOOST_RV_REF(query_iterator) o) + { + if ( this != boost::addressof(o) ) + { + m_ptr.reset(o.m_ptr.get()); + o.m_ptr.release(); + } + return *this; + } +#endif // BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE + + reference operator*() const + { + return m_ptr->dereference(); + } + + const value_type * operator->() const + { + return boost::addressof(m_ptr->dereference()); + } + + query_iterator & operator++() + { + m_ptr->increment(); + return *this; + } + + query_iterator operator++(int) + { + query_iterator temp = *this; + this->operator++(); + return temp; + } + + friend bool operator==(query_iterator const& l, query_iterator const& r) + { + if ( l.m_ptr.get() ) + { + if ( r.m_ptr.get() ) + return l.m_ptr->equals(*r.m_ptr); + else + return l.m_ptr->is_end(); + } + else + { + if ( r.m_ptr.get() ) + return r.m_ptr->is_end(); + else + return true; + } + } + +private: + iterator_ptr m_ptr; +}; + +}}}}}} // namespace boost::geometry::index::detail::rtree::iterators + +#elif defined(BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_TYPE_ERASURE) + +#include +#include +#include + +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { + +template +struct single_pass_iterator_concept : + ::boost::mpl::vector< + ::boost::type_erasure::copy_constructible, + ::boost::type_erasure::equality_comparable, + ::boost::type_erasure::dereferenceable, + ::boost::type_erasure::assignable, + ::boost::type_erasure::incrementable, + ::boost::type_erasure::equality_comparable >, + ::boost::type_erasure::relaxed // default ctor + > +{}; + +template +struct single_pass_iterator_type +{ + typedef ::boost::type_erasure::any< + single_pass_iterator_concept< + ::boost::type_erasure::_self, Value, Allocators + > + > type; +}; + +}}}}}} // namespace boost::geometry::index::detail::rtree::iterators + +namespace boost { namespace type_erasure { + +template +struct concept_interface< + ::boost::geometry::index::detail::rtree::single_pass_iterator_concept< + T, Value, Allocators + >, Base, T> + : Base +{ + typedef Value value_type; + typedef typename Allocators::const_reference reference; + typedef typename Allocators::const_pointer pointer; + typedef typename Allocators::difference_type difference_type; + typedef ::std::input_iterator_tag iterator_category; +}; + +}} // boost::type_erasure + +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace iterators { + +template +class query_iterator +{ +public: + typedef std::input_iterator_tag iterator_category; + typedef Value value_type; + typedef typename Allocators::const_reference reference; + typedef typename Allocators::difference_type difference_type; + typedef typename Allocators::const_pointer pointer; + +private: + typedef typename rtree::single_pass_iterator_type::type iterator_type; + +public: + + query_iterator() {} + + template + query_iterator(It const& it) + : m_iterator(it) + {} + + query_iterator(end_query_iterator const& /*it*/) + {} + +#ifdef BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE +private: + BOOST_COPYABLE_AND_MOVABLE(query_iterator) +public: + query_iterator(query_iterator const& o) + : m_iterator(o.m_iterator) + {} + query_iterator & operator=(BOOST_COPY_ASSIGN_REF(query_iterator) o) + { + m_iterator = o.m_iterator; + return *this; + } + query_iterator(BOOST_RV_REF(query_iterator) o) + : m_iterator(boost::move(o.m_iterator)) + {} + query_iterator & operator=(BOOST_RV_REF(query_iterator) o) + { + if ( this != boost::addressof(o) ) + { + m_iterator = boost::move(o.m_iterator); + } + return *this; + } +#endif // BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_MOVE + + reference operator*() const + { + return *m_iterator; + } + + const value_type * operator->() const + { + return boost::addressof(*m_iterator); + } + + query_iterator & operator++() + { + ++m_iterator; + return *this; + } + + query_iterator operator++(int) + { + query_iterator temp = *this; + ++m_iterator; + return temp; + } + + friend bool operator==(query_iterator const& l, query_iterator const& r) + { + if ( !::boost::type_erasure::is_empty(l.m_iterator) ) + { + if ( !::boost::type_erasure::is_empty(r.m_iterator) ) + return l.m_iterator == r.m_iterator; + else + return l.m_iterator == end_query_iterator(); + } + else + { + if ( !::boost::type_erasure::is_empty(r.m_iterator) ) + return r.m_iterator == end_query_iterator(); + else + return true; + } + } + +private: + iterator_type m_iterator; +}; + +}}}}}} // namespace boost::geometry::index::detail::rtree::iterators + +#endif // BOOST_GEOMETRY_INDEX_DETAIL_QUERY_ITERATORS_USE_TYPE_ERASURE #endif // BOOST_GEOMETRY_INDEX_DETAIL_RTREE_QUERY_ITERATORS_HPP diff --git a/include/boost/geometry/index/detail/rtree/rstar/insert.hpp b/include/boost/geometry/index/detail/rtree/rstar/insert.hpp index e681bbb6b..37bc31efa 100644 --- a/include/boost/geometry/index/detail/rtree/rstar/insert.hpp +++ b/include/boost/geometry/index/detail/rtree/rstar/insert.hpp @@ -28,7 +28,9 @@ public: typedef typename rtree::leaf::type leaf; typedef typename Options::parameters_type parameters_type; - typedef typename Allocators::internal_node_pointer internal_node_pointer; + + //typedef typename Allocators::internal_node_pointer internal_node_pointer; + typedef internal_node * internal_node_pointer; template static inline void apply(ResultElements & result_elements, diff --git a/include/boost/geometry/index/detail/rtree/utilities/gl_draw.hpp b/include/boost/geometry/index/detail/rtree/utilities/gl_draw.hpp index 7072a1879..9b5e4d035 100644 --- a/include/boost/geometry/index/detail/rtree/utilities/gl_draw.hpp +++ b/include/boost/geometry/index/detail/rtree/utilities/gl_draw.hpp @@ -58,7 +58,7 @@ struct gl_draw_indexable template struct gl_draw_indexable { - static const size_t dimension = dimension::value; + static const size_t dimension = geometry::dimension::value; static inline void apply(Indexable const& i, typename coordinate_type::type z) { @@ -69,7 +69,7 @@ struct gl_draw_indexable template struct gl_draw_indexable { - static const size_t dimension = dimension::value; + static const size_t dimension = geometry::dimension::value; static inline void apply(Indexable const& i, typename coordinate_type::type z) { diff --git a/include/boost/geometry/index/detail/rtree/utilities/print.hpp b/include/boost/geometry/index/detail/rtree/utilities/print.hpp index f7d503a7d..452471061 100644 --- a/include/boost/geometry/index/detail/rtree/utilities/print.hpp +++ b/include/boost/geometry/index/detail/rtree/utilities/print.hpp @@ -71,7 +71,7 @@ struct print_indexable template struct print_indexable { - static const size_t dimension = dimension::value; + static const size_t dimension = geometry::dimension::value; static inline void apply(std::ostream &os, Indexable const& i) { @@ -86,7 +86,7 @@ struct print_indexable template struct print_indexable { - static const size_t dimension = dimension::value; + static const size_t dimension = geometry::dimension::value; static inline void apply(std::ostream &os, Indexable const& i) { diff --git a/include/boost/geometry/index/detail/rtree/utilities/statistics.hpp b/include/boost/geometry/index/detail/rtree/utilities/statistics.hpp index c8e420d91..bbaed8100 100644 --- a/include/boost/geometry/index/detail/rtree/utilities/statistics.hpp +++ b/include/boost/geometry/index/detail/rtree/utilities/statistics.hpp @@ -13,7 +13,7 @@ #define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_UTILITIES_STATISTICS_HPP #include -#include +#include namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace utilities { diff --git a/include/boost/geometry/index/detail/rtree/visitors/distance_query.hpp b/include/boost/geometry/index/detail/rtree/visitors/distance_query.hpp index 616150222..c0d336df1 100644 --- a/include/boost/geometry/index/detail/rtree/visitors/distance_query.hpp +++ b/include/boost/geometry/index/detail/rtree/visitors/distance_query.hpp @@ -318,6 +318,12 @@ public: return *(neighbors[current_neighbor].second); } + void initialize(node_pointer root) + { + rtree::apply_visitor(*this, *root); + increment(); + } + void increment() { for (;;) diff --git a/include/boost/geometry/index/detail/rtree/visitors/insert.hpp b/include/boost/geometry/index/detail/rtree/visitors/insert.hpp index 9ff5f0749..540de5a4c 100644 --- a/include/boost/geometry/index/detail/rtree/visitors/insert.hpp +++ b/include/boost/geometry/index/detail/rtree/visitors/insert.hpp @@ -231,7 +231,9 @@ protected: typedef rtree::node_auto_ptr node_auto_ptr; typedef typename Allocators::node_pointer node_pointer; - typedef typename Allocators::internal_node_pointer internal_node_pointer; + + //typedef typename Allocators::internal_node_pointer internal_node_pointer; + typedef internal_node * internal_node_pointer; inline insert(node_pointer & root, size_t & leafs_level, diff --git a/include/boost/geometry/index/detail/rtree/visitors/remove.hpp b/include/boost/geometry/index/detail/rtree/visitors/remove.hpp index 5b77b5acb..19da61d49 100644 --- a/include/boost/geometry/index/detail/rtree/visitors/remove.hpp +++ b/include/boost/geometry/index/detail/rtree/visitors/remove.hpp @@ -32,7 +32,9 @@ class remove typedef rtree::node_auto_ptr node_auto_ptr; typedef typename Allocators::node_pointer node_pointer; - typedef typename Allocators::internal_node_pointer internal_node_pointer; + + //typedef typename Allocators::internal_node_pointer internal_node_pointer; + typedef internal_node * internal_node_pointer; public: inline remove(node_pointer & root, diff --git a/include/boost/geometry/index/detail/rtree/visitors/spatial_query.hpp b/include/boost/geometry/index/detail/rtree/visitors/spatial_query.hpp index 48d9c3d3c..0a43111ac 100644 --- a/include/boost/geometry/index/detail/rtree/visitors/spatial_query.hpp +++ b/include/boost/geometry/index/detail/rtree/visitors/spatial_query.hpp @@ -112,7 +112,6 @@ public: { m_values = ::boost::addressof(rtree::elements(n)); m_current = rtree::elements(n).begin(); - m_last = rtree::elements(n).end(); } const_reference dereference() const @@ -121,17 +120,26 @@ public: return *m_current; } + void initialize(node_pointer root) + { + rtree::apply_visitor(*this, *root); + search_value(); + } + void increment() { - if ( m_values ) - ++m_current; + ++m_current; + search_value(); + } + void search_value() + { for (;;) { // if leaf is choosen, move to the next value in leaf if ( m_values ) { - if ( m_current != m_last ) + if ( m_current != m_values->end() ) { // return if next value is found Value const& v = *m_current; @@ -188,7 +196,7 @@ private: std::vector< std::pair > m_internal_stack; const leaf_elements * m_values; - leaf_iterator m_current, m_last; + leaf_iterator m_current; }; }}} // namespace detail::rtree::visitors diff --git a/include/boost/geometry/index/detail/serialization.hpp b/include/boost/geometry/index/detail/serialization.hpp new file mode 100644 index 000000000..4f3dc7c01 --- /dev/null +++ b/include/boost/geometry/index/detail/serialization.hpp @@ -0,0 +1,581 @@ +// Boost.Geometry Index +// +// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. +// +// 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_INDEX_DETAIL_SERIALIZATION_HPP +#define BOOST_GEOMETRY_INDEX_DETAIL_SERIALIZATION_HPP + +//#include +#include +#include +//#include + +// TODO +// how about using the unsigned type capable of storing Max in compile-time versions? + +// TODO +// - add wrappers for Point and Box and implement serialize for those wrappers instead of +// raw geometries +// PROBLEM: after implementing this, how Values would be set? +// - store the name of the parameters to know how to load and detect errors +// - in the header, once store info about the Indexable and Bounds types (geometry type, point CS, Dim, etc.) +// each geometry save without this info + +// TODO - move to index/detail/serialization.hpp +namespace boost { namespace geometry { namespace index { namespace detail { + +// TODO - use boost::move? +template +class serialization_storage +{ +public: + template + serialization_storage(Archive & ar, unsigned int version) + { + boost::serialization::load_construct_data_adl(ar, this->address(), version); + } + ~serialization_storage() + { + this->address()->~T(); + } + T * address() + { + return static_cast(m_storage.address()); + } +private: + boost::aligned_storage::value> m_storage; +}; + +// TODO - save and load item_version? see: collections_load_imp and collections_save_imp +// this should be done once for the whole container +// versions of all used types should be stored + +template inline +T serialization_load(const char * name, Archive & ar) +{ + namespace bs = boost::serialization; + serialization_storage storage(ar, bs::version::value); // load_construct_data + ar >> boost::serialization::make_nvp(name, *storage.address()); // serialize + //ar >> *storage.address(); // serialize + return *storage.address(); +} + +template inline +void serialization_save(T const& t, const char * name, Archive & ar) +{ + namespace bs = boost::serialization; + bs::save_construct_data_adl(ar, boost::addressof(t), bs::version::value); // save_construct_data + ar << boost::serialization::make_nvp(name, t); // serialize + //ar << t; // serialize +} + +}}}} + +// TODO - move to index/serialization/rtree.hpp +namespace boost { namespace serialization { + +// boost::geometry::index::linear + +template +void save_construct_data(Archive & ar, const boost::geometry::index::linear * params, unsigned int ) +{ + size_t max = params->get_max_elements(), min = params->get_min_elements(); + ar << boost::serialization::make_nvp("max", max); + ar << boost::serialization::make_nvp("min", min); +} +template +void load_construct_data(Archive & ar, boost::geometry::index::linear * params, unsigned int ) +{ + size_t max, min; + ar >> boost::serialization::make_nvp("max", max); + ar >> boost::serialization::make_nvp("min", min); + if ( max != params->get_max_elements() || min != params->get_min_elements() ) + // TODO change exception type + BOOST_THROW_EXCEPTION(std::runtime_error("parameters not compatible")); + // the constructor musn't be called for this type + //::new(params)boost::geometry::index::linear(); +} +template void serialize(Archive &, boost::geometry::index::linear &, unsigned int) {} + +// boost::geometry::index::quadratic + +template +void save_construct_data(Archive & ar, const boost::geometry::index::quadratic * params, unsigned int ) +{ + size_t max = params->get_max_elements(), min = params->get_min_elements(); + ar << boost::serialization::make_nvp("max", max); + ar << boost::serialization::make_nvp("min", min); +} +template +void load_construct_data(Archive & ar, boost::geometry::index::quadratic * params, unsigned int ) +{ + size_t max, min; + ar >> boost::serialization::make_nvp("max", max); + ar >> boost::serialization::make_nvp("min", min); + if ( max != params->get_max_elements() || min != params->get_min_elements() ) + // TODO change exception type + BOOST_THROW_EXCEPTION(std::runtime_error("parameters not compatible")); + // the constructor musn't be called for this type + //::new(params)boost::geometry::index::quadratic(); +} +template void serialize(Archive &, boost::geometry::index::quadratic &, unsigned int) {} + +// boost::geometry::index::rstar + +template +void save_construct_data(Archive & ar, const boost::geometry::index::rstar * params, unsigned int ) +{ + size_t max = params->get_max_elements() + , min = params->get_min_elements() + , re = params->get_reinserted_elements() + , oct = params->get_overlap_cost_threshold(); + ar << boost::serialization::make_nvp("max", max); + ar << boost::serialization::make_nvp("min", min); + ar << boost::serialization::make_nvp("re", re); + ar << boost::serialization::make_nvp("oct", oct); +} +template +void load_construct_data(Archive & ar, boost::geometry::index::rstar * params, unsigned int ) +{ + size_t max, min, re, oct; + ar >> boost::serialization::make_nvp("max", max); + ar >> boost::serialization::make_nvp("min", min); + ar >> boost::serialization::make_nvp("re", re); + ar >> boost::serialization::make_nvp("oct", oct); + if ( max != params->get_max_elements() || min != params->get_min_elements() || + re != params->get_reinserted_elements() || oct != params->get_overlap_cost_threshold() ) + // TODO change exception type + BOOST_THROW_EXCEPTION(std::runtime_error("parameters not compatible")); + // the constructor musn't be called for this type + //::new(params)boost::geometry::index::rstar(); +} +template +void serialize(Archive &, boost::geometry::index::rstar &, unsigned int) {} + +// boost::geometry::index::dynamic_linear + +template +inline void save_construct_data(Archive & ar, const boost::geometry::index::dynamic_linear * params, unsigned int ) +{ + size_t max = params->get_max_elements(), min = params->get_min_elements(); + ar << boost::serialization::make_nvp("max", max); + ar << boost::serialization::make_nvp("min", min); +} +template +inline void load_construct_data(Archive & ar, boost::geometry::index::dynamic_linear * params, unsigned int ) +{ + size_t max, min; + ar >> boost::serialization::make_nvp("max", max); + ar >> boost::serialization::make_nvp("min", min); + ::new(params)boost::geometry::index::dynamic_linear(max, min); +} +template void serialize(Archive &, boost::geometry::index::dynamic_linear &, unsigned int) {} + +// boost::geometry::index::dynamic_quadratic + +template +inline void save_construct_data(Archive & ar, const boost::geometry::index::dynamic_quadratic * params, unsigned int ) +{ + size_t max = params->get_max_elements(), min = params->get_min_elements(); + ar << boost::serialization::make_nvp("max", max); + ar << boost::serialization::make_nvp("min", min); +} +template +inline void load_construct_data(Archive & ar, boost::geometry::index::dynamic_quadratic * params, unsigned int ) +{ + size_t max, min; + ar >> boost::serialization::make_nvp("max", max); + ar >> boost::serialization::make_nvp("min", min); + ::new(params)boost::geometry::index::dynamic_quadratic(max, min); +} +template void serialize(Archive &, boost::geometry::index::dynamic_quadratic &, unsigned int) {} + +// boost::geometry::index::dynamic_rstar + +template +inline void save_construct_data(Archive & ar, const boost::geometry::index::dynamic_rstar * params, unsigned int ) +{ + size_t max = params->get_max_elements() + , min = params->get_min_elements() + , re = params->get_reinserted_elements() + , oct = params->get_overlap_cost_threshold(); + ar << boost::serialization::make_nvp("max", max); + ar << boost::serialization::make_nvp("min", min); + ar << boost::serialization::make_nvp("re", re); + ar << boost::serialization::make_nvp("oct", oct); +} +template +inline void load_construct_data(Archive & ar, boost::geometry::index::dynamic_rstar * params, unsigned int ) +{ + size_t max, min, re, oct; + ar >> boost::serialization::make_nvp("max", max); + ar >> boost::serialization::make_nvp("min", min); + ar >> boost::serialization::make_nvp("re", re); + ar >> boost::serialization::make_nvp("oct", oct); + ::new(params)boost::geometry::index::dynamic_rstar(max, min, re, oct); +} +template void serialize(Archive &, boost::geometry::index::dynamic_rstar &, unsigned int) {} + +}} // boost::serialization + +// TODO - move to index/detail/serialization.hpp or maybe geometry/serialization.hpp +namespace boost { namespace geometry { namespace index { namespace detail { + +template ::value> +struct serialize_point +{ + template + static inline void save(Archive & ar, P const& p, unsigned int version) + { + typename coordinate_type

::type c = get(p); + ar << boost::serialization::make_nvp("c", c); + serialize_point::save(ar, p, version); + } + + template + static inline void load(Archive & ar, P & p, unsigned int version) + { + typename traits::coordinate_type

::type c; + ar >> boost::serialization::make_nvp("c", c); + set(p, c); + serialize_point::load(ar, p, version); + } +}; + +template +struct serialize_point +{ + template static inline void save(Archive &, P const&, unsigned int) {} + template static inline void load(Archive &, P &, unsigned int) {} +}; + +}}}} + +// TODO - move to index/detail/serialization.hpp or maybe geometry/serialization.hpp +namespace boost { namespace serialization { + +template +void save(Archive & ar, boost::geometry::model::point const& p, unsigned int version) +{ + boost::geometry::index::detail::serialize_point< boost::geometry::model::point >::save(ar, p, version); +} +template +void load(Archive & ar, boost::geometry::model::point & p, unsigned int version) +{ + boost::geometry::index::detail::serialize_point< boost::geometry::model::point >::load(ar, p, version); +} +template +inline void serialize(Archive & ar, boost::geometry::model::point & o, const unsigned int version) { split_free(ar, o, version); } + +template +inline void serialize(Archive & ar, boost::geometry::model::box

& b, const unsigned int) +{ + ar & boost::serialization::make_nvp("min", b.min_corner()); + ar & boost::serialization::make_nvp("max", b.max_corner()); +} + +}} // boost::serialization + +// TODO - move to index/detail/rtree/visitors/save.hpp +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { namespace visitors { + +// TODO move saving and loading of the rtree outside the rtree, this will require adding some kind of members_view + +template +class save + : public rtree::visitor::type +{ +public: + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; + + save(Archive & archive, unsigned int version) + : m_archive(archive), m_version(version) + {} + + inline void operator()(internal_node const& n) + { + typedef typename rtree::elements_type::type elements_type; + elements_type const& elements = rtree::elements(n); + + // change to elements_type::size_type or size_type? + size_t s = elements.size(); + m_archive << boost::serialization::make_nvp("s", s); + + for (typename elements_type::const_iterator it = elements.begin() ; it != elements.end() ; ++it) + { + serialization_save(it->first, "b", m_archive); + + rtree::apply_visitor(*this, *it->second); + } + } + + inline void operator()(leaf const& l) + { + typedef typename rtree::elements_type::type elements_type; + typedef typename elements_type::size_type elements_size; + elements_type const& elements = rtree::elements(l); + + // change to elements_type::size_type or size_type? + size_t s = elements.size(); + m_archive << boost::serialization::make_nvp("s", s); + + for (typename elements_type::const_iterator it = elements.begin() ; it != elements.end() ; ++it) + { + serialization_save(*it, "v", m_archive); + } + } + +private: + Archive & m_archive; + unsigned int m_version; +}; + +}}}}}} // boost::geometry::index::detail::rtree::visitors + +// TODO - move to index/detail/rtree/load.hpp +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { + +template +class load +{ + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; + + typedef typename Options::parameters_type parameters_type; + + typedef typename Allocators::node_pointer node_pointer; + typedef rtree::node_auto_ptr node_auto_ptr; + typedef typename Allocators::size_type size_type; + +public: + template inline static + node_pointer apply(Archive & ar, unsigned int version, size_type leafs_level, size_type & values_count, parameters_type const& parameters, Translator const& translator, Allocators & allocators) + { + values_count = 0; + return raw_apply(ar, version, leafs_level, values_count, parameters, translator, allocators); + } + +private: + template inline static + node_pointer raw_apply(Archive & ar, unsigned int version, size_type leafs_level, size_type & values_count, parameters_type const& parameters, Translator const& translator, Allocators & allocators, size_type current_level = 0) + { + //BOOST_GEOMETRY_INDEX_ASSERT(current_level <= leafs_level, "invalid parameter"); + + // change to elements_type::size_type or size_type? + size_t elements_count; + ar >> boost::serialization::make_nvp("s", elements_count); + + if ( elements_count < parameters.get_min_elements() || parameters.get_max_elements() < elements_count ) + BOOST_THROW_EXCEPTION(std::runtime_error("rtree loading error")); + + if ( current_level < leafs_level ) + { + node_pointer n = rtree::create_node::apply(allocators); // MAY THROW (A) + node_auto_ptr auto_remover(n, allocators); + internal_node & in = rtree::get(*n); + + typedef typename rtree::elements_type::type elements_type; + typedef typename elements_type::value_type element_type; + typedef typename elements_type::size_type elements_size; + elements_type & elements = rtree::elements(in); + + elements.reserve(elements_count); // MAY THROW (A) + + for ( size_t i = 0 ; i < elements_count ; ++i ) + { + typedef typename elements_type::value_type::first_type box_type; + box_type b = serialization_load("b", ar); + node_pointer n = raw_apply(ar, version, leafs_level, values_count, parameters, translator, allocators, current_level+1); // recursive call + elements.push_back(element_type(b, n)); + } + + auto_remover.release(); + return n; + } + else + { + BOOST_GEOMETRY_INDEX_ASSERT(current_level == leafs_level, "unexpected value"); + + node_pointer n = rtree::create_node::apply(allocators); // MAY THROW (A) + node_auto_ptr auto_remover(n, allocators); + leaf & l = rtree::get(*n); + + typedef typename rtree::elements_type::type elements_type; + typedef typename elements_type::value_type element_type; + elements_type & elements = rtree::elements(l); + + values_count += elements_count; + + elements.reserve(elements_count); // MAY THROW (A) + + for ( size_t i = 0 ; i < elements_count ; ++i ) + { + element_type el = serialization_load("v", ar); // MAY THROW (C) + elements.push_back(el); // MAY THROW (C) + } + + auto_remover.release(); + return n; + } + } +}; + +}}}}} // boost::geometry::index::detail::rtree + +// TODO - move to index/detail/rtree/private_view.hpp +namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree { + +template +class const_private_view +{ +public: + typedef typename Rtree::size_type size_type; + + typedef typename Rtree::translator_type translator_type; + typedef typename Rtree::value_type value_type; + typedef typename Rtree::options_type options_type; + typedef typename Rtree::box_type box_type; + typedef typename Rtree::allocators_type allocators_type; + + const_private_view(Rtree const& rt) : m_rtree(rt) {} + + typedef typename Rtree::members_holder members_holder; + + members_holder const& members() const { return m_rtree.m_members; } + +private: + const_private_view(const_private_view const&); + const_private_view & operator=(const_private_view const&); + + Rtree const& m_rtree; +}; + +template +class private_view +{ +public: + typedef typename Rtree::size_type size_type; + + typedef typename Rtree::translator_type translator_type; + typedef typename Rtree::value_type value_type; + typedef typename Rtree::options_type options_type; + typedef typename Rtree::box_type box_type; + typedef typename Rtree::allocators_type allocators_type; + + private_view(Rtree & rt) : m_rtree(rt) {} + + typedef typename Rtree::members_holder members_holder; + + members_holder & members() { return m_rtree.m_members; } + members_holder const& members() const { return m_rtree.m_members; } + +private: + private_view(private_view const&); + private_view & operator=(private_view const&); + + Rtree & m_rtree; +}; + +}}}}} // namespace boost::geometry::index::detail::rtree + +// TODO - move to index/serialization/rtree.hpp +namespace boost { namespace serialization { + +template +void save(Archive & ar, boost::geometry::index::rtree const& rt, unsigned int version) +{ + namespace detail = boost::geometry::index::detail; + + typedef boost::geometry::index::rtree rtree; + typedef detail::rtree::const_private_view view; + typedef typename view::translator_type translator_type; + typedef typename view::value_type value_type; + typedef typename view::options_type options_type; + typedef typename view::box_type box_type; + typedef typename view::allocators_type allocators_type; + + view tree(rt); + + detail::serialization_save(tree.members().parameters(), "parameters", ar); + + ar << boost::serialization::make_nvp("values_count", tree.members().values_count); + ar << boost::serialization::make_nvp("leafs_level", tree.members().leafs_level); + + if ( tree.members().values_count ) + { + BOOST_GEOMETRY_INDEX_ASSERT(tree.members().root, "root shouldn't be null_ptr"); + + detail::rtree::visitors::save save_v(ar, version); + detail::rtree::apply_visitor(save_v, *tree.members().root); + } +} + +template +void load(Archive & ar, boost::geometry::index::rtree & rt, unsigned int version) +{ + namespace detail = boost::geometry::index::detail; + + typedef boost::geometry::index::rtree rtree; + typedef detail::rtree::private_view view; + typedef typename view::size_type size_type; + typedef typename view::translator_type translator_type; + typedef typename view::value_type value_type; + typedef typename view::options_type options_type; + typedef typename view::box_type box_type; + typedef typename view::allocators_type allocators_type; + + typedef typename options_type::parameters_type parameters_type; + typedef typename allocators_type::node_pointer node_pointer; + typedef detail::rtree::node_auto_ptr node_auto_ptr; + + view tree(rt); + + parameters_type params = detail::serialization_load("parameters", ar); + + size_type values_count, leafs_level; + ar >> boost::serialization::make_nvp("values_count", values_count); + ar >> boost::serialization::make_nvp("leafs_level", leafs_level); + + node_pointer n(0); + if ( 0 < values_count ) + { + size_type loaded_values_count = 0; + n = detail::rtree::load + ::apply(ar, version, leafs_level, loaded_values_count, params, tree.members().translator(), tree.members().allocators()); // MAY THROW + + node_auto_ptr remover(n, tree.members().allocators()); + if ( loaded_values_count != values_count ) + BOOST_THROW_EXCEPTION(std::runtime_error("unexpected number of values")); // TODO change exception type + remover.release(); + } + + tree.members().parameters() = params; + tree.members().values_count = values_count; + tree.members().leafs_level = leafs_level; + + node_auto_ptr remover(tree.members().root, tree.members().allocators()); + tree.members().root = n; +} + +template inline +void serialize(Archive & ar, boost::geometry::index::rtree & rt, unsigned int version) +{ + split_free(ar, rt, version); +} + +template inline +void serialize(Archive & ar, boost::geometry::index::rtree const& rt, unsigned int version) +{ + split_free(ar, rt, version); +} + +}} // boost::serialization + +#endif // BOOST_GEOMETRY_INDEX_DETAIL_SERIALIZATION_HPP diff --git a/include/boost/geometry/index/detail/type_erased_iterators.hpp b/include/boost/geometry/index/detail/type_erased_iterators.hpp deleted file mode 100644 index 92867a4ce..000000000 --- a/include/boost/geometry/index/detail/type_erased_iterators.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// Boost.Geometry Index -// -// Type-erased iterators -// -// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. -// -// 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_INDEX_DETAIL_TYPE_ERASED_ITERATORS_HPP -#define BOOST_GEOMETRY_INDEX_DETAIL_TYPE_ERASED_ITERATORS_HPP - -#include -#include - -namespace boost { namespace geometry { namespace index { namespace detail { - -template -struct single_pass_iterator_concept : - ::boost::mpl::vector< - ::boost::type_erasure::copy_constructible, - ::boost::type_erasure::equality_comparable, - ::boost::type_erasure::dereferenceable, - ::boost::type_erasure::assignable, - ::boost::type_erasure::incrementable - > -{}; - -template -struct single_pass_iterator_type -{ - typedef ::boost::type_erasure::any< - single_pass_iterator_concept< - ::boost::type_erasure::_self, ValueType, Reference, Pointer, DifferenceType - > - > type; -}; - -}}}} // namespace boost::geometry::index::detail - -namespace boost { namespace type_erasure { - -template -struct concept_interface< - ::boost::geometry::index::detail::single_pass_iterator_concept< - T, ValueType, Reference, Pointer, DifferenceType - >, Base, T> - : Base -{ - typedef ValueType value_type; - typedef Reference reference; - typedef Pointer pointer; - typedef DifferenceType difference_type; - typedef ::std::input_iterator_tag iterator_category; -}; - -}} // namespace boost::type_erasure - -#endif // BOOST_GEOMETRY_INDEX_DETAIL_TYPE_ERASED_ITERATORS_HPP diff --git a/include/boost/geometry/index/detail/varray.hpp b/include/boost/geometry/index/detail/varray.hpp index 9570c21ce..78b90bd7e 100644 --- a/include/boost/geometry/index/detail/varray.hpp +++ b/include/boost/geometry/index/detail/varray.hpp @@ -37,6 +37,7 @@ #include #include +#include /*! \defgroup varray_non_member varray non-member functions diff --git a/include/boost/geometry/index/detail/varray_detail.hpp b/include/boost/geometry/index/detail/varray_detail.hpp index 4e16cc97d..2298ef4ce 100644 --- a/include/boost/geometry/index/detail/varray_detail.hpp +++ b/include/boost/geometry/index/detail/varray_detail.hpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include //#include //#include //#include @@ -409,12 +411,12 @@ struct has_nothrow_move : public template inline O uninitialized_move_if_noexcept_dispatch(I first, I last, O dst, boost::mpl::bool_ const& /*use_move*/) -{ return uninitialized_move(first, last, dst); } +{ return varray_detail::uninitialized_move(first, last, dst); } template inline O uninitialized_move_if_noexcept_dispatch(I first, I last, O dst, boost::mpl::bool_ const& /*use_move*/) -{ return uninitialized_copy(first, last, dst); } +{ return varray_detail::uninitialized_copy(first, last, dst); } template inline @@ -532,16 +534,16 @@ void construct(DisableTrivialInit const&, I pos) template inline -void construct_dispatch(I pos, V const& v, - boost::mpl::bool_ const& /*use_memcpy*/) +void construct_copy_dispatch(I pos, V const& v, + boost::mpl::bool_ const& /*use_memcpy*/) { ::memcpy(boost::addressof(*pos), boost::addressof(v), sizeof(V)); } template inline -void construct_dispatch(I pos, P const& p, - boost::mpl::bool_ const& /*use_memcpy*/) +void construct_copy_dispatch(I pos, P const& p, + boost::mpl::bool_ const& /*use_memcpy*/) { typedef typename boost::iterator_value::type V; new (static_cast(boost::addressof(*pos))) V(p); // may throw @@ -559,11 +561,28 @@ void construct(DisableTrivialInit const&, >::type use_memcpy; - construct_dispatch(pos, p, use_memcpy()); // may throw + construct_copy_dispatch(pos, p, use_memcpy()); // may throw } // Needed by push_back(V &&) +template +inline +void construct_move_dispatch(I pos, V const& v, + boost::mpl::bool_ const& /*use_memcpy*/) +{ + ::memcpy(boost::addressof(*pos), boost::addressof(v), sizeof(V)); +} + +template +inline +void construct_move_dispatch(I pos, BOOST_RV_REF(P) p, + boost::mpl::bool_ const& /*use_memcpy*/) +{ + typedef typename boost::iterator_value::type V; + new (static_cast(boost::addressof(*pos))) V(::boost::move(p)); // may throw +} + template inline void construct(DisableTrivialInit const&, I pos, BOOST_RV_REF(P) p) @@ -571,12 +590,11 @@ void construct(DisableTrivialInit const&, I pos, BOOST_RV_REF(P) p) typedef typename ::boost::mpl::and_< is_corresponding_value, - ::boost::has_trivial_copy

+ ::boost::has_trivial_move_constructor

>::type use_memcpy; - typedef typename boost::iterator_value::type V; - new (static_cast(boost::addressof(*pos))) V(::boost::move(p)); // may throw + construct_move_dispatch(pos, ::boost::move(p), use_memcpy()); // may throw } // Needed by emplace_back() and emplace() @@ -624,16 +642,17 @@ void construct(DisableTrivialInit const&, template inline -void assign_dispatch(I pos, V const& v, - boost::mpl::bool_ const& /*use_memcpy*/) +void assign_copy_dispatch(I pos, V const& v, + boost::mpl::bool_ const& /*use_memcpy*/) { +// TODO - use memmove here? ::memcpy(boost::addressof(*pos), boost::addressof(v), sizeof(V)); } template inline -void assign_dispatch(I pos, V const& v, - boost::mpl::bool_ const& /*use_memcpy*/) +void assign_copy_dispatch(I pos, V const& v, + boost::mpl::bool_ const& /*use_memcpy*/) { *pos = v; // may throw } @@ -649,16 +668,39 @@ void assign(I pos, V const& v) >::type use_memcpy; - assign_dispatch(pos, v, use_memcpy()); // may throw + assign_copy_dispatch(pos, v, use_memcpy()); // may throw +} + +template +inline +void assign_move_dispatch(I pos, V const& v, + boost::mpl::bool_ const& /*use_memcpy*/) +{ +// TODO - use memmove here? + ::memcpy(boost::addressof(*pos), boost::addressof(v), sizeof(V)); +} + +template +inline +void assign_move_dispatch(I pos, BOOST_RV_REF(V) v, + boost::mpl::bool_ const& /*use_memcpy*/) +{ + *pos = boost::move(v); // may throw } template inline void assign(I pos, BOOST_RV_REF(V) v) { - *pos = boost::move(v); // may throw -} + typedef typename + ::boost::mpl::and_< + is_corresponding_value, + ::boost::has_trivial_move_assign + >::type + use_memcpy; + assign_move_dispatch(pos, ::boost::move(v), use_memcpy()); +} // uninitialized_copy_s diff --git a/include/boost/geometry/index/predicates.hpp b/include/boost/geometry/index/predicates.hpp index 5bf88df05..ad6a537f0 100644 --- a/include/boost/geometry/index/predicates.hpp +++ b/include/boost/geometry/index/predicates.hpp @@ -24,8 +24,6 @@ namespace boost { namespace geometry { namespace index { -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - /*! \brief Generate \c contains() predicate. @@ -51,8 +49,6 @@ contains(Geometry const& g) return detail::spatial_predicate(g); } -#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - /*! \brief Generate \c covered_by() predicate. @@ -78,8 +74,6 @@ covered_by(Geometry const& g) return detail::spatial_predicate(g); } -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - /*! \brief Generate \c covers() predicate. @@ -105,8 +99,6 @@ covers(Geometry const& g) return detail::spatial_predicate(g); } -#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - /*! \brief Generate \c disjoint() predicate. diff --git a/include/boost/geometry/index/rtree.hpp b/include/boost/geometry/index/rtree.hpp index 018d508f6..6decfe70f 100644 --- a/include/boost/geometry/index/rtree.hpp +++ b/include/boost/geometry/index/rtree.hpp @@ -61,11 +61,11 @@ #include -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL #include -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS -#include -#endif + +#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL +// serialization +#include #endif // TODO change the name to bounding_tree @@ -98,13 +98,18 @@ Predefined algorithms with run-time parameters are: \li \c boost::geometry::index::dynamic_quadratic, \li \c boost::geometry::index::dynamic_rstar. -\par Translator -The Translator translates from Value to Indexable each time r-tree requires it. Which means that this -operation is done for each Value access. Therefore the Translator should return the Indexable by -const reference instead of a value. Default translator can translate all types adapted to Point +\par IndexableGetter +The object of IndexableGetter type translates from Value to Indexable each time r-tree requires it. Which means that this +operation is done for each Value access. Therefore the IndexableGetter should return the Indexable by +const reference instead of a value. Default one can translate all types adapted to Point or Box concepts (called Indexables). It also handles std::pair and boost::tuple. For example, if std::pair is stored in the -container, the default translator translates from std::pair const& to Box const&. +container, the default IndexableGetter translates from std::pair const& to Box const&. + +\par EqualTo +The object of EqualTo type compares Values and returns true if they're equal. It's similar to std::equal_to<>. +The default EqualTo returns the result of boost::geometry::equals() for types adapted to some Geometry concept +defined in Boost.Geometry and the result of operator= for other types. Components of Pairs and Tuples are compared left-to-right. \tparam Value The type of objects stored in the container. \tparam Parameters Compile-time parameters. @@ -166,8 +171,13 @@ private: typedef typename allocators_type::node_pointer node_pointer; typedef ::boost::container::allocator_traits allocator_traits_type; + typedef detail::rtree::node_auto_ptr node_auto_ptr; friend class detail::rtree::utilities::view; +#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL + friend class detail::rtree::private_view; + friend class detail::rtree::const_private_view; +#endif public: @@ -184,6 +194,9 @@ public: /*! \brief Unsigned integral type used by the container. */ typedef typename allocators_type::size_type size_type; + /*! \brief Type of const query iterator. */ + typedef index::detail::rtree::iterators::query_iterator const_query_iterator; + public: /*! @@ -223,6 +236,8 @@ public: /*! \brief The constructor. + The tree is created using packing algorithm. + \param first The beginning of the range of Values. \param last The end of the range of Values. \param parameters The parameters object. @@ -254,6 +269,8 @@ public: /*! \brief The constructor. + The tree is created using packing algorithm. + \param rng The range of Values. \param parameters The parameters object. \param getter The function object extracting Indexable from Value. @@ -682,14 +699,18 @@ public: Spatial predicates Spatial predicates may be generated by one of the functions listed below: + \li \c boost::geometry::index::contains(), \li \c boost::geometry::index::covered_by(), + \li \c boost::geometry::index::covers(), \li \c boost::geometry::index::disjoint(), \li \c boost::geometry::index::intersects(), \li \c boost::geometry::index::overlaps(), \li \c boost::geometry::index::within(), It is possible to negate spatial predicates: + \li ! boost::geometry::index::contains(), \li ! boost::geometry::index::covered_by(), + \li ! boost::geometry::index::covers(), \li ! boost::geometry::index::disjoint(), \li ! boost::geometry::index::intersects(), \li ! boost::geometry::index::overlaps(), @@ -726,6 +747,7 @@ public: \par Throws If Value copy constructor or copy assignment throws. + If predicates copy throws. \warning Only one \c nearest() perdicate may be passed to the query. Passing more of them results in compile-time error. @@ -748,44 +770,123 @@ public: return query_dispatch(predicates, out_it, boost::mpl::bool_()); } -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL + /*! + \brief Returns the query iterator pointing at the begin of the query range. -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS + This method returns the iterator which may be used to perform iterative queries. For the information + about the predicates which may be passed to this method see query(). + + \par Example + \verbatim + for ( Rtree::const_query_iterator it = tree.qbegin(bgi::nearest(pt, 10000)) ; + it != tree.qend() ; ++it ) + { + // do something with value + if ( has_enough_nearest_values() ) + break; + } + \endverbatim - // BEWARE! - // Don't use this type-erased iterator after assigning values returned by qbegin(Pred) and qend() - // e.g. don't pass them into the std::copy() or compare them like this: - // const_query_iterator i1 = qbegin(...); - // const_query_iterator i2 = qend(); - // i1 == i2; // BAM! - // now this will cause undefined behaviour. - // using native types is ok: - // qbegin(...) == qend(); + \par Throws + If predicates copy throws. + If allocation throws. - typedef typename index::detail::single_pass_iterator_type< - value_type, const_reference, const_pointer, difference_type - >::type const_query_iterator; + \param predicates Predicates. + + \return The iterator pointing at the begin of the query range. + */ + template + const_query_iterator qbegin(Predicates const& predicates) const + { + return const_query_iterator(qbegin_(predicates)); + } -#endif // BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS + /*! + \brief Returns the query iterator pointing at the end of the query range. + This method returns the iterator which may be used to check if the query has ended. + + \par Example + \verbatim + for ( Rtree::const_query_iterator it = tree.qbegin(bgi::nearest(pt, 10000)) ; + it != tree.qend() ; ++it ) + { + // do something with value + if ( has_enough_nearest_values() ) + break; + } + \endverbatim + + \par Throws + Nothing + + \return The iterator pointing at the end of the query range. + */ + const_query_iterator qend() const + { + return const_query_iterator(); + } + +#ifndef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL +private: +#endif + /*! + \brief Returns the query iterator pointing at the begin of the query range. + + This method returns the iterator which may be used to perform iterative queries. For the information + about the predicates which may be passed to this method see query(). + + The type of the returned iterator depends on the type of passed Predicates but the iterator of this type + may be assigned to the variable of const_query_iterator type. If you'd like to use the type of the iterator + returned by this method you may get the type e.g. by using C++11 decltype or Boost.Typeof library. + This iterator may be compared with iterators returned by both versions of qend() method. + + \par Example + \verbatim + // Store the result in the container using std::copy() - it requires both iterators of the same type + std::copy(tree.qbegin(bgi::intersects(box)), tree.qend(bgi::intersects(box)), std::back_inserter(result)); + + // Store the result in the container using std::copy() and type-erased iterators + Rtree::const_query_iterator first = tree.qbegin(bgi::intersects(box)); + Rtree::const_query_iterator last = tree.qend(); + std::copy(first, last, std::back_inserter(result)); + + // Boost.Typeof + typedef BOOST_TYPEOF(tree.qbegin(bgi::nearest(pt, 10000))) Iter; + for ( Iter it = tree.qbegin(bgi::nearest(pt, 10000)) ; it != tree.qend() ; ++it ) + { + // do something with value + if ( has_enough_nearest_values() ) + break; + } + \endverbatim + + \par Throws + If predicates copy throws. + If allocation throws. + + \param predicates Predicates. + + \return The iterator pointing at the begin of the query range. + */ template typename boost::mpl::if_c< detail::predicates_count_distance::value == 0, - detail::rtree::spatial_query_iterator, - detail::rtree::distance_query_iterator< + detail::rtree::iterators::spatial_query_iterator, + detail::rtree::iterators::distance_query_iterator< value_type, options_type, translator_type, box_type, allocators_type, Predicates, detail::predicates_find_distance::value > >::type - qbegin(Predicates const& predicates) const + qbegin_(Predicates const& predicates) const { static const unsigned distance_predicates_count = detail::predicates_count_distance::value; BOOST_MPL_ASSERT_MSG((distance_predicates_count <= 1), PASS_ONLY_ONE_DISTANCE_PREDICATE, (Predicates)); typedef typename boost::mpl::if_c< detail::predicates_count_distance::value == 0, - detail::rtree::spatial_query_iterator, - detail::rtree::distance_query_iterator< + detail::rtree::iterators::spatial_query_iterator, + detail::rtree::iterators::distance_query_iterator< value_type, options_type, translator_type, box_type, allocators_type, Predicates, detail::predicates_find_distance::value > @@ -797,24 +898,50 @@ public: return iterator_type(m_members.root, m_members.translator(), predicates); } + /*! + \brief Returns the query iterator pointing at the end of the query range. + + This method returns the iterator which may be used to perform iterative queries. For the information + about the predicates which may be passed to this method see query(). + + The type of the returned iterator depends on the type of passed Predicates but the iterator of this type + may be assigned to the variable of const_query_iterator type. If you'd like to use the type of the iterator + returned by this method you may get the type e.g. by using C++11 decltype or Boost.Typeof library. + + The type of the iterator returned by this method is the same as the one returned by qbegin() to which + the same predicates were passed. + + \par Example + \verbatim + // Store the result in the container using std::copy() - it requires both iterators of the same type + std::copy(tree.qbegin(bgi::intersects(box)), tree.qend(bgi::intersects(box)), std::back_inserter(result)); + \endverbatim + + \par Throws + If predicates copy throws. + + \param predicates Predicates. + + \return The iterator pointing at the end of the query range. + */ template typename boost::mpl::if_c< detail::predicates_count_distance::value == 0, - detail::rtree::spatial_query_iterator, - detail::rtree::distance_query_iterator< + detail::rtree::iterators::spatial_query_iterator, + detail::rtree::iterators::distance_query_iterator< value_type, options_type, translator_type, box_type, allocators_type, Predicates, detail::predicates_find_distance::value > >::type - qend(Predicates const& predicates) const + qend_(Predicates const& predicates) const { static const unsigned distance_predicates_count = detail::predicates_count_distance::value; BOOST_MPL_ASSERT_MSG((distance_predicates_count <= 1), PASS_ONLY_ONE_DISTANCE_PREDICATE, (Predicates)); typedef typename boost::mpl::if_c< detail::predicates_count_distance::value == 0, - detail::rtree::spatial_query_iterator, - detail::rtree::distance_query_iterator< + detail::rtree::iterators::spatial_query_iterator, + detail::rtree::iterators::distance_query_iterator< value_type, options_type, translator_type, box_type, allocators_type, Predicates, detail::predicates_find_distance::value > @@ -823,13 +950,48 @@ public: return iterator_type(m_members.translator(), predicates); } - detail::rtree::end_query_iterator - qend() const + /*! + \brief Returns the query iterator pointing at the end of the query range. + + This method returns the iterator which may be compared with the iterator returned by qbegin() in order to + check if the query has ended. + + The type of the returned iterator is different than the type returned by qbegin() but the iterator of this type + may be assigned to the variable of const_query_iterator type. If you'd like to use the type of the iterator returned by this + method, which most certainly will be faster than the type-erased iterator, you may get the type + e.g. by using C++11 decltype or Boost.Typeof library. + + The type of the iterator returned by this method is dfferent than the type returned by qbegin(). + + \par Example + \verbatim + // Store the result in the container using std::copy() and type-erased iterators + Rtree::const_query_iterator first = tree.qbegin(bgi::intersects(box)); + Rtree::const_query_iterator last = tree.qend(); + std::copy(first, last, std::back_inserter(result)); + + // Boost.Typeof + typedef BOOST_TYPEOF(tree.qbegin(bgi::nearest(pt, 10000))) Iter; + for ( Iter it = tree.qbegin(bgi::nearest(pt, 10000)) ; it != tree.qend() ; ++it ) { - return detail::rtree::end_query_iterator(); + // do something with value + if ( has_enough_nearest_values() ) + break; + } + \endverbatim + + \par Throws + Nothing + + \return The iterator pointing at the end of the query range. + */ + detail::rtree::iterators::end_query_iterator + qend_() const + { + return detail::rtree::iterators::end_query_iterator(); } -#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL +public: /*! \brief Returns the number of stored values. @@ -1155,6 +1317,7 @@ private: dst.m_members.parameters() = src.m_members.parameters(); } + // TODO use node_auto_ptr if ( dst.m_members.root ) { detail::rtree::visitors::destroy @@ -1393,14 +1556,18 @@ Values will be returned only if all predicates are met. Spatial predicates Spatial predicates may be generated by one of the functions listed below: +\li \c boost::geometry::index::contains(), \li \c boost::geometry::index::covered_by(), +\li \c boost::geometry::index::covers(), \li \c boost::geometry::index::disjoint(), \li \c boost::geometry::index::intersects(), \li \c boost::geometry::index::overlaps(), \li \c boost::geometry::index::within(), It is possible to negate spatial predicates: +\li ! boost::geometry::index::contains(), \li ! boost::geometry::index::covered_by(), +\li ! boost::geometry::index::covers(), \li ! boost::geometry::index::disjoint(), \li ! boost::geometry::index::intersects(), \li ! boost::geometry::index::overlaps(), @@ -1459,6 +1626,75 @@ query(rtree const& tree, return tree.query(predicates, out_it); } +/*! +\brief Returns the query iterator pointing at the begin of the query range. + +This method returns the iterator which may be used to perform iterative queries. For the information +about the predicates which may be passed to this method see query(). + +\par Example +\verbatim + +for ( Rtree::const_query_iterator it = qbegin(tree, bgi::nearest(pt, 10000)) ; + it != qend(tree) ; ++it ) +{ + // do something with value + if ( has_enough_nearest_values() ) + break; +} +\endverbatim + +\par Throws +If predicates copy throws. +If allocation throws. + +\ingroup rtree_functions + +\param tree The rtree. +\param predicates Predicates. + +\return The iterator pointing at the begin of the query range. +*/ +template inline +typename rtree::const_query_iterator +qbegin(rtree const& tree, + Predicates const& predicates) +{ + return tree.qbegin(predicates); +} + +/*! +\brief Returns the query iterator pointing at the end of the query range. + +This method returns the iterator which may be used to check if the query has ended. + +\par Example +\verbatim + +for ( Rtree::const_query_iterator it = qbegin(tree, bgi::nearest(pt, 10000)) ; + it != qend(tree) ; ++it ) +{ + // do something with value + if ( has_enough_nearest_values() ) + break; +} +\endverbatim + +\par Throws +Nothing + +\ingroup rtree_functions + +\return The iterator pointing at the end of the query range. +*/ +template inline +typename rtree::const_query_iterator +qend(rtree const& tree) +{ + return tree.qend(); +} + /*! \brief Remove all values from the index. diff --git a/include/boost/geometry/io/svg/svg_mapper.hpp b/include/boost/geometry/io/svg/svg_mapper.hpp index 1252cc806..fbe0a37da 100644 --- a/include/boost/geometry/io/svg/svg_mapper.hpp +++ b/include/boost/geometry/io/svg/svg_mapper.hpp @@ -226,10 +226,17 @@ inline void svg_map(std::ostream& stream, template class svg_mapper : boost::noncopyable { + typedef typename geometry::select_most_precise + < + typename coordinate_type::type, + double + >::type calculation_type; + typedef strategy::transform::map_transformer < - Point, - detail::svg::svg_point_type, + calculation_type, + geometry::dimension::type::value, + geometry::dimension::type::value, true, SameScale > transformer_type; @@ -247,6 +254,7 @@ class svg_mapper : boost::noncopyable m_matrix.reset(new transformer_type(m_bounding_box, m_width, m_height)); + m_stream << "" << std::endl << "" + << "xmlns=\"http://www.w3.org/2000/svg\"" + << std::endl + << "xmlns:xlink=\"http://www.w3.org/1999/xlink\"" + << ">" << std::endl; } } @@ -319,18 +330,6 @@ public : void map(Geometry const& geometry, std::string const& style, int size = -1) { - BOOST_MPL_ASSERT_MSG - ( - ( boost::is_same - < - Point, - typename point_type::type - >::value ) - , POINT_TYPES_ARE_NOT_SAME_FOR_MAPPER_AND_MAP - , (types::type>) - ); - - init_matrix(); svg_map(m_stream, style, size, geometry, *m_matrix); } diff --git a/include/boost/geometry/multi/algorithms/distance.hpp b/include/boost/geometry/multi/algorithms/distance.hpp index 32b41fcef..92352d5fe 100644 --- a/include/boost/geometry/multi/algorithms/distance.hpp +++ b/include/boost/geometry/multi/algorithms/distance.hpp @@ -45,7 +45,12 @@ struct distance_single_to_multi Strategy > { - typedef typename strategy::distance::services::return_type::type return_type; + typedef typename strategy::distance::services::return_type + < + Strategy, + typename point_type::type, + typename point_type::type + >::type return_type; static inline return_type apply(Geometry const& geometry, MultiGeometry const& multi, @@ -84,7 +89,12 @@ struct distance_multi_to_multi Strategy > { - typedef typename strategy::distance::services::return_type::type return_type; + typedef typename strategy::distance::services::return_type + < + Strategy, + typename point_type::type, + typename point_type::type + >::type return_type; static inline return_type apply(Multi1 const& multi1, Multi2 const& multi2, Strategy const& strategy) diff --git a/include/boost/geometry/multi/geometries/concepts/multi_linestring_concept.hpp b/include/boost/geometry/multi/geometries/concepts/multi_linestring_concept.hpp index b0519f07e..d232fa8c8 100644 --- a/include/boost/geometry/multi/geometries/concepts/multi_linestring_concept.hpp +++ b/include/boost/geometry/multi/geometries/concepts/multi_linestring_concept.hpp @@ -53,6 +53,11 @@ public : BOOST_CONCEPT_USAGE(MultiLinestring) { + Geometry* mls = 0; + traits::clear::apply(*mls); + traits::resize::apply(*mls, 0); + linestring_type* ls = 0; + traits::push_back::apply(*mls, *ls); } #endif }; diff --git a/include/boost/geometry/multi/geometries/concepts/multi_point_concept.hpp b/include/boost/geometry/multi/geometries/concepts/multi_point_concept.hpp index f5942df07..7d04248a5 100644 --- a/include/boost/geometry/multi/geometries/concepts/multi_point_concept.hpp +++ b/include/boost/geometry/multi/geometries/concepts/multi_point_concept.hpp @@ -52,6 +52,11 @@ public : BOOST_CONCEPT_USAGE(MultiPoint) { + Geometry* mp = 0; + traits::clear::apply(*mp); + traits::resize::apply(*mp, 0); + point_type* point = 0; + traits::push_back::apply(*mp, *point); } #endif }; diff --git a/include/boost/geometry/multi/geometries/concepts/multi_polygon_concept.hpp b/include/boost/geometry/multi/geometries/concepts/multi_polygon_concept.hpp index ca730d4f6..ec37ef15a 100644 --- a/include/boost/geometry/multi/geometries/concepts/multi_polygon_concept.hpp +++ b/include/boost/geometry/multi/geometries/concepts/multi_polygon_concept.hpp @@ -52,6 +52,11 @@ public : BOOST_CONCEPT_USAGE(MultiPolygon) { + Geometry* mp = 0; + traits::clear::apply(*mp); + traits::resize::apply(*mp, 0); + polygon_type* poly = 0; + traits::push_back::apply(*mp, *poly); } #endif }; diff --git a/include/boost/geometry/multi/io/wkt/read.hpp b/include/boost/geometry/multi/io/wkt/read.hpp index 2bfa830cf..c72f5e128 100644 --- a/include/boost/geometry/multi/io/wkt/read.hpp +++ b/include/boost/geometry/multi/io/wkt/read.hpp @@ -49,7 +49,7 @@ struct multi_parser Parser < typename boost::range_value::type - >::apply(it, tokens.end(), wkt, geometry.back()); + >::apply(it, tokens.end(), wkt, *(boost::end(geometry) - 1)); if (it != tokens.end() && *it == ",") { // Skip "," after multi-element is parsed @@ -101,14 +101,14 @@ struct multi_point_parser point_parser < typename boost::range_value::type - >::apply(it, tokens.end(), wkt, geometry.back()); + >::apply(it, tokens.end(), wkt, *(boost::end(geometry) - 1)); } else { noparenthesis_point_parser < typename boost::range_value::type - >::apply(it, tokens.end(), wkt, geometry.back()); + >::apply(it, tokens.end(), wkt, *(boost::end(geometry) - 1)); } if (it != tokens.end() && *it == ",") diff --git a/include/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp b/include/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp index 8825791db..f59fa55d6 100644 --- a/include/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp +++ b/include/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp @@ -74,9 +74,6 @@ namespace detail \ingroup strategies \details The douglas_peucker strategy simplifies a linestring, ring or vector of points using the well-known Douglas-Peucker algorithm. - For the algorithm, see for example: -\see http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm -\see http://www2.dcs.hull.ac.uk/CISRG/projects/Royal-Inst/demos/dp.html \tparam Point the point type \tparam PointDistanceStrategy point-segment distance strategy to be used \note This strategy uses itself a point-segment-distance strategy which @@ -84,6 +81,12 @@ namespace detail \author Barend and Maarten, 1995/1996 \author Barend, revised for Generic Geometry Library, 2008 */ + +/* +For the algorithm, see for example: + - http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm + - http://www2.dcs.hull.ac.uk/CISRG/projects/Royal-Inst/demos/dp.html +*/ template < typename Point, @@ -99,7 +102,11 @@ public : typedef PointDistanceStrategy distance_strategy_type; // typedef typename strategy::distance::services::comparable_type::type distance_strategy_type; - typedef typename strategy::distance::services::return_type::type return_type; + typedef typename strategy::distance::services::return_type + < + distance_strategy_type, + Point, Point + >::type return_type; private : typedef detail::douglas_peucker_point dp_point_type; @@ -197,8 +204,6 @@ public : // Get points, recursively, including them if they are further away // than the specified distance - typedef typename strategy::distance::services::return_type::type return_type; - consider(boost::begin(ref_candidates), boost::end(ref_candidates), max_distance, n, strategy); // Copy included elements to the output @@ -224,6 +229,17 @@ public : }} // namespace strategy::simplify +namespace traits { + +template +struct point_type > +{ + typedef P type; +}; + +} // namespace traits + + }} // namespace boost::geometry #endif // BOOST_GEOMETRY_STRATEGY_AGNOSTIC_SIMPLIFY_DOUGLAS_PEUCKER_HPP diff --git a/include/boost/geometry/strategies/cartesian/cart_intersect.hpp b/include/boost/geometry/strategies/cartesian/cart_intersect.hpp index 678e9d7c2..9680f6a4f 100644 --- a/include/boost/geometry/strategies/cartesian/cart_intersect.hpp +++ b/include/boost/geometry/strategies/cartesian/cart_intersect.hpp @@ -1,6 +1,7 @@ // Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -746,8 +747,6 @@ private : }} // namespace strategy::intersection - - }} // namespace boost::geometry diff --git a/include/boost/geometry/strategies/cartesian/centroid_bashein_detmer.hpp b/include/boost/geometry/strategies/cartesian/centroid_bashein_detmer.hpp index 8b42715e0..f199fb80e 100644 --- a/include/boost/geometry/strategies/cartesian/centroid_bashein_detmer.hpp +++ b/include/boost/geometry/strategies/cartesian/centroid_bashein_detmer.hpp @@ -38,17 +38,26 @@ namespace strategy { namespace centroid /*! -\brief Centroid calculation using algorith Bashein / Detmer +\brief Centroid calculation using algorithm Bashein / Detmer \ingroup strategies \details Calculates centroid using triangulation method published by Bashein / Detmer \tparam Point point type of centroid to calculate \tparam PointOfSegment point type of segments, defaults to Point -\par Concepts for Point and PointOfSegment: -- specialized point_traits class +\tparam CalculationType \tparam_calculation + \author Adapted from "Centroid of a Polygon" by Gerard Bashein and Paul R. Detmer, in "Graphics Gems IV", Academic Press, 1994 + + +\qbk{ +[heading See also] +[link geometry.reference.algorithms.centroid.centroid_3_with_strategy centroid (with strategy)] +} +*/ + +/* \par Research notes The algorithm gives the same results as Oracle and PostGIS but differs from MySQL @@ -100,12 +109,6 @@ Statements: , mdsys.sdo_dim_array(mdsys.sdo_dim_element('x',0,10,.00000005) ,mdsys.sdo_dim_element('y',0,10,.00000005))) from dual - -\qbk{ -[heading See also] -[link geometry.reference.algorithms.centroid.centroid_3_with_strategy centroid (with strategy)] -} - */ template < @@ -151,9 +154,7 @@ private : , sum_a2(calculation_type()) , sum_x(calculation_type()) , sum_y(calculation_type()) - { - typedef calculation_type ct; - } + {} }; public : diff --git a/include/boost/geometry/strategies/cartesian/distance_projected_point.hpp b/include/boost/geometry/strategies/cartesian/distance_projected_point.hpp index 9cff4d8af..620b5bf4c 100644 --- a/include/boost/geometry/strategies/cartesian/distance_projected_point.hpp +++ b/include/boost/geometry/strategies/cartesian/distance_projected_point.hpp @@ -50,8 +50,6 @@ namespace strategy { namespace distance \ingroup strategies \details Calculates distance using projected-point method, and (optionally) Pythagoras \author Adapted from: http://geometryalgorithms.com/Archive/algorithm_0102/algorithm_0102.htm -\tparam Point \tparam_point -\tparam PointOfSegment \tparam_segment_point \tparam CalculationType \tparam_calculation \tparam Strategy underlying point-point distance strategy \par Concepts for Strategy: @@ -67,10 +65,8 @@ namespace strategy { namespace distance */ template < - typename Point, - typename PointOfSegment = Point, typename CalculationType = void, - typename Strategy = pythagoras + typename Strategy = pythagoras > class projected_point { @@ -81,45 +77,41 @@ public : // Integer coordinates can still result in FP distances. // There is a division, which must be represented in FP. // So promote. - typedef typename promote_floating_point - < - typename strategy::distance::services::return_type - < - Strategy - >::type - >::type calculation_type; - -private : - - // A projected point of points in Integer coordinates must be able to be - // represented in FP. - typedef model::point - < - calculation_type, - dimension::value, - typename coordinate_system::type - > fp_point_type; - - // For convenience - typedef fp_point_type fp_vector_type; - - // We have to use a strategy using FP coordinates (fp-type) which is - // not always the same as Strategy (defined as point_strategy_type) - // So we create a "similar" one - typedef typename strategy::distance::services::similar_type - < - Strategy, - Point, - fp_point_type - >::type fp_strategy_type; + template + struct calculation_type + : promote_floating_point + < + typename strategy::distance::services::return_type + < + Strategy, + Point, + PointOfSegment + >::type + > + {}; public : - inline calculation_type apply(Point const& p, - PointOfSegment const& p1, PointOfSegment const& p2) const + template + inline typename calculation_type::type + apply(Point const& p, PointOfSegment const& p1, PointOfSegment const& p2) const { assert_dimension_equal(); + typedef typename calculation_type::type calculation_type; + + // A projected point of points in Integer coordinates must be able to be + // represented in FP. + typedef model::point + < + calculation_type, + dimension::value, + typename coordinate_system::type + > fp_point_type; + + // For convenience + typedef fp_point_type fp_vector_type; + /* Algorithm [p1: (x1,y1), p2: (x2,y2), p: (px,py)] VECTOR v(x2 - x1, y2 - y1) @@ -157,21 +149,12 @@ public : // See above, c1 > 0 AND c2 > c1 so: c2 != 0 calculation_type const b = c1 / c2; - fp_strategy_type fp_strategy - = strategy::distance::services::get_similar - < - Strategy, Point, fp_point_type - >::apply(strategy); - boost::ignore_unused_variable_warning(fp_strategy); - fp_point_type projected; geometry::convert(p1, projected); multiply_value(v, b); add_point(projected, v); - //std::cout << "distance " << dsv(p) << " .. " << dsv(projected) << std::endl; - - return fp_strategy.apply(p, projected); + return strategy.apply(p, projected); } }; @@ -179,103 +162,64 @@ public : namespace services { -template -struct tag > +template +struct tag > { typedef strategy_tag_distance_point_segment type; }; -template -struct return_type > -{ - typedef typename projected_point::calculation_type type; -}; +template +struct return_type, P, PS> + : projected_point::template calculation_type +{}; -template -struct strategy_point_point > +template +struct strategy_point_point > { typedef Strategy type; }; -template -< - typename Point, - typename PointOfSegment, - typename CalculationType, - typename Strategy, - typename P1, - typename P2 -> -struct similar_type, P1, P2> -{ - typedef projected_point type; -}; - - -template -< - typename Point, - typename PointOfSegment, - typename CalculationType, - typename Strategy, - typename P1, - typename P2 -> -struct get_similar, P1, P2> -{ - static inline typename similar_type - < - projected_point, P1, P2 - >::type apply(projected_point const& ) - { - return projected_point(); - } -}; - - -template -struct comparable_type > +template +struct comparable_type > { // Define a projected_point strategy with its underlying point-point-strategy // being comparable typedef projected_point < - Point, - PointOfSegment, CalculationType, typename comparable_type::type > type; }; -template -struct get_comparable > +template +struct get_comparable > { typedef typename comparable_type < - projected_point + projected_point >::type comparable_type; public : - static inline comparable_type apply(projected_point const& ) + static inline comparable_type apply(projected_point const& ) { return comparable_type(); } }; -template -struct result_from_distance > +template +struct result_from_distance, P, PS> { private : - typedef typename return_type >::type return_type; + typedef typename return_type, P, PS>::type return_type; public : template - static inline return_type apply(projected_point const& , T const& value) + static inline return_type apply(projected_point const& , T const& value) { Strategy s; - return result_from_distance::apply(s, value); + return result_from_distance::apply(s, value); } }; @@ -290,8 +234,6 @@ struct default_strategy +template struct compute_pythagoras { + template static inline T apply(Point1 const& p1, Point2 const& p2) { T const c1 = boost::numeric_cast(get(p1)); T const c2 = boost::numeric_cast(get(p2)); T const d = c1 - c2; - return d * d + compute_pythagoras::apply(p1, p2); + return d * d + compute_pythagoras::apply(p1, p2); } }; -template -struct compute_pythagoras +template +struct compute_pythagoras<0, T> { + template static inline T apply(Point1 const&, Point2 const&) { return boost::numeric_cast(0); @@ -72,24 +74,24 @@ namespace comparable \tparam Point2 \tparam_second_point \tparam CalculationType \tparam_calculation */ -template -< - typename Point1, - typename Point2 = Point1, - typename CalculationType = void -> +template class pythagoras { public : - typedef typename util::calculation_type::geometric::binary - < - Point1, - Point2, - CalculationType - >::type calculation_type; + template + struct calculation_type + : util::calculation_type::geometric::binary + < + Point1, + Point2, + CalculationType + > + {}; - static inline calculation_type apply(Point1 const& p1, Point2 const& p2) + template + static inline typename calculation_type::type + apply(Point1 const& p1, Point2 const& p2) { BOOST_CONCEPT_ASSERT( (concept::ConstPoint) ); BOOST_CONCEPT_ASSERT( (concept::ConstPoint) ); @@ -101,9 +103,8 @@ public : return detail::compute_pythagoras < - Point1, Point2, dimension::value, - calculation_type + typename calculation_type::type >::apply(p1, p2); } }; @@ -114,8 +115,6 @@ public : /*! \brief Strategy to calculate the distance between two points \ingroup strategies -\tparam Point1 \tparam_first_point -\tparam Point2 \tparam_second_point \tparam CalculationType \tparam_calculation \qbk{ @@ -128,22 +127,23 @@ public : */ template < - typename Point1, - typename Point2 = Point1, typename CalculationType = void > class pythagoras { - typedef comparable::pythagoras comparable_type; public : - typedef typename util::calculation_type::geometric::binary - < - Point1, - Point2, - CalculationType, - double, - double // promote integer to double - >::type calculation_type; + + template + struct calculation_type + : util::calculation_type::geometric::binary + < + P1, + P2, + CalculationType, + double, + double // promote integer to double + > + {}; /*! \brief applies the distance calculation using pythagoras @@ -151,10 +151,18 @@ public : \param p1 first point \param p2 second point */ - static inline calculation_type apply(Point1 const& p1, Point2 const& p2) + template + static inline typename calculation_type::type + apply(P1 const& p1, P2 const& p2) { - calculation_type const t = comparable_type::apply(p1, p2); - return sqrt(t); + // The cast is necessary for MSVC which considers sqrt __int64 as an ambiguous call + return std::sqrt + ( + boost::numeric_cast::type> + ( + comparable::pythagoras::apply(p1, p2) + ) + ); } }; @@ -163,81 +171,46 @@ public : namespace services { -template -struct tag > +template +struct tag > { typedef strategy_tag_distance_point_point type; }; -template -struct return_type > +template +struct return_type, P1, P2> + : pythagoras::template calculation_type +{}; + + +template +struct comparable_type > { - typedef typename pythagoras::calculation_type type; + typedef comparable::pythagoras type; }; -template -< - typename Point1, - typename Point2, - typename CalculationType, - typename P1, - typename P2 -> -struct similar_type, P1, P2> +template +struct get_comparable > { - typedef pythagoras type; -}; - - -template -< - typename Point1, - typename Point2, - typename CalculationType, - typename P1, - typename P2 -> -struct get_similar, P1, P2> -{ - static inline typename similar_type - < - pythagoras, P1, P2 - >::type apply(pythagoras const& ) - { - return pythagoras(); - } -}; - - -template -struct comparable_type > -{ - typedef comparable::pythagoras type; -}; - - -template -struct get_comparable > -{ - typedef comparable::pythagoras comparable_type; + typedef comparable::pythagoras comparable_type; public : - static inline comparable_type apply(pythagoras const& ) + static inline comparable_type apply(pythagoras const& ) { return comparable_type(); } }; -template -struct result_from_distance > +template +struct result_from_distance, Point1, Point2> { private : - typedef typename return_type >::type return_type; + typedef typename return_type, Point1, Point2>::type return_type; public : template - static inline return_type apply(pythagoras const& , T const& value) + static inline return_type apply(pythagoras const& , T const& value) { return return_type(value); } @@ -245,83 +218,48 @@ public : // Specializations for comparable::pythagoras -template -struct tag > +template +struct tag > { typedef strategy_tag_distance_point_point type; }; -template -struct return_type > +template +struct return_type, P1, P2> + : comparable::pythagoras::template calculation_type +{}; + + + + +template +struct comparable_type > { - typedef typename comparable::pythagoras::calculation_type type; + typedef comparable::pythagoras type; }; - - -template -< - typename Point1, - typename Point2, - typename CalculationType, - typename P1, - typename P2 -> -struct similar_type, P1, P2> +template +struct get_comparable > { - typedef comparable::pythagoras type; -}; - - -template -< - typename Point1, - typename Point2, - typename CalculationType, - typename P1, - typename P2 -> -struct get_similar, P1, P2> -{ - static inline typename similar_type - < - comparable::pythagoras, P1, P2 - >::type apply(comparable::pythagoras const& ) - { - return comparable::pythagoras(); - } -}; - - -template -struct comparable_type > -{ - typedef comparable::pythagoras type; -}; - - -template -struct get_comparable > -{ - typedef comparable::pythagoras comparable_type; + typedef comparable::pythagoras comparable_type; public : - static inline comparable_type apply(comparable::pythagoras const& ) + static inline comparable_type apply(comparable::pythagoras const& ) { return comparable_type(); } }; -template -struct result_from_distance > +template +struct result_from_distance, Point1, Point2> { private : - typedef typename return_type >::type return_type; + typedef typename return_type, Point1, Point2>::type return_type; public : template - static inline return_type apply(comparable::pythagoras const& , T const& value) + static inline return_type apply(comparable::pythagoras const& , T const& value) { return_type const v = value; return v * v; @@ -332,7 +270,7 @@ public : template struct default_strategy { - typedef pythagoras type; + typedef pythagoras<> type; }; diff --git a/include/boost/geometry/strategies/concepts/distance_concept.hpp b/include/boost/geometry/strategies/concepts/distance_concept.hpp index ba347d015..5d8cfb690 100644 --- a/include/boost/geometry/strategies/concepts/distance_concept.hpp +++ b/include/boost/geometry/strategies/concepts/distance_concept.hpp @@ -23,6 +23,7 @@ #include #include +#include namespace boost { namespace geometry { namespace concept @@ -33,7 +34,7 @@ namespace boost { namespace geometry { namespace concept \brief Checks strategy for point-segment-distance \ingroup distance */ -template +template struct PointDistanceStrategy { #ifndef DOXYGEN_NO_CONCEPT_MEMBERS @@ -42,7 +43,7 @@ private : struct checker { template - static void apply(ApplyMethod const&) + static void apply(ApplyMethod) { // 1: inspect and define both arguments of apply typedef typename parameter_type_of @@ -55,66 +56,44 @@ private : ApplyMethod, 1 >::type ptype2; - // 2) check if apply-arguments fulfill point concept - BOOST_CONCEPT_ASSERT - ( - (concept::ConstPoint) - ); - - BOOST_CONCEPT_ASSERT - ( - (concept::ConstPoint) - ); - - - // 3) must define meta-function return_type - typedef typename strategy::distance::services::return_type::type rtype; - - // 4) must define meta-function "similar_type" - typedef typename strategy::distance::services::similar_type + // 2) must define meta-function return_type + typedef typename strategy::distance::services::return_type < - Strategy, ptype2, ptype1 - >::type stype; + Strategy, ptype1, ptype2 + >::type rtype; - // 5) must define meta-function "comparable_type" + // 3) must define meta-function "comparable_type" typedef typename strategy::distance::services::comparable_type < Strategy >::type ctype; - // 6) must define meta-function "tag" + // 4) must define meta-function "tag" typedef typename strategy::distance::services::tag < Strategy >::type tag; - // 7) must implement apply with arguments + // 5) must implement apply with arguments Strategy* str = 0; ptype1 *p1 = 0; ptype2 *p2 = 0; rtype r = str->apply(*p1, *p2); - // 8) must define (meta)struct "get_similar" with apply - stype s = strategy::distance::services::get_similar - < - Strategy, - ptype2, ptype1 - >::apply(*str); - - // 9) must define (meta)struct "get_comparable" with apply + // 6) must define (meta)struct "get_comparable" with apply ctype c = strategy::distance::services::get_comparable < Strategy >::apply(*str); - // 10) must define (meta)struct "result_from_distance" with apply + // 7) must define (meta)struct "result_from_distance" with apply r = strategy::distance::services::result_from_distance < - Strategy + Strategy, + ptype1, ptype2 >::apply(*str, 1.0); boost::ignore_unused_variable_warning(str); - boost::ignore_unused_variable_warning(s); boost::ignore_unused_variable_warning(c); boost::ignore_unused_variable_warning(r); } @@ -125,7 +104,7 @@ private : public : BOOST_CONCEPT_USAGE(PointDistanceStrategy) { - checker::apply(&Strategy::apply); + checker::apply(&Strategy::template apply); } #endif }; @@ -135,7 +114,7 @@ public : \brief Checks strategy for point-segment-distance \ingroup strategy_concepts */ -template +template struct PointSegmentDistanceStrategy { #ifndef DOXYGEN_NO_CONCEPT_MEMBERS @@ -144,7 +123,7 @@ private : struct checker { template - static void apply(ApplyMethod const&) + static void apply(ApplyMethod) { typedef typename parameter_type_of < @@ -156,26 +135,14 @@ private : ApplyMethod, 1 >::type sptype; - // 2) check if apply-arguments fulfill point concept - BOOST_CONCEPT_ASSERT - ( - (concept::ConstPoint) - ); + // 1) must define meta-function return_type + typedef typename strategy::distance::services::return_type::type rtype; - BOOST_CONCEPT_ASSERT - ( - (concept::ConstPoint) - ); - - - // 3) must define meta-function return_type - typedef typename strategy::distance::services::return_type::type rtype; - - // 4) must define underlying point-distance-strategy + // 2) must define underlying point-distance-strategy typedef typename strategy::distance::services::strategy_point_point::type stype; BOOST_CONCEPT_ASSERT ( - (concept::PointDistanceStrategy) + (concept::PointDistanceStrategy) ); @@ -194,7 +161,7 @@ private : public : BOOST_CONCEPT_USAGE(PointSegmentDistanceStrategy) { - checker::apply(&Strategy::apply); + checker::apply(&Strategy::template apply); } #endif }; diff --git a/include/boost/geometry/strategies/concepts/simplify_concept.hpp b/include/boost/geometry/strategies/concepts/simplify_concept.hpp index 92e5156b5..e1506e884 100644 --- a/include/boost/geometry/strategies/concepts/simplify_concept.hpp +++ b/include/boost/geometry/strategies/concepts/simplify_concept.hpp @@ -19,6 +19,7 @@ #include +#include #include @@ -30,7 +31,7 @@ namespace boost { namespace geometry { namespace concept \brief Checks strategy for simplify \ingroup simplify */ -template +template struct SimplifyStrategy { #ifndef DOXYGEN_NO_CONCEPT_MEMBERS @@ -44,7 +45,7 @@ private : struct checker { template - static void apply(ApplyMethod const&) + static void apply(ApplyMethod) { namespace ft = boost::function_types; typedef typename ft::parameter_types @@ -59,29 +60,14 @@ private : boost::mpl::int_<0> >::type base_index; - // 1: inspect and define both arguments of apply - typedef typename boost::remove_const - < - typename boost::remove_reference - < - typename boost::mpl::at - < - parameter_types, - base_index - >::type - >::type - >::type point_type; - - - BOOST_CONCEPT_ASSERT ( - (concept::PointSegmentDistanceStrategy) + (concept::PointSegmentDistanceStrategy) ); Strategy *str = 0; - std::vector const* v1 = 0; - std::vector * v2 = 0; + std::vector const* v1 = 0; + std::vector * v2 = 0; // 2) must implement method apply with arguments // - Range @@ -96,8 +82,7 @@ private : public : BOOST_CONCEPT_USAGE(SimplifyStrategy) { - checker::apply(&ds_type::apply); - + checker::apply(&ds_type::template apply); } #endif }; diff --git a/include/boost/geometry/strategies/default_distance_result.hpp b/include/boost/geometry/strategies/default_distance_result.hpp index ea5f3ff76..74ce495d3 100644 --- a/include/boost/geometry/strategies/default_distance_result.hpp +++ b/include/boost/geometry/strategies/default_distance_result.hpp @@ -39,7 +39,9 @@ struct default_distance_result point_tag, typename point_type::type, typename point_type::type - >::type + >::type, + typename point_type::type, + typename point_type::type >::type type; }; diff --git a/include/boost/geometry/strategies/distance.hpp b/include/boost/geometry/strategies/distance.hpp index ef9a7ee10..4179f8250 100644 --- a/include/boost/geometry/strategies/distance.hpp +++ b/include/boost/geometry/strategies/distance.hpp @@ -30,48 +30,17 @@ namespace strategy { namespace distance { namespace services template struct tag {}; -template struct return_type + +template +struct return_type { BOOST_MPL_ASSERT_MSG ( - false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY, (types) + false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY, (types) ); }; -/*! - \brief Metafunction delivering a similar strategy with other input point types -*/ -template -< - typename Strategy, - typename Point1, - typename Point2 -> -struct similar_type -{ - BOOST_MPL_ASSERT_MSG - ( - false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY - , (types) - ); -}; - -template -< - typename Strategy, - typename Point1, - typename Point2 -> -struct get_similar -{ - BOOST_MPL_ASSERT_MSG - ( - false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY - , (types) - ); -}; - template struct comparable_type { BOOST_MPL_ASSERT_MSG @@ -88,7 +57,8 @@ template struct get_comparable ); }; -template struct result_from_distance {}; +template +struct result_from_distance {}; // For point-segment only: diff --git a/include/boost/geometry/strategies/intersection.hpp b/include/boost/geometry/strategies/intersection.hpp index fc628c063..243f5b561 100644 --- a/include/boost/geometry/strategies/intersection.hpp +++ b/include/boost/geometry/strategies/intersection.hpp @@ -17,7 +17,6 @@ #include #include -#include #include #include diff --git a/include/boost/geometry/strategies/spherical/area_huiller.hpp b/include/boost/geometry/strategies/spherical/area_huiller.hpp index 1bef9b5f2..c41d80abc 100644 --- a/include/boost/geometry/strategies/spherical/area_huiller.hpp +++ b/include/boost/geometry/strategies/spherical/area_huiller.hpp @@ -82,8 +82,7 @@ protected : calculation_type sum; // Distances are calculated on unit sphere here - strategy::distance::haversine - distance_over_unit_sphere; + strategy::distance::haversine distance_over_unit_sphere; inline excess_sum() diff --git a/include/boost/geometry/strategies/spherical/distance_cross_track.hpp b/include/boost/geometry/strategies/spherical/distance_cross_track.hpp index 7b353020e..4185a9479 100644 --- a/include/boost/geometry/strategies/spherical/distance_cross_track.hpp +++ b/include/boost/geometry/strategies/spherical/distance_cross_track.hpp @@ -10,6 +10,7 @@ #define BOOST_GEOMETRY_STRATEGIES_SPHERICAL_DISTANCE_CROSS_TRACK_HPP +#include #include #include #include @@ -21,6 +22,7 @@ #include #include +#include #include #include @@ -40,10 +42,8 @@ namespace strategy { namespace distance /*! \brief Strategy functor for distance point to segment calculation \ingroup strategies -\details Class which calculates the distance of a point to a segment, using latlong points +\details Class which calculates the distance of a point to a segment, for points on a sphere or globe \see http://williams.best.vwh.net/avform.htm -\tparam Point point type -\tparam PointOfSegment \tparam_segment_point \tparam CalculationType \tparam_calculation \tparam Strategy underlying point-point distance strategy, defaults to haversine @@ -55,40 +55,35 @@ namespace strategy { namespace distance */ template < - typename Point, - typename PointOfSegment = Point, typename CalculationType = void, - typename Strategy = typename services::default_strategy::type + typename Strategy = haversine > class cross_track { public : - typedef typename promote_floating_point - < - typename select_calculation_type - < - Point, - PointOfSegment, - CalculationType - >::type - >::type return_type; + template + struct return_type + : promote_floating_point + < + typename select_calculation_type + < + Point, + PointOfSegment, + CalculationType + >::type + > + {}; inline cross_track() - { - m_strategy = Strategy(); - m_radius = m_strategy.radius(); - } + {} - inline cross_track(return_type const& r) - : m_radius(r) - , m_strategy(r) + explicit inline cross_track(typename Strategy::radius_type const& r) + : m_strategy(r) {} inline cross_track(Strategy const& s) : m_strategy(s) - { - m_radius = m_strategy.radius(); - } + {} // It might be useful in the future @@ -96,9 +91,20 @@ public : // crosstrack(...) {} - inline return_type apply(Point const& p, - PointOfSegment const& sp1, PointOfSegment const& sp2) const + template + inline typename return_type::type + apply(Point const& p, PointOfSegment const& sp1, PointOfSegment const& sp2) const { + +#if !defined(BOOST_MSVC) + BOOST_CONCEPT_ASSERT + ( + (concept::PointDistanceStrategy) + ); +#endif + + typedef typename return_type::type return_type; + // http://williams.best.vwh.net/avform.htm#XTE return_type d1 = m_strategy.apply(sp1, p); return_type d3 = m_strategy.apply(sp1, sp2); @@ -132,7 +138,7 @@ public : if(projection1 > 0.0 && projection2 > 0.0) { - return_type XTD = m_radius * geometry::math::abs( asin( sin( d1 / m_radius ) * sin( d_crs1 ) )); + return_type XTD = radius() * geometry::math::abs( asin( sin( d1 / radius() ) * sin( d_crs1 ) )); #ifdef BOOST_GEOMETRY_DEBUG_CROSS_TRACK std::cout << "Projection ON the segment" << std::endl; @@ -153,23 +159,20 @@ public : } } - inline return_type radius() const { return m_radius; } + inline typename Strategy::radius_type radius() const + { return m_strategy.radius(); } private : - BOOST_CONCEPT_ASSERT - ( - (geometry::concept::PointDistanceStrategy) - ); - - return_type m_radius; - - // Point-point distances are calculated in radians, on the unit sphere Strategy m_strategy; /// Calculate course (bearing) between two points. Might be moved to a "course formula" ... - inline return_type course(Point const& p1, Point const& p2) const + template + inline typename return_type::type + course(Point1 const& p1, Point2 const& p2) const { + typedef typename return_type::type return_type; + // http://williams.best.vwh.net/avform.htm#Crs return_type dlon = get_as_radian<0>(p2) - get_as_radian<0>(p1); return_type cos_p2lat = cos(get_as_radian<1>(p2)); @@ -188,116 +191,71 @@ private : namespace services { -template -struct tag > +template +struct tag > { typedef strategy_tag_distance_point_segment type; }; -template -struct return_type > +template +struct return_type, P, PS> + : cross_track::template return_type +{}; + + +template +struct comparable_type > { - typedef typename cross_track::return_type type; + // There is no shortcut, so the strategy itself is its comparable type + typedef cross_track type; }; template < - typename Point, - typename PointOfSegment, typename CalculationType, - typename Strategy, - typename P, - typename PS -> -struct similar_type, P, PS> -{ - typedef cross_track type; -}; - - -template -< - typename Point, - typename PointOfSegment, - typename CalculationType, - typename Strategy, - typename P, - typename PS -> -struct get_similar, P, PS> -{ - static inline typename similar_type - < - cross_track, P, PS - >::type apply(cross_track const& strategy) - { - return cross_track(strategy.radius()); - } -}; - - -template -struct comparable_type > -{ - // Comparable type is here just the strategy - typedef typename similar_type - < - cross_track - < - Point, PointOfSegment, CalculationType, Strategy - >, Point, PointOfSegment - >::type type; -}; - - -template -< - typename Point, typename PointOfSegment, - typename CalculationType, typename Strategy > -struct get_comparable > +struct get_comparable > { typedef typename comparable_type < - cross_track + cross_track >::type comparable_type; public : - static inline comparable_type apply(cross_track const& strategy) + static inline comparable_type apply(cross_track const& strategy) { return comparable_type(strategy.radius()); } }; -template +template < - typename Point, typename PointOfSegment, - typename CalculationType, - typename Strategy + typename CalculationType, + typename Strategy, + typename P, typename PS > -struct result_from_distance > +struct result_from_distance, P, PS> { private : - typedef typename cross_track::return_type return_type; + typedef typename cross_track::template return_type return_type; public : template - static inline return_type apply(cross_track const& , T const& distance) + static inline return_type apply(cross_track const& , T const& distance) { return distance; } }; -template +template < - typename Point, typename PointOfSegment, - typename CalculationType, + typename CalculationType, typename Strategy > -struct strategy_point_point > +struct strategy_point_point > { typedef Strategy type; }; @@ -311,15 +269,13 @@ TODO: spherical polar coordinate system requires "get_as_radian_equatorial<>" template struct default_strategy < - segment_tag, Point, PointOfSegment, - spherical_polar_tag, spherical_polar_tag, + segment_tag, Point, PointOfSegment, + spherical_polar_tag, spherical_polar_tag, Strategy > { typedef cross_track < - Point, - PointOfSegment, void, typename boost::mpl::if_ < @@ -338,15 +294,13 @@ struct default_strategy template struct default_strategy < - segment_tag, Point, PointOfSegment, - spherical_equatorial_tag, spherical_equatorial_tag, + segment_tag, Point, PointOfSegment, + spherical_equatorial_tag, spherical_equatorial_tag, Strategy > { typedef cross_track < - Point, - PointOfSegment, void, typename boost::mpl::if_ < diff --git a/include/boost/geometry/strategies/spherical/distance_haversine.hpp b/include/boost/geometry/strategies/spherical/distance_haversine.hpp index 5a866c2ed..60ccfdbd6 100644 --- a/include/boost/geometry/strategies/spherical/distance_haversine.hpp +++ b/include/boost/geometry/strategies/spherical/distance_haversine.hpp @@ -39,52 +39,57 @@ namespace comparable // - applying asin (which is strictly (monotone) increasing) template < - typename Point1, - typename Point2 = Point1, + typename RadiusType, typename CalculationType = void > class haversine { public : - typedef typename promote_floating_point - < - typename select_calculation_type - < - Point1, - Point2, - CalculationType - >::type - >::type calculation_type; + template + struct calculation_type + : promote_floating_point + < + typename select_calculation_type + < + Point1, + Point2, + CalculationType + >::type + > + {}; - inline haversine(calculation_type const& r = 1.0) + typedef RadiusType radius_type; + + explicit inline haversine(RadiusType const& r = 1.0) : m_radius(r) {} - - static inline calculation_type apply(Point1 const& p1, Point2 const& p2) + template + static inline typename calculation_type::type + apply(Point1 const& p1, Point2 const& p2) { - return calculate(get_as_radian<0>(p1), get_as_radian<1>(p1), - get_as_radian<0>(p2), get_as_radian<1>(p2)); + return calculate::type>( + get_as_radian<0>(p1), get_as_radian<1>(p1), + get_as_radian<0>(p2), get_as_radian<1>(p2) + ); } - inline calculation_type radius() const + inline RadiusType radius() const { return m_radius; } private : - - static inline calculation_type calculate(calculation_type const& lon1, - calculation_type const& lat1, - calculation_type const& lon2, - calculation_type const& lat2) + template + static inline R calculate(T1 const& lon1, T1 const& lat1, + T2 const& lon2, T2 const& lat2) { return math::hav(lat2 - lat1) + cos(lat1) * cos(lat2) * math::hav(lon2 - lon1); } - calculation_type m_radius; + RadiusType m_radius; }; @@ -95,8 +100,7 @@ private : \brief Distance calculation for spherical coordinates on a perfect sphere using haversine \ingroup strategies -\tparam Point1 \tparam_first_point -\tparam Point2 \tparam_second_point +\tparam RadiusType \tparam_radius \tparam CalculationType \tparam_calculation \author Adapted from: http://williams.best.vwh.net/avform.htm \see http://en.wikipedia.org/wiki/Great-circle_distance @@ -117,23 +121,26 @@ A mathematically equivalent formula, which is less subject */ template < - typename Point1, - typename Point2 = Point1, + typename RadiusType, typename CalculationType = void > class haversine { - typedef comparable::haversine comparable_type; + typedef comparable::haversine comparable_type; public : + template + struct calculation_type + : services::return_type + {}; - typedef typename services::return_type::type calculation_type; + typedef RadiusType radius_type; /*! \brief Constructor \param radius radius of the sphere, defaults to 1.0 for the unit sphere */ - inline haversine(calculation_type const& radius = 1.0) + inline haversine(RadiusType const& radius = 1.0) : m_radius(radius) {} @@ -143,8 +150,11 @@ public : \param p1 first point \param p2 second point */ - inline calculation_type apply(Point1 const& p1, Point2 const& p2) const + template + inline typename calculation_type::type + apply(Point1 const& p1, Point2 const& p2) const { + typedef typename calculation_type::type calculation_type; calculation_type const a = comparable_type::apply(p1, p2); calculation_type const c = calculation_type(2.0) * asin(sqrt(a)); return m_radius * c; @@ -154,13 +164,13 @@ public : \brief access to radius value \return the radius */ - inline calculation_type radius() const + inline RadiusType radius() const { return m_radius; } private : - calculation_type m_radius; + RadiusType m_radius; }; @@ -168,52 +178,32 @@ private : namespace services { -template -struct tag > +template +struct tag > { typedef strategy_tag_distance_point_point type; }; -template -struct return_type > +template +struct return_type, P1, P2> + : haversine::template calculation_type +{}; + + +template +struct comparable_type > { - typedef typename haversine::calculation_type type; + typedef comparable::haversine type; }; -template -struct similar_type, P1, P2> -{ - typedef haversine type; -}; - - -template -struct get_similar, P1, P2> +template +struct get_comparable > { private : - typedef haversine this_type; -public : - static inline typename similar_type::type apply(this_type const& input) - { - return haversine(input.radius()); - } -}; - -template -struct comparable_type > -{ - typedef comparable::haversine type; -}; - - -template -struct get_comparable > -{ -private : - typedef haversine this_type; - typedef comparable::haversine comparable_type; + typedef haversine this_type; + typedef comparable::haversine comparable_type; public : static inline comparable_type apply(this_type const& input) { @@ -221,12 +211,12 @@ public : } }; -template -struct result_from_distance > +template +struct result_from_distance, P1, P2> { private : - typedef haversine this_type; - typedef typename return_type::type return_type; + typedef haversine this_type; + typedef typename return_type::type return_type; public : template static inline return_type apply(this_type const& , T const& value) @@ -237,51 +227,31 @@ public : // Specializations for comparable::haversine -template -struct tag > +template +struct tag > { typedef strategy_tag_distance_point_point type; }; -template -struct return_type > +template +struct return_type, P1, P2> + : comparable::haversine::template calculation_type +{}; + + +template +struct comparable_type > { - typedef typename comparable::haversine::calculation_type type; + typedef comparable::haversine type; }; -template -struct similar_type, P1, P2> -{ - typedef comparable::haversine type; -}; - - -template -struct get_similar, P1, P2> +template +struct get_comparable > { private : - typedef comparable::haversine this_type; -public : - static inline typename similar_type::type apply(this_type const& input) - { - return comparable::haversine(input.radius()); - } -}; - -template -struct comparable_type > -{ - typedef comparable::haversine type; -}; - - -template -struct get_comparable > -{ -private : - typedef comparable::haversine this_type; + typedef comparable::haversine this_type; public : static inline this_type apply(this_type const& input) { @@ -290,12 +260,12 @@ public : }; -template -struct result_from_distance > +template +struct result_from_distance, P1, P2> { private : - typedef comparable::haversine strategy_type; - typedef typename return_type::type return_type; + typedef comparable::haversine strategy_type; + typedef typename return_type::type return_type; public : template static inline return_type apply(strategy_type const& strategy, T const& distance) @@ -311,7 +281,7 @@ public : template struct default_strategy { - typedef strategy::distance::haversine type; + typedef strategy::distance::haversine::type> type; }; // Note: spherical polar coordinate system requires "get_as_radian_equatorial" diff --git a/include/boost/geometry/strategies/transform/inverse_transformer.hpp b/include/boost/geometry/strategies/transform/inverse_transformer.hpp index 845a71ded..685cf874b 100644 --- a/include/boost/geometry/strategies/transform/inverse_transformer.hpp +++ b/include/boost/geometry/strategies/transform/inverse_transformer.hpp @@ -31,22 +31,23 @@ namespace strategy { namespace transform { /*! -\brief Transformation strategy to do an inverse ransformation in Cartesian system +\brief Transformation strategy to do an inverse transformation in a Cartesian coordinate system \ingroup strategies -\tparam P1 first point type -\tparam P2 second point type */ -template +template +< + typename CalculationType, + std::size_t Dimension1, + std::size_t Dimension2 +> class inverse_transformer - : public ublas_transformer::type::value, dimension::type::value> + : public ublas_transformer { - typedef typename select_coordinate_type::type T; - public : template inline inverse_transformer(Transformer const& input) { - typedef boost::numeric::ublas::matrix matrix_type; + typedef boost::numeric::ublas::matrix matrix_type; // create a working copy of the input matrix_type copy(input.matrix()); @@ -60,7 +61,7 @@ public : if( res == 0 ) { // create identity matrix - this->m_matrix.assign(boost::numeric::ublas::identity_matrix(copy.size1())); + this->m_matrix.assign(boost::numeric::ublas::identity_matrix(copy.size1())); // backsubstitute to get the inverse boost::numeric::ublas::lu_substitute(copy, pm, this->m_matrix); diff --git a/include/boost/geometry/strategies/transform/map_transformer.hpp b/include/boost/geometry/strategies/transform/map_transformer.hpp index 2755d5353..baf721658 100644 --- a/include/boost/geometry/strategies/transform/map_transformer.hpp +++ b/include/boost/geometry/strategies/transform/map_transformer.hpp @@ -32,25 +32,23 @@ namespace strategy { namespace transform { /*! -\brief Transformation strategy to do map from one to another Cartesian system +\brief Transformation strategy to map from one to another Cartesian coordinate system \ingroup strategies -\tparam P1 first point type -\tparam P2 second point type \tparam Mirror if true map is mirrored upside-down (in most cases pixels are from top to bottom, while map is from bottom to top) */ template < - typename P1, typename P2, - bool Mirror = false, bool SameScale = true, - std::size_t Dimension1 = dimension::type::value, - std::size_t Dimension2 = dimension::type::value + typename CalculationType, + std::size_t Dimension1, + std::size_t Dimension2, + bool Mirror = false, + bool SameScale = true > class map_transformer - : public ublas_transformer + : public ublas_transformer { - typedef typename select_coordinate_type::type T; - typedef boost::numeric::ublas::matrix M; + typedef boost::numeric::ublas::matrix M; public : template diff --git a/include/boost/geometry/strategies/transform/matrix_transformers.hpp b/include/boost/geometry/strategies/transform/matrix_transformers.hpp index b37a3712e..27a3a2ae8 100644 --- a/include/boost/geometry/strategies/transform/matrix_transformers.hpp +++ b/include/boost/geometry/strategies/transform/matrix_transformers.hpp @@ -22,9 +22,20 @@ #define BOOST_UBLAS_TYPE_CHECK 0 #include + +#if defined(__clang__) +// Avoid warning about unused UBLAS function: boost_numeric_ublas_abs +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#endif + #include #include +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + #include #include #include @@ -46,14 +57,12 @@ namespace strategy { namespace transform \see http://en.wikipedia.org/wiki/Affine_transformation and http://www.devmaster.net/wiki/Transformation_matrices \ingroup strategies -\tparam P1 first point type (source) -\tparam P2 second point type (target) -\tparam Dimension1 number of dimensions to transform from first point -\tparam Dimension1 number of dimensions to transform to second point +\tparam Dimension1 number of dimensions to transform from +\tparam Dimension2 number of dimensions to transform to */ template < - typename P1, typename P2, + typename CalculationType, std::size_t Dimension1, std::size_t Dimension2 > @@ -62,13 +71,12 @@ class ublas_transformer }; -template -class ublas_transformer +template +class ublas_transformer { protected : - typedef typename select_coordinate_type::type coordinate_type; - typedef coordinate_type ct; // Abbreviation - typedef boost::numeric::ublas::matrix matrix_type; + typedef CalculationType ct; + typedef boost::numeric::ublas::matrix matrix_type; matrix_type m_matrix; public : @@ -91,17 +99,17 @@ public : inline ublas_transformer() : m_matrix(3, 3) {} + template inline bool apply(P1 const& p1, P2& p2) const { assert_dimension_greater_equal(); assert_dimension_greater_equal(); - coordinate_type const& c1 = get<0>(p1); - coordinate_type const& c2 = get<1>(p1); + ct const& c1 = get<0>(p1); + ct const& c2 = get<1>(p1); - - coordinate_type p2x = c1 * m_matrix(0,0) + c2 * m_matrix(0,1) + m_matrix(0,2); - coordinate_type p2y = c1 * m_matrix(1,0) + c2 * m_matrix(1,1) + m_matrix(1,2); + ct p2x = c1 * m_matrix(0,0) + c2 * m_matrix(0,1) + m_matrix(0,2); + ct p2y = c1 * m_matrix(1,0) + c2 * m_matrix(1,1) + m_matrix(1,2); typedef typename geometry::coordinate_type::type ct2; set<0>(p2, boost::numeric_cast(p2x)); @@ -115,36 +123,34 @@ public : // It IS possible to go from 3 to 2 coordinates -template -class ublas_transformer : public ublas_transformer +template +class ublas_transformer : public ublas_transformer { - typedef typename select_coordinate_type::type coordinate_type; - typedef coordinate_type ct; // Abbreviation + typedef CalculationType ct; public : inline ublas_transformer( ct const& m_0_0, ct const& m_0_1, ct const& m_0_2, ct const& m_1_0, ct const& m_1_1, ct const& m_1_2, ct const& m_2_0, ct const& m_2_1, ct const& m_2_2) - : ublas_transformer( + : ublas_transformer( m_0_0, m_0_1, m_0_2, m_1_0, m_1_1, m_1_2, m_2_0, m_2_1, m_2_2) {} inline ublas_transformer() - : ublas_transformer() + : ublas_transformer() {} }; -template -class ublas_transformer +template +class ublas_transformer { protected : - typedef typename select_coordinate_type::type coordinate_type; - typedef coordinate_type ct; // Abbreviation - typedef boost::numeric::ublas::matrix matrix_type; + typedef CalculationType ct; + typedef boost::numeric::ublas::matrix matrix_type; matrix_type m_matrix; public : @@ -164,11 +170,12 @@ public : inline ublas_transformer() : m_matrix(4, 4) {} + template inline bool apply(P1 const& p1, P2& p2) const { - coordinate_type const& c1 = get<0>(p1); - coordinate_type const& c2 = get<1>(p1); - coordinate_type const& c3 = get<2>(p1); + ct const& c1 = get<0>(p1); + ct const& c2 = get<1>(p1); + ct const& c3 = get<2>(p1); typedef typename geometry::coordinate_type::type ct2; @@ -191,34 +198,30 @@ public : \details Translate moves a geometry a fixed distance in 2 or 3 dimensions. \see http://en.wikipedia.org/wiki/Translation_%28geometry%29 \ingroup strategies -\tparam P1 first point type -\tparam P2 second point type -\tparam Dimension1 number of dimensions to transform from first point -\tparam Dimension1 number of dimensions to transform to second point +\tparam Dimension1 number of dimensions to transform from +\tparam Dimension2 number of dimensions to transform to */ template < - typename P1, typename P2, - std::size_t Dimension1 = geometry::dimension::type::value, - std::size_t Dimension2 = geometry::dimension::type::value + typename CalculationType, + std::size_t Dimension1, + std::size_t Dimension2 > class translate_transformer { }; -template -class translate_transformer : public ublas_transformer +template +class translate_transformer : public ublas_transformer { - typedef typename select_coordinate_type::type coordinate_type; - public : // To have translate transformers compatible for 2/3 dimensions, the // constructor takes an optional third argument doing nothing. - inline translate_transformer(coordinate_type const& translate_x, - coordinate_type const& translate_y, - coordinate_type const& = 0) - : ublas_transformer( + inline translate_transformer(CalculationType const& translate_x, + CalculationType const& translate_y, + CalculationType const& = 0) + : ublas_transformer( 1, 0, translate_x, 0, 1, translate_y, 0, 0, 1) @@ -226,16 +229,14 @@ public : }; -template -class translate_transformer : public ublas_transformer +template +class translate_transformer : public ublas_transformer { - typedef typename select_coordinate_type::type coordinate_type; - public : - inline translate_transformer(coordinate_type const& translate_x, - coordinate_type const& translate_y, - coordinate_type const& translate_z) - : ublas_transformer( + inline translate_transformer(CalculationType const& translate_x, + CalculationType const& translate_y, + CalculationType const& translate_z) + : ublas_transformer( 1, 0, 0, translate_x, 0, 1, 0, translate_y, 0, 0, 1, translate_z, @@ -250,40 +251,37 @@ public : \details Scale scales a geometry up or down in all its dimensions. \see http://en.wikipedia.org/wiki/Scaling_%28geometry%29 \ingroup strategies -\tparam P1 first point type -\tparam P2 second point type -\tparam Dimension1 number of dimensions to transform from first point -\tparam Dimension1 number of dimensions to transform to second point +\tparam Dimension1 number of dimensions to transform from +\tparam Dimension2 number of dimensions to transform to */ template < - typename P1, typename P2 = P1, - std::size_t Dimension1 = geometry::dimension::type::value, - std::size_t Dimension2 = geometry::dimension::type::value + typename CalculationType, + std::size_t Dimension1, + std::size_t Dimension2 > class scale_transformer { }; -template -class scale_transformer : public ublas_transformer +template +class scale_transformer : public ublas_transformer { - typedef typename select_coordinate_type::type coordinate_type; public : - inline scale_transformer(coordinate_type const& scale_x, - coordinate_type const& scale_y, - coordinate_type const& = 0) - : ublas_transformer( + inline scale_transformer(CalculationType const& scale_x, + CalculationType const& scale_y, + CalculationType const& = 0) + : ublas_transformer( scale_x, 0, 0, 0, scale_y, 0, 0, 0, 1) {} - inline scale_transformer(coordinate_type const& scale) - : ublas_transformer( + inline scale_transformer(CalculationType const& scale) + : ublas_transformer( scale, 0, 0, 0, scale, 0, 0, 0, 1) @@ -291,16 +289,14 @@ public : }; -template -class scale_transformer : public ublas_transformer +template +class scale_transformer : public ublas_transformer { - typedef typename select_coordinate_type::type coordinate_type; - public : - inline scale_transformer(coordinate_type const& scale_x, - coordinate_type const& scale_y, - coordinate_type const& scale_z) - : ublas_transformer( + inline scale_transformer(CalculationType const& scale_x, + CalculationType const& scale_y, + CalculationType const& scale_z) + : ublas_transformer( scale_x, 0, 0, 0, 0, scale_y, 0, 0, 0, 0, scale_z, 0, @@ -308,8 +304,8 @@ public : {} - inline scale_transformer(coordinate_type const& scale) - : ublas_transformer( + inline scale_transformer(CalculationType const& scale) + : ublas_transformer( scale, 0, 0, 0, 0, scale, 0, 0, 0, 0, scale, 0, @@ -352,23 +348,16 @@ struct as_radian template < - typename P1, typename P2, - std::size_t Dimension1 = geometry::dimension::type::value, - std::size_t Dimension2 = geometry::dimension::type::value + typename CalculationType, + std::size_t Dimension1, + std::size_t Dimension2 > class rad_rotate_transformer - : public ublas_transformer + : public ublas_transformer { - // Angle has type of coordinate type, but at least a double - typedef typename select_most_precise - < - typename select_coordinate_type::type, - double - >::type angle_type; - public : - inline rad_rotate_transformer(angle_type const& angle) - : ublas_transformer( + inline rad_rotate_transformer(CalculationType const& angle) + : ublas_transformer( cos(angle), sin(angle), 0, -sin(angle), cos(angle), 0, 0, 0, 1) @@ -381,33 +370,31 @@ public : /*! -\brief Strategy of rotate transformation in Cartesian system. +\brief Strategy for rotate transformation in Cartesian coordinate system. \details Rotate rotates a geometry of specified angle about a fixed point (e.g. origin). \see http://en.wikipedia.org/wiki/Rotation_%28mathematics%29 \ingroup strategies -\tparam P1 first point type -\tparam P2 second point type \tparam DegreeOrRadian degree/or/radian, type of rotation angle specification \note A single angle is needed to specify a rotation in 2D. Not yet in 3D, the 3D version requires special things to allow for rotation around X, Y, Z or arbitrary axis. \todo The 3D version will not compile. */ -template -class rotate_transformer : public detail::rad_rotate_transformer +template +< + typename DegreeOrRadian, + typename CalculationType, + std::size_t Dimension1, + std::size_t Dimension2 +> +class rotate_transformer : public detail::rad_rotate_transformer { - // Angle has type of coordinate type, but at least a double - typedef typename select_most_precise - < - typename select_coordinate_type::type, - double - >::type angle_type; public : - inline rotate_transformer(angle_type const& angle) + inline rotate_transformer(CalculationType const& angle) : detail::rad_rotate_transformer < - P1, P2 + CalculationType, Dimension1, Dimension2 >(detail::as_radian::get(angle)) {} }; diff --git a/include/boost/geometry/util/math.hpp b/include/boost/geometry/util/math.hpp index 8c152edd2..5829f9cbd 100644 --- a/include/boost/geometry/util/math.hpp +++ b/include/boost/geometry/util/math.hpp @@ -216,16 +216,27 @@ inline T sqr(T const& value) return value * value; } - /*! \brief Short utility to workaround gcc/clang problem that abs is converting to integer + and that older versions of MSVC does not support abs of long long... \ingroup utility */ template -inline T abs(const T& t) +inline T abs(T const& value) { - using std::abs; - return abs(t); + T const zero = T(); + return value < zero ? -value : value; +} + +/*! +\brief Short utility to calculate the sign of a number: -1 (negative), 0 (zero), 1 (positive) +\ingroup utility +*/ +template +static inline int sign(T const& value) +{ + T const zero = T(); + return value > zero ? 1 : value < zero ? -1 : 0; } diff --git a/index/example/Jamfile.v2 b/index/example/Jamfile.v2 index 2067e8d7c..065f49b98 100644 --- a/index/example/Jamfile.v2 +++ b/index/example/Jamfile.v2 @@ -44,6 +44,7 @@ if $(GLUT_ROOT) } exe random_test : random_test.cpp ; +link serialize.cpp /boost//serialization : ; link benchmark.cpp /boost//chrono : multi ; link benchmark2.cpp /boost//chrono : multi ; link benchmark3.cpp /boost//chrono : multi ; diff --git a/index/example/benchmark_experimental.cpp b/index/example/benchmark_experimental.cpp index 5d9c229a3..34b08744f 100644 --- a/index/example/benchmark_experimental.cpp +++ b/index/example/benchmark_experimental.cpp @@ -8,7 +8,6 @@ // http://www.boost.org/LICENSE_1_0.txt) #define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL -#define BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS #include @@ -72,10 +71,10 @@ int main() #ifndef BOOST_GEOMETRY_INDEX_BENCHMARK_DEBUG size_t values_count = 1000000; size_t queries_count = 100000; - size_t nearest_queries_count = 10000; + size_t nearest_queries_count = 20000; unsigned neighbours_count = 10; size_t path_queries_count = 2000; - size_t path_queries_count2 = 10000; + size_t path_queries_count2 = 20000; unsigned path_values_count = 10; #else size_t values_count = 1000; @@ -175,6 +174,22 @@ int main() std::cout << time << " - query(B) " << queries_count << " found " << temp << '\n'; } + { + clock_t::time_point start = clock_t::now(); + size_t temp = 0; + for (size_t i = 0 ; i < queries_count ; ++i ) + { + float x = coords[i].first; + float y = coords[i].second; + result.clear(); + boost::copy(t | bgi::adaptors::queried(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), + std::back_inserter(result)); + temp += result.size(); + } + dur_t time = clock_t::now() - start; + std::cout << time << " - range queried(B) " << queries_count << " found " << temp << '\n'; + } + #ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL { clock_t::time_point start = clock_t::now(); @@ -185,9 +200,9 @@ int main() float y = coords[i].second; result.clear(); std::copy( - t.qbegin(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), - t.qend(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), - std::back_inserter(result)); + t.qbegin_(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), + t.qend_(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), + std::back_inserter(result)); temp += result.size(); } dur_t time = clock_t::now() - start; @@ -202,15 +217,34 @@ int main() float y = coords[i].second; result.clear(); mycopy( - t.qbegin(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), - t.qend(), + t.qbegin_(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), + t.qend_(), std::back_inserter(result)); temp += result.size(); } dur_t time = clock_t::now() - start; std::cout << time << " - qbegin(B) qend() " << queries_count << " found " << temp << '\n'; } -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS + { + clock_t::time_point start = clock_t::now(); + size_t temp = 0; + for (size_t i = 0 ; i < queries_count ; ++i ) + { + float x = coords[i].first; + float y = coords[i].second; + result.clear(); + boost::copy( + std::make_pair( + t.qbegin_(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), + t.qend_(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))) + ), std::back_inserter(result)); + temp += result.size(); + } + dur_t time = clock_t::now() - start; + std::cout << time << " - range qbegin(B) qend(B)" << queries_count << " found " << temp << '\n'; + } +#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL + { clock_t::time_point start = clock_t::now(); size_t temp = 0; @@ -220,15 +254,29 @@ int main() float y = coords[i].second; result.clear(); RT::const_query_iterator first = t.qbegin(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))); - RT::const_query_iterator last = t.qend(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))); + RT::const_query_iterator last = t.qend(); std::copy(first, last, std::back_inserter(result)); temp += result.size(); } dur_t time = clock_t::now() - start; - std::cout << time << " - type-erased qbegin(B) qend(B) " << queries_count << " found " << temp << '\n'; + std::cout << time << " - type-erased qbegin(B) qend() " << queries_count << " found " << temp << '\n'; + } + { + clock_t::time_point start = clock_t::now(); + size_t temp = 0; + for (size_t i = 0 ; i < queries_count ; ++i ) + { + float x = coords[i].first; + float y = coords[i].second; + result.clear(); + RT::const_query_iterator first = t.qbegin(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))); + RT::const_query_iterator last = t.qend(); + boost::copy(std::make_pair(first, last), std::back_inserter(result)); + temp += result.size(); + } + dur_t time = clock_t::now() - start; + std::cout << time << " - range type-erased qbegin(B) qend() " << queries_count << " found " << temp << '\n'; } -#endif -#endif { clock_t::time_point start = clock_t::now(); @@ -283,8 +331,8 @@ int main() float y = coords[i].second + 100; result.clear(); std::copy( - t.qbegin(bgi::nearest(P(x, y), neighbours_count)), - t.qend(bgi::nearest(P(x, y), neighbours_count)), + t.qbegin_(bgi::nearest(P(x, y), neighbours_count)), + t.qend_(bgi::nearest(P(x, y), neighbours_count)), std::back_inserter(result)); temp += result.size(); } @@ -300,15 +348,16 @@ int main() float y = coords[i].second + 100; result.clear(); mycopy( - t.qbegin(bgi::nearest(P(x, y), neighbours_count)), - t.qend(), + t.qbegin_(bgi::nearest(P(x, y), neighbours_count)), + t.qend_(), std::back_inserter(result)); temp += result.size(); } dur_t time = clock_t::now() - start; std::cout << time << " - qbegin(nearest(P, " << neighbours_count << ")) qend() " << nearest_queries_count << " found " << temp << '\n'; } -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS +#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL + { clock_t::time_point start = clock_t::now(); size_t temp = 0; @@ -318,14 +367,15 @@ int main() float y = coords[i].second; result.clear(); RT::const_query_iterator first = t.qbegin(bgi::nearest(P(x, y), neighbours_count)); - RT::const_query_iterator last = t.qend(bgi::nearest(P(x, y), neighbours_count)); + RT::const_query_iterator last = t.qend(); std::copy(first, last, std::back_inserter(result)); temp += result.size(); } dur_t time = clock_t::now() - start; - std::cout << time << " - type-erased qbegin(nearest(P, " << neighbours_count << ")) qend(n) " << nearest_queries_count << " found " << temp << '\n'; + std::cout << time << " - type-erased qbegin(nearest(P, " << neighbours_count << ")) qend() " << nearest_queries_count << " found " << temp << '\n'; } -#endif + +#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL { LS ls; diff --git a/index/example/glut_vis.cpp b/index/example/glut_vis.cpp index d6a434707..e0e6a00c0 100644 --- a/index/example/glut_vis.cpp +++ b/index/example/glut_vis.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -31,6 +32,7 @@ typedef bg::model::point P; typedef bg::model::box

B; //bgi::rtree t(2, 1); typedef bg::model::linestring

LS; +typedef bg::model::segment

S; typedef bg::model::ring

R; typedef bg::model::polygon

Poly; typedef bg::model::multi_polygon MPoly; @@ -50,10 +52,12 @@ B search_box; R search_ring; Poly search_poly; MPoly search_multi_poly; +S search_segment; +LS search_linestring; LS search_path; enum query_mode_type { - qm_knn, qm_c, qm_d, qm_i, qm_o, qm_w, qm_nc, qm_nd, qm_ni, qm_no, qm_nw, qm_all, qm_ri, qm_pi, qm_mpi, qm_path + qm_knn, qm_c, qm_d, qm_i, qm_o, qm_w, qm_nc, qm_nd, qm_ni, qm_no, qm_nw, qm_all, qm_ri, qm_pi, qm_mpi, qm_si, qm_lsi, qm_path } query_mode = qm_knn; bool search_valid = false; @@ -335,6 +339,81 @@ void query_multi_poly() std::cout << "boxes not found\n"; } +template +void query_segment() +{ + float x = ( rand() % 1000 ) / 10.0f; + float y = ( rand() % 1000 ) / 10.0f; + float w = 10.0f - ( rand() % 1000 ) / 50.0f; + float h = 10.0f - ( rand() % 1000 ) / 50.0f; + w += 0 <= w ? 10 : -10; + h += 0 <= h ? 10 : -10; + + boost::geometry::set<0, 0>(search_segment, x - w); + boost::geometry::set<0, 1>(search_segment, y - h); + boost::geometry::set<1, 0>(search_segment, x + w); + boost::geometry::set<1, 1>(search_segment, y + h); + + nearest_boxes.clear(); + found_count = t.query(Predicate(search_segment), std::back_inserter(nearest_boxes) ); + + if ( found_count > 0 ) + { + std::cout << "search segment: "; + bgi::detail::utilities::print_indexable(std::cout, P(x-w, y-h)); + bgi::detail::utilities::print_indexable(std::cout, P(x+w, y+h)); + + std::cout << "\nfound: "; + for ( size_t i = 0 ; i < nearest_boxes.size() ; ++i ) + { + bgi::detail::utilities::print_indexable(std::cout, nearest_boxes[i]); + std::cout << '\n'; + } + } + else + std::cout << "boxes not found\n"; +} + +template +void query_linestring() +{ + float x = ( rand() % 1000 ) / 10.0f; + float y = ( rand() % 1000 ) / 10.0f; + float w = 10 + ( rand() % 1000 ) / 100.0f; + float h = 10 + ( rand() % 1000 ) / 100.0f; + + search_linestring.clear(); + float a = 0; + float d = 0; + for ( size_t i = 0 ; i < 300 ; ++i, a += 0.05, d += 0.005 ) + { + float xx = x + w * d * ::cos(a); + float yy = y + h * d * ::sin(a); + search_linestring.push_back(P(xx, yy)); + } + + nearest_boxes.clear(); + found_count = t.query(Predicate(search_linestring), std::back_inserter(nearest_boxes) ); + + if ( found_count > 0 ) + { + std::cout << "search linestring: "; + BOOST_FOREACH(P const& p, search_linestring) + { + bgi::detail::utilities::print_indexable(std::cout, p); + std::cout << ' '; + } + std::cout << "\nfound: "; + for ( size_t i = 0 ; i < nearest_boxes.size() ; ++i ) + { + bgi::detail::utilities::print_indexable(std::cout, nearest_boxes[i]); + std::cout << '\n'; + } + } + else + std::cout << "boxes not found\n"; +} + void search() { namespace d = bgi::detail; @@ -369,6 +448,10 @@ void search() query_poly< d::spatial_predicate >(); else if ( query_mode == qm_mpi ) query_multi_poly< d::spatial_predicate >(); + else if ( query_mode == qm_si ) + query_segment< d::spatial_predicate >(); + else if ( query_mode == qm_lsi ) + query_linestring< d::spatial_predicate >(); else if ( query_mode == qm_path ) query_path(); @@ -403,7 +486,7 @@ void draw_knn_area(float min_distance, float max_distance) glEnd(); } -void draw_path(LS const& ls) +void draw_linestring(LS const& ls) { glBegin(GL_LINE_STRIP); @@ -418,6 +501,20 @@ void draw_path(LS const& ls) glEnd(); } +void draw_segment(S const& s) +{ + float x1 = boost::geometry::get<0, 0>(s); + float y1 = boost::geometry::get<0, 1>(s); + float x2 = boost::geometry::get<1, 0>(s); + float y2 = boost::geometry::get<1, 1>(s); + float z = bgi::detail::rtree::utilities::view(t).depth(); + + glBegin(GL_LINES); + glVertex3f(x1, y1, z); + glVertex3f(x2, y2, z); + glEnd(); +} + template void draw_box(Box const& box) { @@ -487,8 +584,12 @@ void render_scene(void) draw_polygon(search_poly); else if ( query_mode == qm_mpi ) draw_multi_polygon(search_multi_poly); + else if ( query_mode == qm_si ) + draw_segment(search_segment); + else if ( query_mode == qm_lsi ) + draw_linestring(search_linestring); else if ( query_mode == qm_path ) - draw_path(search_path); + draw_linestring(search_path); else draw_box(search_box); @@ -686,6 +787,10 @@ void keyboard(unsigned char key, int /*x*/, int /*y*/) query_mode = qm_pi; else if ( current_line == "mpi" ) query_mode = qm_mpi; + else if ( current_line == "si" ) + query_mode = qm_si; + else if ( current_line == "lsi" ) + query_mode = qm_lsi; else if ( current_line == "path" ) query_mode = qm_path; diff --git a/index/example/random_test.cpp b/index/example/random_test.cpp index f4145152c..48a45191c 100644 --- a/index/example/random_test.cpp +++ b/index/example/random_test.cpp @@ -100,8 +100,8 @@ int main() float x = coords[i].first; float y = coords[i].second; result.clear(); - std::copy(t.qbegin(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), - t.qend(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), + std::copy(t.qbegin_(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), + t.qend_(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10)))), std::back_inserter(result)); // test @@ -152,8 +152,8 @@ int main() float y = coords[i].second + 100; result.clear(); - std::copy(t.qbegin(bgi::nearest(P(x, y), neighbours_count)), - t.qend(bgi::nearest(P(x, y), neighbours_count)), + std::copy(t.qbegin_(bgi::nearest(P(x, y), neighbours_count)), + t.qend_(bgi::nearest(P(x, y), neighbours_count)), std::back_inserter(result)); // test diff --git a/index/example/serialize.cpp b/index/example/serialize.cpp new file mode 100644 index 000000000..1ce9437b9 --- /dev/null +++ b/index/example/serialize.cpp @@ -0,0 +1,166 @@ +// Boost.Geometry Index +// Additional tests + +// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. + +// 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) + +#include +#include + +#define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +template ::value> +struct print_tuple +{ + template + static inline Os & apply(Os & os, T const& t) + { + os << boost::get(t) << ", "; + return print_tuple::apply(os, t); + } +}; + +template +struct print_tuple +{ + template + static inline Os & apply(Os & os, T const&) + { + return os; + } +}; + +int main() +{ + namespace bg = boost::geometry; + namespace bgi = bg::index; + + typedef boost::tuple S; + + typedef bg::model::point P; + typedef bg::model::box

B; + typedef B V; + //typedef bgi::rtree > RT; + //typedef bgi::rtree > RT; + //typedef bgi::rtree > RT; + typedef bgi::rtree RT; + + //RT tree; + RT tree(bgi::dynamic_linear(16)); + std::vector vect; + + boost::timer t; + + //insert values + { + for ( double x = 0 ; x < 1000 ; x += 1 ) + for ( double y = 0 ; y < 1000 ; y += 1 ) + vect.push_back(B(P(x, y), P(x+0.5, y+0.5))); + RT tmp(vect, tree.parameters()); + tree = boost::move(tmp); + } + B q(P(5, 5), P(6, 6)); + S s; + + std::cout << "vector and tree created in: " << t.elapsed() << std::endl; + + print_tuple::apply(std::cout, bgi::detail::rtree::utilities::statistics(tree)) << std::endl; + std::cout << boost::get<0>(s) << std::endl; + BOOST_FOREACH(V const& v, tree | bgi::adaptors::queried(bgi::intersects(q))) + std::cout << bg::wkt(v) << std::endl; + + // save + { + std::ofstream ofs("serialized_vector.bin", std::ios::binary | std::ios::trunc); + boost::archive::binary_oarchive oa(ofs); + t.restart(); + oa << vect; + std::cout << "vector saved to bin in: " << t.elapsed() << std::endl; + } + { + std::ofstream ofs("serialized_tree.bin", std::ios::binary | std::ios::trunc); + boost::archive::binary_oarchive oa(ofs); + t.restart(); + oa << tree; + std::cout << "tree saved to bin in: " << t.elapsed() << std::endl; + } + { + std::ofstream ofs("serialized_tree.xml", std::ios::trunc); + boost::archive::xml_oarchive oa(ofs); + t.restart(); + oa << boost::serialization::make_nvp("rtree", tree); + std::cout << "tree saved to xml in: " << t.elapsed() << std::endl; + } + + t.restart(); + vect.clear(); + std::cout << "vector cleared in: " << t.elapsed() << std::endl; + + t.restart(); + tree.clear(); + std::cout << "tree cleared in: " << t.elapsed() << std::endl; + + // load + + { + std::ifstream ifs("serialized_vector.bin", std::ios::binary); + boost::archive::binary_iarchive ia(ifs); + t.restart(); + ia >> vect; + std::cout << "vector loaded from bin in: " << t.elapsed() << std::endl; + t.restart(); + RT tmp(vect, tree.parameters()); + tree = boost::move(tmp); + std::cout << "tree rebuilt from vector in: " << t.elapsed() << std::endl; + } + + t.restart(); + tree.clear(); + std::cout << "tree cleared in: " << t.elapsed() << std::endl; + + { + std::ifstream ifs("serialized_tree.bin", std::ios::binary); + boost::archive::binary_iarchive ia(ifs); + t.restart(); + ia >> tree; + std::cout << "tree loaded from bin in: " << t.elapsed() << std::endl; + } + + std::cout << "loaded from bin" << std::endl; + print_tuple::apply(std::cout, bgi::detail::rtree::utilities::statistics(tree)) << std::endl; + BOOST_FOREACH(V const& v, tree | bgi::adaptors::queried(bgi::intersects(q))) + std::cout << bg::wkt(v) << std::endl; + + t.restart(); + tree.clear(); + std::cout << "tree cleared in: " << t.elapsed() << std::endl; + + { + std::ifstream ifs("serialized_tree.xml"); + boost::archive::xml_iarchive ia(ifs); + t.restart(); + ia >> boost::serialization::make_nvp("rtree", tree); + std::cout << "tree loaded from xml in: " << t.elapsed() << std::endl; + } + + std::cout << "loaded from xml" << std::endl; + print_tuple::apply(std::cout, bgi::detail::rtree::utilities::statistics(tree)) << std::endl; + BOOST_FOREACH(V const& v, tree | bgi::adaptors::queried(bgi::intersects(q))) + std::cout << bg::wkt(v) << std::endl; + + return 0; +} diff --git a/index/test/rtree/interprocess/Jamfile.v2 b/index/test/rtree/interprocess/Jamfile.v2 index be709a43b..d0643b45f 100644 --- a/index/test/rtree/interprocess/Jamfile.v2 +++ b/index/test/rtree/interprocess/Jamfile.v2 @@ -20,6 +20,7 @@ rule test_all acc-pa_risc:-lrt gcc-mingw:"-lole32 -loleaut32 -lpsapi -ladvapi32" hpux,gcc:"-Wl,+as,mpas" + windows,clang:"-lole32 -loleaut32 -lpsapi -ladvapi32" ] ; } diff --git a/index/test/rtree/interprocess/rtree_interprocess_linear.cpp b/index/test/rtree/interprocess/rtree_interprocess_linear.cpp index 1a6077f41..80221ac3f 100644 --- a/index/test/rtree/interprocess/rtree_interprocess_linear.cpp +++ b/index/test/rtree/interprocess/rtree_interprocess_linear.cpp @@ -13,8 +13,7 @@ int test_main(int, char* []) { typedef bg::model::point P2f; - testset::interprocess::modifiers(bgi::linear<32, 8>()); - testset::interprocess::additional(bgi::linear<32, 8>()); + testset::interprocess::modifiers_and_additional(bgi::linear<32, 8>()); return 0; } diff --git a/index/test/rtree/interprocess/rtree_interprocess_linear_dyn.cpp b/index/test/rtree/interprocess/rtree_interprocess_linear_dyn.cpp index 4823bbb57..17717ce31 100644 --- a/index/test/rtree/interprocess/rtree_interprocess_linear_dyn.cpp +++ b/index/test/rtree/interprocess/rtree_interprocess_linear_dyn.cpp @@ -13,8 +13,7 @@ int test_main(int, char* []) { typedef bg::model::point P2f; - testset::interprocess::modifiers(bgi::dynamic_linear(32, 8)); - testset::interprocess::additional(bgi::dynamic_linear(32, 8)); + testset::interprocess::modifiers_and_additional(bgi::dynamic_linear(32, 8)); return 0; } diff --git a/index/test/rtree/interprocess/rtree_interprocess_quadratic.cpp b/index/test/rtree/interprocess/rtree_interprocess_quadratic.cpp index 8a8bea0e8..b4630a172 100644 --- a/index/test/rtree/interprocess/rtree_interprocess_quadratic.cpp +++ b/index/test/rtree/interprocess/rtree_interprocess_quadratic.cpp @@ -13,8 +13,7 @@ int test_main(int, char* []) { typedef bg::model::point P2f; - testset::interprocess::modifiers(bgi::quadratic<32, 8>()); - testset::interprocess::additional(bgi::quadratic<32, 8>()); + testset::interprocess::modifiers_and_additional(bgi::quadratic<32, 8>()); return 0; } diff --git a/index/test/rtree/interprocess/rtree_interprocess_quadratic_dyn.cpp b/index/test/rtree/interprocess/rtree_interprocess_quadratic_dyn.cpp index b7710ef4b..cf935b377 100644 --- a/index/test/rtree/interprocess/rtree_interprocess_quadratic_dyn.cpp +++ b/index/test/rtree/interprocess/rtree_interprocess_quadratic_dyn.cpp @@ -13,8 +13,7 @@ int test_main(int, char* []) { typedef bg::model::point P2f; - testset::interprocess::modifiers(bgi::dynamic_quadratic(32, 8)); - testset::interprocess::additional(bgi::dynamic_quadratic(32, 8)); + testset::interprocess::modifiers_and_additional(bgi::dynamic_quadratic(32, 8)); return 0; } diff --git a/index/test/rtree/interprocess/rtree_interprocess_rstar.cpp b/index/test/rtree/interprocess/rtree_interprocess_rstar.cpp index 8402bb0fc..415a473da 100644 --- a/index/test/rtree/interprocess/rtree_interprocess_rstar.cpp +++ b/index/test/rtree/interprocess/rtree_interprocess_rstar.cpp @@ -13,8 +13,7 @@ int test_main(int, char* []) { typedef bg::model::point P2f; - testset::interprocess::modifiers(bgi::rstar<32, 8>()); - testset::interprocess::additional(bgi::rstar<32, 8>()); + testset::interprocess::modifiers_and_additional(bgi::rstar<32, 8>()); return 0; } diff --git a/index/test/rtree/interprocess/rtree_interprocess_rstar_dyn.cpp b/index/test/rtree/interprocess/rtree_interprocess_rstar_dyn.cpp index 52c81e958..06edc43a8 100644 --- a/index/test/rtree/interprocess/rtree_interprocess_rstar_dyn.cpp +++ b/index/test/rtree/interprocess/rtree_interprocess_rstar_dyn.cpp @@ -13,8 +13,7 @@ int test_main(int, char* []) { typedef bg::model::point P2f; - testset::interprocess::modifiers(bgi::dynamic_rstar(32, 8)); - testset::interprocess::additional(bgi::dynamic_rstar(32, 8)); + testset::interprocess::modifiers_and_additional(bgi::dynamic_rstar(32, 8)); return 0; } diff --git a/index/test/rtree/interprocess/test_interprocess.hpp b/index/test/rtree/interprocess/test_interprocess.hpp index 471f9fa15..7f061b00c 100644 --- a/index/test/rtree/interprocess/test_interprocess.hpp +++ b/index/test/rtree/interprocess/test_interprocess.hpp @@ -81,4 +81,21 @@ void additional(Parameters const& parameters = Parameters()) testset::additional(parameters, shmem_alloc(segment.get_segment_manager())); } -}} \ No newline at end of file +template +void modifiers_and_additional(Parameters const& parameters = Parameters()) +{ + namespace bi = boost::interprocess; + struct shm_remove + { + shm_remove() { bi::shared_memory_object::remove("shmem"); } + ~shm_remove(){ bi::shared_memory_object::remove("shmem"); } + } remover; + + bi::managed_shared_memory segment(bi::create_only, "shmem", 65535); + typedef bi::allocator shmem_alloc; + + testset::modifiers(parameters, shmem_alloc(segment.get_segment_manager())); + testset::additional(parameters, shmem_alloc(segment.get_segment_manager())); +} + +}} diff --git a/index/test/rtree/test_rtree.hpp b/index/test/rtree/test_rtree.hpp index de15f6913..0d259ae62 100644 --- a/index/test/rtree/test_rtree.hpp +++ b/index/test/rtree/test_rtree.hpp @@ -16,9 +16,6 @@ #include -// TEST -//#define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL -//#define BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS #include #include @@ -645,6 +642,14 @@ void exactly_the_same_outputs(Rtree const& rtree, Range1 const& output, Range2 c } } +// alternative version of std::copy taking iterators of differnet types +template +void copy_alt(First first, Last last, Out out) +{ + for ( ; first != last ; ++first, ++out ) + *out = *first; +} + // spatial query template @@ -668,23 +673,26 @@ void spatial_query(Rtree & rtree, Predicates const& pred, std::vector con exactly_the_same_outputs(rtree, output, rtree | bgi::adaptors::queried(pred)); -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL std::vector output3; - std::copy(rtree.qbegin(pred), rtree.qend(pred), std::back_inserter(output3)); + std::copy(rtree.qbegin(pred), rtree.qend(), std::back_inserter(output3)); compare_outputs(rtree, output3, expected_output); -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS + std::vector output4; + std::copy(qbegin(rtree, pred), qend(rtree), std::back_inserter(output4)); + + exactly_the_same_outputs(rtree, output3, output4); + +#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL { - typedef typename Rtree::const_query_iterator QI; - QI first = rtree.qbegin(pred); - QI last = rtree.qend(pred); std::vector output4; - std::copy(first, last, std::back_inserter(output4)); + std::copy(rtree.qbegin_(pred), rtree.qend_(pred), std::back_inserter(output4)); + compare_outputs(rtree, output4, expected_output); + output4.clear(); + copy_alt(rtree.qbegin_(pred), rtree.qend_(), std::back_inserter(output4)); compare_outputs(rtree, output4, expected_output); } #endif -#endif } // rtree specific queries tests @@ -734,8 +742,6 @@ void disjoint(Rtree const& tree, std::vector const& input, Box const& qbo spatial_query(tree, bgi::disjoint(qpoly), expected_output);*/ } -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - template struct contains_impl { @@ -778,8 +784,6 @@ void contains(Rtree const& tree, std::vector const& input, Box const& qbo >::apply(tree, input, qbox); } -#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - template void covered_by(Rtree const& tree, std::vector const& input, Box const& qbox) { @@ -800,8 +804,6 @@ void covered_by(Rtree const& tree, std::vector const& input, Box const& q spatial_query(tree, bgi::covered_by(qpoly), expected_output);*/ } -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - template struct covers_impl { @@ -844,8 +846,6 @@ void covers(Rtree const& tree, std::vector const& input, Box const& qbox) >::apply(tree, input, qbox); } -#endif // BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL - template struct overlaps_impl { @@ -1039,23 +1039,21 @@ void nearest_query_k(Rtree const& rtree, std::vector const& input, Point exactly_the_same_outputs(rtree, output, output2); -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL std::vector output3; - std::copy(rtree.qbegin(bgi::nearest(pt, k)), rtree.qend(bgi::nearest(pt, k)), std::back_inserter(output3)); + std::copy(rtree.qbegin(bgi::nearest(pt, k)), rtree.qend(), std::back_inserter(output3)); compare_nearest_outputs(rtree, output3, expected_output, pt, greatest_distance); -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_ENABLE_TYPE_ERASED_ITERATORS +#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL { - typedef typename Rtree::const_query_iterator QI; - QI first = rtree.qbegin(bgi::nearest(pt, k)); - QI last = rtree.qend(bgi::nearest(pt, k)); std::vector output4; - std::copy(first, last, std::back_inserter(output4)); + std::copy(rtree.qbegin_(bgi::nearest(pt, k)), rtree.qend_(bgi::nearest(pt, k)), std::back_inserter(output4)); + compare_nearest_outputs(rtree, output4, expected_output, pt, greatest_distance); + output4.clear(); + copy_alt(rtree.qbegin_(bgi::nearest(pt, k)), rtree.qend_(), std::back_inserter(output4)); compare_nearest_outputs(rtree, output4, expected_output, pt, greatest_distance); } #endif -#endif } // rtree nearest not found @@ -1420,10 +1418,8 @@ void queries(Rtree const& tree, std::vector const& input, Box const& qbox basictest::overlaps(tree, input, qbox); //basictest::touches(tree, input, qbox); basictest::within(tree, input, qbox); -#ifdef BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL basictest::contains(tree, input, qbox); basictest::covers(tree, input, qbox); -#endif typedef typename bg::point_type::type P; P pt; diff --git a/test/algorithms/Jamfile.v2 b/test/algorithms/Jamfile.v2 index 13811d303..438c41c2c 100644 --- a/test/algorithms/Jamfile.v2 +++ b/test/algorithms/Jamfile.v2 @@ -10,24 +10,24 @@ test-suite boost-geometry-algorithms : - [ run append.cpp ] + [ run append.cpp : : : msvc:/bigobj ] [ run area.cpp ] [ run assign.cpp ] [ run buffer.cpp ] - [ run centroid.cpp ] + [ run centroid.cpp : : : msvc:/bigobj ] [ run comparable_distance.cpp ] [ run convex_hull.cpp ] [ run correct.cpp ] - [ run convert.cpp ] + [ run convert.cpp : : : msvc:/bigobj ] [ run covered_by.cpp ] - [ run difference.cpp ] + [ run difference.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE msvc:/bigobj ] [ run disjoint.cpp ] - [ run distance.cpp ] + [ run distance.cpp : : : msvc:/bigobj ] [ run envelope.cpp ] [ run equals.cpp ] [ run expand.cpp ] [ run for_each.cpp ] - [ run intersection.cpp ] + [ run intersection.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE msvc:/bigobj ] [ run intersects.cpp ] [ run length.cpp ] [ run make.cpp ] @@ -37,7 +37,7 @@ test-suite boost-geometry-algorithms [ run simplify.cpp ] [ run touches.cpp ] [ run transform.cpp ] - [ run union.cpp ] + [ run union.cpp : : : BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE ] [ run unique.cpp ] [ run within.cpp ] ; diff --git a/test/algorithms/algorithms_tests.sln b/test/algorithms/algorithms_tests.sln deleted file mode 100644 index 96ba06492..000000000 --- a/test/algorithms/algorithms_tests.sln +++ /dev/null @@ -1,193 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "append", "append.vcproj", "{774F6471-D8A0-481C-9B0A-4903EED25C70}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "area", "area.vcproj", "{E86E6687-AC05-4DBE-A8BD-C47BCB6AEE90}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assign", "assign.vcproj", "{94BC6547-67C1-44DB-903D-526537A91E23}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "expand", "expand.vcproj", "{5330DAB1-DF27-44FC-971B-3C5094F82FA3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convex_hull", "convex_hull.vcproj", "{0AFF7A85-63A7-4178-92A5-CC692B09F5B9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "distance", "distance.vcproj", "{347D08A4-22E9-45B1-A55B-AE84AA2EAA53}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "envelope", "envelope.vcproj", "{26EFCAF4-7907-4A47-ACBF-6CAB738CDCEB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make", "make.vcproj", "{BCD17F3E-8DF2-4B00-A75E-BF7372D2873B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simplify", "simplify.vcproj", "{B1760CB8-553B-42AB-B54E-3D0320FF252F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transform", "transform.vcproj", "{41413E56-08DA-4592-94D2-5311FE90C62B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "buffer", "buffer.vcproj", "{C66E1F6F-84F6-44E2-B5E8-2B127065BE31}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "for_each", "for_each.vcproj", "{774F6471-D8A0-481C-9B0A-4903EAD25B70}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "disjoint", "disjoint.vcproj", "{96D51D96-B35F-47C8-864D-371DF2280686}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "centroid", "centroid.vcproj", "{1E90E5BC-1280-4A6A-B197-132ABBF97EB9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intersection", "intersection.vcproj", "{2FD8EDAB-B3C3-4654-B6C3-B25C12A063D3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "correct", "correct.vcproj", "{71582BDA-D4DF-400D-8630-378BE102C038}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "within", "within.vcproj", "{C7BCD670-543D-4B29-B2D6-F3169949F79D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "length", "length.vcproj", "{C4D75B1E-34D5-4A98-8535-A9535BE949E4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "perimeter", "perimeter.vcproj", "{EFC23FC0-86D3-4C81-A218-26F0D5A4D50B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "union", "union.vcproj", "{CA5EE1D6-CB4B-4A15-85C5-31D5C00289C4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "overlaps", "overlaps.vcproj", "{30C37854-9ED6-4C1E-97FB-BF8637BD5811}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intersects", "intersects.vcproj", "{B1A97F62-85CD-4239-BB56-619988B08260}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "equals", "equals.vcproj", "{E54F493F-BF9D-4A6D-AE2F-5F97AC95251A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "difference", "difference.vcproj", "{4EBFC27A-75C9-43A1-8DDA-AFEB45C564DC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unique", "unique.vcproj", "{104D31F9-49BA-4A1A-B84F-0A3AEE3C4DB2}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reverse", "reverse.vcproj", "{14B5DFC5-D511-4D8C-A231-EE90A05687E1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "comparable_distance", "comparable_distance.vcproj", "{F11970B5-BE16-4FF5-9780-4C15082B76A0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "convert", "convert.vcproj", "{FABF1AA7-F695-49F8-92F6-AB6C4B0C088A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "covered_by", "covered_by.vcproj", "{5ABF0B56-F9F1-4D93-B15A-E3972F45D97B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "touches", "touches.vcproj", "{8359726E-9F03-4300-8F63-1FEAC84251D0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {774F6471-D8A0-481C-9B0A-4903EED25C70}.Debug|Win32.ActiveCfg = Debug|Win32 - {774F6471-D8A0-481C-9B0A-4903EED25C70}.Debug|Win32.Build.0 = Debug|Win32 - {774F6471-D8A0-481C-9B0A-4903EED25C70}.Release|Win32.ActiveCfg = Release|Win32 - {774F6471-D8A0-481C-9B0A-4903EED25C70}.Release|Win32.Build.0 = Release|Win32 - {E86E6687-AC05-4DBE-A8BD-C47BCB6AEE90}.Debug|Win32.ActiveCfg = Debug|Win32 - {E86E6687-AC05-4DBE-A8BD-C47BCB6AEE90}.Debug|Win32.Build.0 = Debug|Win32 - {E86E6687-AC05-4DBE-A8BD-C47BCB6AEE90}.Release|Win32.ActiveCfg = Release|Win32 - {E86E6687-AC05-4DBE-A8BD-C47BCB6AEE90}.Release|Win32.Build.0 = Release|Win32 - {94BC6547-67C1-44DB-903D-526537A91E23}.Debug|Win32.ActiveCfg = Debug|Win32 - {94BC6547-67C1-44DB-903D-526537A91E23}.Debug|Win32.Build.0 = Debug|Win32 - {94BC6547-67C1-44DB-903D-526537A91E23}.Release|Win32.ActiveCfg = Release|Win32 - {94BC6547-67C1-44DB-903D-526537A91E23}.Release|Win32.Build.0 = Release|Win32 - {5330DAB1-DF27-44FC-971B-3C5094F82FA3}.Debug|Win32.ActiveCfg = Debug|Win32 - {5330DAB1-DF27-44FC-971B-3C5094F82FA3}.Debug|Win32.Build.0 = Debug|Win32 - {5330DAB1-DF27-44FC-971B-3C5094F82FA3}.Release|Win32.ActiveCfg = Release|Win32 - {5330DAB1-DF27-44FC-971B-3C5094F82FA3}.Release|Win32.Build.0 = Release|Win32 - {0AFF7A85-63A7-4178-92A5-CC692B09F5B9}.Debug|Win32.ActiveCfg = Debug|Win32 - {0AFF7A85-63A7-4178-92A5-CC692B09F5B9}.Debug|Win32.Build.0 = Debug|Win32 - {0AFF7A85-63A7-4178-92A5-CC692B09F5B9}.Release|Win32.ActiveCfg = Release|Win32 - {0AFF7A85-63A7-4178-92A5-CC692B09F5B9}.Release|Win32.Build.0 = Release|Win32 - {347D08A4-22E9-45B1-A55B-AE84AA2EAA53}.Debug|Win32.ActiveCfg = Debug|Win32 - {347D08A4-22E9-45B1-A55B-AE84AA2EAA53}.Debug|Win32.Build.0 = Debug|Win32 - {347D08A4-22E9-45B1-A55B-AE84AA2EAA53}.Release|Win32.ActiveCfg = Release|Win32 - {347D08A4-22E9-45B1-A55B-AE84AA2EAA53}.Release|Win32.Build.0 = Release|Win32 - {26EFCAF4-7907-4A47-ACBF-6CAB738CDCEB}.Debug|Win32.ActiveCfg = Debug|Win32 - {26EFCAF4-7907-4A47-ACBF-6CAB738CDCEB}.Debug|Win32.Build.0 = Debug|Win32 - {26EFCAF4-7907-4A47-ACBF-6CAB738CDCEB}.Release|Win32.ActiveCfg = Release|Win32 - {26EFCAF4-7907-4A47-ACBF-6CAB738CDCEB}.Release|Win32.Build.0 = Release|Win32 - {BCD17F3E-8DF2-4B00-A75E-BF7372D2873B}.Debug|Win32.ActiveCfg = Debug|Win32 - {BCD17F3E-8DF2-4B00-A75E-BF7372D2873B}.Debug|Win32.Build.0 = Debug|Win32 - {BCD17F3E-8DF2-4B00-A75E-BF7372D2873B}.Release|Win32.ActiveCfg = Release|Win32 - {BCD17F3E-8DF2-4B00-A75E-BF7372D2873B}.Release|Win32.Build.0 = Release|Win32 - {B1760CB8-553B-42AB-B54E-3D0320FF252F}.Debug|Win32.ActiveCfg = Debug|Win32 - {B1760CB8-553B-42AB-B54E-3D0320FF252F}.Debug|Win32.Build.0 = Debug|Win32 - {B1760CB8-553B-42AB-B54E-3D0320FF252F}.Release|Win32.ActiveCfg = Release|Win32 - {B1760CB8-553B-42AB-B54E-3D0320FF252F}.Release|Win32.Build.0 = Release|Win32 - {41413E56-08DA-4592-94D2-5311FE90C62B}.Debug|Win32.ActiveCfg = Debug|Win32 - {41413E56-08DA-4592-94D2-5311FE90C62B}.Debug|Win32.Build.0 = Debug|Win32 - {41413E56-08DA-4592-94D2-5311FE90C62B}.Release|Win32.ActiveCfg = Release|Win32 - {41413E56-08DA-4592-94D2-5311FE90C62B}.Release|Win32.Build.0 = Release|Win32 - {C66E1F6F-84F6-44E2-B5E8-2B127065BE31}.Debug|Win32.ActiveCfg = Debug|Win32 - {C66E1F6F-84F6-44E2-B5E8-2B127065BE31}.Debug|Win32.Build.0 = Debug|Win32 - {C66E1F6F-84F6-44E2-B5E8-2B127065BE31}.Release|Win32.ActiveCfg = Release|Win32 - {C66E1F6F-84F6-44E2-B5E8-2B127065BE31}.Release|Win32.Build.0 = Release|Win32 - {774F6471-D8A0-481C-9B0A-4903EAD25B70}.Debug|Win32.ActiveCfg = Debug|Win32 - {774F6471-D8A0-481C-9B0A-4903EAD25B70}.Debug|Win32.Build.0 = Debug|Win32 - {774F6471-D8A0-481C-9B0A-4903EAD25B70}.Release|Win32.ActiveCfg = Release|Win32 - {774F6471-D8A0-481C-9B0A-4903EAD25B70}.Release|Win32.Build.0 = Release|Win32 - {96D51D96-B35F-47C8-864D-371DF2280686}.Debug|Win32.ActiveCfg = Debug|Win32 - {96D51D96-B35F-47C8-864D-371DF2280686}.Debug|Win32.Build.0 = Debug|Win32 - {96D51D96-B35F-47C8-864D-371DF2280686}.Release|Win32.ActiveCfg = Release|Win32 - {96D51D96-B35F-47C8-864D-371DF2280686}.Release|Win32.Build.0 = Release|Win32 - {1E90E5BC-1280-4A6A-B197-132ABBF97EB9}.Debug|Win32.ActiveCfg = Debug|Win32 - {1E90E5BC-1280-4A6A-B197-132ABBF97EB9}.Debug|Win32.Build.0 = Debug|Win32 - {1E90E5BC-1280-4A6A-B197-132ABBF97EB9}.Release|Win32.ActiveCfg = Release|Win32 - {1E90E5BC-1280-4A6A-B197-132ABBF97EB9}.Release|Win32.Build.0 = Release|Win32 - {2FD8EDAB-B3C3-4654-B6C3-B25C12A063D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {2FD8EDAB-B3C3-4654-B6C3-B25C12A063D3}.Debug|Win32.Build.0 = Debug|Win32 - {2FD8EDAB-B3C3-4654-B6C3-B25C12A063D3}.Release|Win32.ActiveCfg = Release|Win32 - {2FD8EDAB-B3C3-4654-B6C3-B25C12A063D3}.Release|Win32.Build.0 = Release|Win32 - {71582BDA-D4DF-400D-8630-378BE102C038}.Debug|Win32.ActiveCfg = Debug|Win32 - {71582BDA-D4DF-400D-8630-378BE102C038}.Debug|Win32.Build.0 = Debug|Win32 - {71582BDA-D4DF-400D-8630-378BE102C038}.Release|Win32.ActiveCfg = Release|Win32 - {71582BDA-D4DF-400D-8630-378BE102C038}.Release|Win32.Build.0 = Release|Win32 - {C7BCD670-543D-4B29-B2D6-F3169949F79D}.Debug|Win32.ActiveCfg = Debug|Win32 - {C7BCD670-543D-4B29-B2D6-F3169949F79D}.Debug|Win32.Build.0 = Debug|Win32 - {C7BCD670-543D-4B29-B2D6-F3169949F79D}.Release|Win32.ActiveCfg = Release|Win32 - {C7BCD670-543D-4B29-B2D6-F3169949F79D}.Release|Win32.Build.0 = Release|Win32 - {C4D75B1E-34D5-4A98-8535-A9535BE949E4}.Debug|Win32.ActiveCfg = Debug|Win32 - {C4D75B1E-34D5-4A98-8535-A9535BE949E4}.Debug|Win32.Build.0 = Debug|Win32 - {C4D75B1E-34D5-4A98-8535-A9535BE949E4}.Release|Win32.ActiveCfg = Release|Win32 - {C4D75B1E-34D5-4A98-8535-A9535BE949E4}.Release|Win32.Build.0 = Release|Win32 - {EFC23FC0-86D3-4C81-A218-26F0D5A4D50B}.Debug|Win32.ActiveCfg = Debug|Win32 - {EFC23FC0-86D3-4C81-A218-26F0D5A4D50B}.Debug|Win32.Build.0 = Debug|Win32 - {EFC23FC0-86D3-4C81-A218-26F0D5A4D50B}.Release|Win32.ActiveCfg = Release|Win32 - {EFC23FC0-86D3-4C81-A218-26F0D5A4D50B}.Release|Win32.Build.0 = Release|Win32 - {CA5EE1D6-CB4B-4A15-85C5-31D5C00289C4}.Debug|Win32.ActiveCfg = Debug|Win32 - {CA5EE1D6-CB4B-4A15-85C5-31D5C00289C4}.Debug|Win32.Build.0 = Debug|Win32 - {CA5EE1D6-CB4B-4A15-85C5-31D5C00289C4}.Release|Win32.ActiveCfg = Release|Win32 - {CA5EE1D6-CB4B-4A15-85C5-31D5C00289C4}.Release|Win32.Build.0 = Release|Win32 - {30C37854-9ED6-4C1E-97FB-BF8637BD5811}.Debug|Win32.ActiveCfg = Debug|Win32 - {30C37854-9ED6-4C1E-97FB-BF8637BD5811}.Debug|Win32.Build.0 = Debug|Win32 - {30C37854-9ED6-4C1E-97FB-BF8637BD5811}.Release|Win32.ActiveCfg = Release|Win32 - {30C37854-9ED6-4C1E-97FB-BF8637BD5811}.Release|Win32.Build.0 = Release|Win32 - {B1A97F62-85CD-4239-BB56-619988B08260}.Debug|Win32.ActiveCfg = Debug|Win32 - {B1A97F62-85CD-4239-BB56-619988B08260}.Debug|Win32.Build.0 = Debug|Win32 - {B1A97F62-85CD-4239-BB56-619988B08260}.Release|Win32.ActiveCfg = Release|Win32 - {B1A97F62-85CD-4239-BB56-619988B08260}.Release|Win32.Build.0 = Release|Win32 - {E54F493F-BF9D-4A6D-AE2F-5F97AC95251A}.Debug|Win32.ActiveCfg = Debug|Win32 - {E54F493F-BF9D-4A6D-AE2F-5F97AC95251A}.Debug|Win32.Build.0 = Debug|Win32 - {E54F493F-BF9D-4A6D-AE2F-5F97AC95251A}.Release|Win32.ActiveCfg = Release|Win32 - {E54F493F-BF9D-4A6D-AE2F-5F97AC95251A}.Release|Win32.Build.0 = Release|Win32 - {4EBFC27A-75C9-43A1-8DDA-AFEB45C564DC}.Debug|Win32.ActiveCfg = Debug|Win32 - {4EBFC27A-75C9-43A1-8DDA-AFEB45C564DC}.Debug|Win32.Build.0 = Debug|Win32 - {4EBFC27A-75C9-43A1-8DDA-AFEB45C564DC}.Release|Win32.ActiveCfg = Release|Win32 - {4EBFC27A-75C9-43A1-8DDA-AFEB45C564DC}.Release|Win32.Build.0 = Release|Win32 - {104D31F9-49BA-4A1A-B84F-0A3AEE3C4DB2}.Debug|Win32.ActiveCfg = Debug|Win32 - {104D31F9-49BA-4A1A-B84F-0A3AEE3C4DB2}.Debug|Win32.Build.0 = Debug|Win32 - {104D31F9-49BA-4A1A-B84F-0A3AEE3C4DB2}.Release|Win32.ActiveCfg = Release|Win32 - {104D31F9-49BA-4A1A-B84F-0A3AEE3C4DB2}.Release|Win32.Build.0 = Release|Win32 - {14B5DFC5-D511-4D8C-A231-EE90A05687E1}.Debug|Win32.ActiveCfg = Debug|Win32 - {14B5DFC5-D511-4D8C-A231-EE90A05687E1}.Debug|Win32.Build.0 = Debug|Win32 - {14B5DFC5-D511-4D8C-A231-EE90A05687E1}.Release|Win32.ActiveCfg = Release|Win32 - {14B5DFC5-D511-4D8C-A231-EE90A05687E1}.Release|Win32.Build.0 = Release|Win32 - {F11970B5-BE16-4FF5-9780-4C15082B76A0}.Debug|Win32.ActiveCfg = Debug|Win32 - {F11970B5-BE16-4FF5-9780-4C15082B76A0}.Debug|Win32.Build.0 = Debug|Win32 - {F11970B5-BE16-4FF5-9780-4C15082B76A0}.Release|Win32.ActiveCfg = Release|Win32 - {F11970B5-BE16-4FF5-9780-4C15082B76A0}.Release|Win32.Build.0 = Release|Win32 - {FABF1AA7-F695-49F8-92F6-AB6C4B0C088A}.Debug|Win32.ActiveCfg = Debug|Win32 - {FABF1AA7-F695-49F8-92F6-AB6C4B0C088A}.Debug|Win32.Build.0 = Debug|Win32 - {FABF1AA7-F695-49F8-92F6-AB6C4B0C088A}.Release|Win32.ActiveCfg = Release|Win32 - {FABF1AA7-F695-49F8-92F6-AB6C4B0C088A}.Release|Win32.Build.0 = Release|Win32 - {5ABF0B56-F9F1-4D93-B15A-E3972F45D97B}.Debug|Win32.ActiveCfg = Debug|Win32 - {5ABF0B56-F9F1-4D93-B15A-E3972F45D97B}.Debug|Win32.Build.0 = Debug|Win32 - {5ABF0B56-F9F1-4D93-B15A-E3972F45D97B}.Release|Win32.ActiveCfg = Release|Win32 - {5ABF0B56-F9F1-4D93-B15A-E3972F45D97B}.Release|Win32.Build.0 = Release|Win32 - {8359726E-9F03-4300-8F63-1FEAC84251D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {8359726E-9F03-4300-8F63-1FEAC84251D0}.Debug|Win32.Build.0 = Debug|Win32 - {8359726E-9F03-4300-8F63-1FEAC84251D0}.Release|Win32.ActiveCfg = Release|Win32 - {8359726E-9F03-4300-8F63-1FEAC84251D0}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/algorithms/append.vcproj b/test/algorithms/append.vcproj deleted file mode 100644 index b162dd1b0..000000000 --- a/test/algorithms/append.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/area.vcproj b/test/algorithms/area.vcproj deleted file mode 100644 index e091e28fa..000000000 --- a/test/algorithms/area.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/assign.vcproj b/test/algorithms/assign.vcproj deleted file mode 100644 index 50214b53b..000000000 --- a/test/algorithms/assign.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/buffer.vcproj b/test/algorithms/buffer.vcproj deleted file mode 100644 index 60514c768..000000000 --- a/test/algorithms/buffer.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/centroid.cpp b/test/algorithms/centroid.cpp index 90eca01ab..607eb86c4 100644 --- a/test/algorithms/centroid.cpp +++ b/test/algorithms/centroid.cpp @@ -51,6 +51,8 @@ void test_2d() test_centroid >("LINESTRING(0 0,0 4, 4 4)", 1.0, 3.0); test_centroid >("LINESTRING(0 0,3 3,0 6,3 9,0 12)", 1.5, 6.0); + test_centroid >("LINESTRING(1 1, 3 3)", 2.0, 2.0); + test_centroid >( "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2" ",3.7 1.6,3.4 2,4.1 3,5.3 2.6,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3))", @@ -82,6 +84,7 @@ void test_3d() test_centroid >("LINESTRING(1 2 3,4 5 -6,7 -8 9,-10 11 12,13 -14 -15, 16 17 18)", 5.6748865168734692, 0.31974938587214002, 1.9915270387763671); test_centroid >("POLYGON((1 2 3,5 6 7))", 3, 4, 5); + test_centroid >("LINESTRING(1 1 1,3 3 3)", 2, 2, 2); test_centroid

("POINT(1 2 3)", 1, 2, 3); } diff --git a/test/algorithms/centroid.vcproj b/test/algorithms/centroid.vcproj deleted file mode 100644 index 5c908c654..000000000 --- a/test/algorithms/centroid.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/comparable_distance.vcproj b/test/algorithms/comparable_distance.vcproj deleted file mode 100644 index cf9b8ea41..000000000 --- a/test/algorithms/comparable_distance.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/convert.vcproj b/test/algorithms/convert.vcproj deleted file mode 100644 index c75bf0ee5..000000000 --- a/test/algorithms/convert.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/convex_hull.vcproj b/test/algorithms/convex_hull.vcproj deleted file mode 100644 index 365f60c0f..000000000 --- a/test/algorithms/convex_hull.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/correct.vcproj b/test/algorithms/correct.vcproj deleted file mode 100644 index e36945a2d..000000000 --- a/test/algorithms/correct.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/covered_by.vcproj b/test/algorithms/covered_by.vcproj deleted file mode 100644 index 13f41e930..000000000 --- a/test/algorithms/covered_by.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/detail/detail.sln b/test/algorithms/detail/detail.sln deleted file mode 100644 index 394921ecc..000000000 --- a/test/algorithms/detail/detail.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "partition", "partition.vcproj", "{5EF21715-DB87-41AB-9D0A-59ED04F316A1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5EF21715-DB87-41AB-9D0A-59ED04F316A1}.Debug|Win32.ActiveCfg = Debug|Win32 - {5EF21715-DB87-41AB-9D0A-59ED04F316A1}.Debug|Win32.Build.0 = Debug|Win32 - {5EF21715-DB87-41AB-9D0A-59ED04F316A1}.Release|Win32.ActiveCfg = Release|Win32 - {5EF21715-DB87-41AB-9D0A-59ED04F316A1}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/algorithms/detail/partition.vcproj b/test/algorithms/detail/partition.vcproj deleted file mode 100644 index 66e26a973..000000000 --- a/test/algorithms/detail/partition.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/detail/sections/range_by_section.vcproj b/test/algorithms/detail/sections/range_by_section.vcproj deleted file mode 100644 index 0d7ffb6cf..000000000 --- a/test/algorithms/detail/sections/range_by_section.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/detail/sections/sectionalize.sln b/test/algorithms/detail/sections/sectionalize.sln deleted file mode 100644 index 5b2ae402b..000000000 --- a/test/algorithms/detail/sections/sectionalize.sln +++ /dev/null @@ -1,25 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sectionalize", "sectionalize.vcproj", "{50410F81-7B83-49D9-BDAE-FA3F0ADB2ADC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "range_by_section", "range_by_section.vcproj", "{A91434CB-CB32-48AE-8C74-81B6A1EB342F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {50410F81-7B83-49D9-BDAE-FA3F0ADB2ADC}.Debug|Win32.ActiveCfg = Debug|Win32 - {50410F81-7B83-49D9-BDAE-FA3F0ADB2ADC}.Debug|Win32.Build.0 = Debug|Win32 - {50410F81-7B83-49D9-BDAE-FA3F0ADB2ADC}.Release|Win32.ActiveCfg = Release|Win32 - {50410F81-7B83-49D9-BDAE-FA3F0ADB2ADC}.Release|Win32.Build.0 = Release|Win32 - {A91434CB-CB32-48AE-8C74-81B6A1EB342F}.Debug|Win32.ActiveCfg = Debug|Win32 - {A91434CB-CB32-48AE-8C74-81B6A1EB342F}.Debug|Win32.Build.0 = Debug|Win32 - {A91434CB-CB32-48AE-8C74-81B6A1EB342F}.Release|Win32.ActiveCfg = Release|Win32 - {A91434CB-CB32-48AE-8C74-81B6A1EB342F}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/algorithms/detail/sections/sectionalize.vcproj b/test/algorithms/detail/sections/sectionalize.vcproj deleted file mode 100644 index 7c7ee5ac8..000000000 --- a/test/algorithms/detail/sections/sectionalize.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/difference.cpp b/test/algorithms/difference.cpp index acc9284d5..a9ac9b1e0 100644 --- a/test/algorithms/difference.cpp +++ b/test/algorithms/difference.cpp @@ -7,20 +7,6 @@ // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) -// #define TEST_ISOVIST - -//#define HAVE_TTMATH - -//#define BOOST_GEOMETRY_CHECK_WITH_POSTGIS - -//#define BOOST_GEOMETRY_DEBUG_SEGMENT_IDENTIFIER -//#define BOOST_GEOMETRY_DEBUG_INTERSECTION -//#define BOOST_GEOMETRY_DEBUG_TRAVERSE -//#define BOOST_GEOMETRY_DEBUG_FOLLOW -//#define BOOST_GEOMETRY_DEBUG_ASSEMBLE -//#define BOOST_GEOMETRY_DEBUG_IDENTIFIER - - #include #include #include @@ -35,9 +21,6 @@ #include -//#include -//#include - #include #include #include @@ -258,8 +241,8 @@ void test_all() { test_one("buffer_mp2", buffer_mp2[0], buffer_mp2[1], - 1, 92, 12.09857, - 1, 157, 24.19787); + 1, 91, 12.09857, + 1, 156, 24.19787); } /*** TODO: self-tangencies for difference @@ -295,7 +278,7 @@ void test_all() test_one("ggl_list_20110307_javier", ggl_list_20110307_javier[0], ggl_list_20110307_javier[1], - 1, 13, 16815.6, + 1, if_typed(14, 13), 16815.6, 1, 4, 3200.4, 0.01); @@ -326,13 +309,20 @@ void test_all() // Boost.Geometry gives results depending on FP-type, and compiler, and operating system. // For double, it is zero (skipped). On gcc/Linux, for float either. // Because we cannot predict this, we only test for MSVC - test_one("ggl_list_20110627_phillip", - ggl_list_20110627_phillip[0], ggl_list_20110627_phillip[1], - if_typed_tt(1, 0), -1, - if_typed_tt(0.0000000000001105367, 0.0), - 1, -1, 3577.40960816756, - 0.01 - ); + if (boost::is_same::value +#if defined(HAVE_TTMATH) + || boost::is_same::value +#endif + ) + { + test_one("ggl_list_20110627_phillip", + ggl_list_20110627_phillip[0], ggl_list_20110627_phillip[1], + if_typed_tt(1, 0), -1, + if_typed_tt(0.0000000000001105367, 0.0), + 1, -1, 3577.40960816756, + 0.01 + ); + } #endif // Other combi's diff --git a/test/algorithms/difference.vcproj b/test/algorithms/difference.vcproj deleted file mode 100644 index 2302ee27f..000000000 --- a/test/algorithms/difference.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/disjoint.vcproj b/test/algorithms/disjoint.vcproj deleted file mode 100644 index d27526cc7..000000000 --- a/test/algorithms/disjoint.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/distance.cpp b/test/algorithms/distance.cpp index e7d072976..ab7fc5bf6 100644 --- a/test/algorithms/distance.cpp +++ b/test/algorithms/distance.cpp @@ -71,12 +71,12 @@ void test_distance_point() { // Test custom strategy - BOOST_CONCEPT_ASSERT( (bg::concept::PointDistanceStrategy >) ); + BOOST_CONCEPT_ASSERT( (bg::concept::PointDistanceStrategy) ); - typedef typename services::return_type >::type cab_return_type; + typedef typename services::return_type::type cab_return_type; BOOST_MPL_ASSERT((boost::is_same::type>)); - taxicab_distance

tcd; + taxicab_distance tcd; cab_return_type d = bg::distance(p1, p2, tcd); BOOST_CHECK( bg::math::abs(d - cab_return_type(2)) <= cab_return_type(0.01) ); @@ -90,7 +90,7 @@ void test_distance_point() strategy_type strategy; comparable_strategy_type comparable_strategy = services::get_comparable::apply(strategy); - return_type comparable = services::result_from_distance::apply(comparable_strategy, 3); + return_type comparable = services::result_from_distance::apply(comparable_strategy, 3); BOOST_CHECK_CLOSE(comparable, return_type(9), 0.001); } @@ -145,7 +145,7 @@ void test_distance_segment() BOOST_CHECK_CLOSE(d1, return_type(1), 0.001); // 3) custom point strategy - taxicab_distance

tcd; + taxicab_distance tcd; d1 = bg::distance(p1, seg, tcd); BOOST_CHECK_CLOSE(d1, return_type(1), 0.001); } diff --git a/test/algorithms/distance.vcproj b/test/algorithms/distance.vcproj deleted file mode 100644 index 831fafbaa..000000000 --- a/test/algorithms/distance.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/envelope.vcproj b/test/algorithms/envelope.vcproj deleted file mode 100644 index aa26c762b..000000000 --- a/test/algorithms/envelope.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/equals.vcproj b/test/algorithms/equals.vcproj deleted file mode 100644 index 64697ef87..000000000 --- a/test/algorithms/equals.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/expand.vcproj b/test/algorithms/expand.vcproj deleted file mode 100644 index 7fb588e5d..000000000 --- a/test/algorithms/expand.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/for_each.vcproj b/test/algorithms/for_each.vcproj deleted file mode 100644 index 453064a3b..000000000 --- a/test/algorithms/for_each.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/intersection.cpp b/test/algorithms/intersection.cpp index ba303e24f..e176e2356 100644 --- a/test/algorithms/intersection.cpp +++ b/test/algorithms/intersection.cpp @@ -15,17 +15,8 @@ #include #include -#define BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE #define TEST_ISOVIST -//#define BOOST_GEOMETRY_DEBUG_SEGMENT_IDENTIFIER -//#define BOOST_GEOMETRY_DEBUG_INTERSECTION -//#define BOOST_GEOMETRY_DEBUG_TRAVERSE -//#define BOOST_GEOMETRY_DEBUG_FOLLOW -//#define BOOST_GEOMETRY_DEBUG_ASSEMBLE -//#define BOOST_GEOMETRY_DEBUG_IDENTIFIER - - #include #include @@ -166,6 +157,9 @@ void test_areal() 3, 0, 1.5); typedef typename bg::coordinate_type::type ct; + bool const ccw = bg::point_order::value == bg::counterclockwise; + bool const open = bg::closure::value == bg::open; + #ifdef TEST_ISOVIST #ifdef _MSC_VER @@ -182,11 +176,18 @@ void test_areal() //std::cout << typeid(ct).name() << std::endl; - test_one("ggl_list_20110306_javier", - ggl_list_20110306_javier[0], ggl_list_20110306_javier[1], - 1, if_typed_tt(5, 4), - 0.6649875, - if_typed(1.0, 0.01)); + if (! ccw && open) + { + // Pointcount for ttmath/double (both 5) or float (4) + // double returns 5 (since method append_no_dups_or_spikes) + // but not for ccw/open. Those cases has to be adapted once, anyway, + // because for open always one point too much is generated... + test_one("ggl_list_20110306_javier", + ggl_list_20110306_javier[0], ggl_list_20110306_javier[1], + 1, if_typed(4, 5), + 0.6649875, + if_typed(1.0, 0.01)); + } test_one("ggl_list_20110307_javier", ggl_list_20110307_javier[0], ggl_list_20110307_javier[1], @@ -202,7 +203,7 @@ void test_areal() test_one("ggl_list_20110716_enrico", ggl_list_20110716_enrico[0], ggl_list_20110716_enrico[1], 3, - if_typed(19, if_typed(22, 21)), + if_typed(19, 21), 35723.8506317139); } #endif @@ -216,6 +217,12 @@ void test_areal() test_one("ticket_8254", ticket_8254[0], ticket_8254[1], 1, 4, 3.63593e-08, 0.01); + test_one("ticket_6958", ticket_6958[0], ticket_6958[1], + 1, 4, 4.34355e-05, 0.01); + + test_one("ticket_8652", ticket_8652[0], ticket_8652[1], + 1, 4, 0.0003, 0.00001); + test_one("buffer_mp1", buffer_mp1[0], buffer_mp1[1], 1, 31, 2.271707796); diff --git a/test/algorithms/intersection.vcproj b/test/algorithms/intersection.vcproj deleted file mode 100644 index a9bc3a6f3..000000000 --- a/test/algorithms/intersection.vcproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/intersects.cpp b/test/algorithms/intersects.cpp index feafb0437..adef1141f 100644 --- a/test/algorithms/intersects.cpp +++ b/test/algorithms/intersects.cpp @@ -1,6 +1,8 @@ // Boost.Geometry (aka GGL, Generic Geometry Library) // // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. +// // 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) @@ -150,16 +152,48 @@ void test_all() true); } - +// Those tests won't pass for rational<> because numeric_limits<> isn't specialized for this type +template +void test_additional() +{ + test_geometry, bg::model::box

>( + "SEGMENT(0 0,3 3)", + "BOX(1 2,3 5)", + true); + test_geometry, bg::model::box

>( + "SEGMENT(1 1,2 3)", + "BOX(0 0,4 4)", + true); + test_geometry, bg::model::box

>( + "SEGMENT(1 1,1 1)", + "BOX(1 0,3 5)", + true); + test_geometry, bg::model::box

>( + "SEGMENT(0 1,0 1)", + "BOX(1 0,3 5)", + false); + test_geometry, bg::model::box

>( + "SEGMENT(2 1,2 1)", + "BOX(1 0,3 5)", + true); + test_geometry, bg::model::box

>( + "LINESTRING(0 0,1 0,10 10)", + "BOX(1 2,3 5)", + true); + test_geometry, bg::model::box

>( + "LINESTRING(1 2)", + "BOX(0 0,3 5)", + true); +} int test_main( int , char* [] ) { test_all >(); + test_additional >(); test_all > >(); - #if defined(HAVE_TTMATH) test_all >(); #endif diff --git a/test/algorithms/intersects.vcproj b/test/algorithms/intersects.vcproj deleted file mode 100644 index f3f5f64db..000000000 --- a/test/algorithms/intersects.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/length.vcproj b/test/algorithms/length.vcproj deleted file mode 100644 index 17058ddcf..000000000 --- a/test/algorithms/length.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/make.vcproj b/test/algorithms/make.vcproj deleted file mode 100644 index 37ee7ce50..000000000 --- a/test/algorithms/make.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlaps.vcproj b/test/algorithms/overlaps.vcproj deleted file mode 100644 index 06a51367f..000000000 --- a/test/algorithms/overlaps.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/assemble.vcproj b/test/algorithms/overlay/assemble.vcproj deleted file mode 100644 index 335b08ab7..000000000 --- a/test/algorithms/overlay/assemble.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/ccw_traverse.vcproj b/test/algorithms/overlay/ccw_traverse.vcproj deleted file mode 100644 index fc373c847..000000000 --- a/test/algorithms/overlay/ccw_traverse.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/dissolver.vcproj b/test/algorithms/overlay/dissolver.vcproj deleted file mode 100644 index c3c9d4bf0..000000000 --- a/test/algorithms/overlay/dissolver.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/enrich_intersection_points.vcproj b/test/algorithms/overlay/enrich_intersection_points.vcproj deleted file mode 100644 index 8880fb1f3..000000000 --- a/test/algorithms/overlay/enrich_intersection_points.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/get_turn_info.vcproj b/test/algorithms/overlay/get_turn_info.vcproj deleted file mode 100644 index 22bf1d1bd..000000000 --- a/test/algorithms/overlay/get_turn_info.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/get_turns.vcproj b/test/algorithms/overlay/get_turns.vcproj deleted file mode 100644 index 8f1b41c0b..000000000 --- a/test/algorithms/overlay/get_turns.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/merge_intersection_points.vcproj b/test/algorithms/overlay/merge_intersection_points.vcproj deleted file mode 100644 index 00afc97f9..000000000 --- a/test/algorithms/overlay/merge_intersection_points.vcproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/overlay.sln b/test/algorithms/overlay/overlay.sln deleted file mode 100644 index 9bbaff6f2..000000000 --- a/test/algorithms/overlay/overlay.sln +++ /dev/null @@ -1,61 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "traverse", "traverse.vcproj", "{6260214E-DB6F-4934-ADF7-DD2B1666171B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "self_intersection_points", "self_intersection_points.vcproj", "{06B6DCBB-AEDA-49FA-81D9-EA8959958EFC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "get_turn_info", "get_turn_info.vcproj", "{8D98821A-5033-4616-9AF4-2AEAA42D8456}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "get_turns", "get_turns.vcproj", "{B63116BF-0F0C-4374-A6CE-77061FBC34FF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "relative_order", "relative_order.vcproj", "{4C012342-116A-4E5E-9869-90389D5BBEBD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assemble", "assemble.vcproj", "{306E829F-ACEC-42D5-B1D4-2531B2F56EA3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ccw_traverse", "ccw_traverse.vcproj", "{BA789719-B2FC-405A-9258-E9E4ABCE1791}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select_rings", "select_rings.vcproj", "{029117F7-1D6A-4A05-9FB7-93E09751C909}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.ActiveCfg = Debug|Win32 - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.Build.0 = Debug|Win32 - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Release|Win32.ActiveCfg = Release|Win32 - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Release|Win32.Build.0 = Release|Win32 - {06B6DCBB-AEDA-49FA-81D9-EA8959958EFC}.Debug|Win32.ActiveCfg = Debug|Win32 - {06B6DCBB-AEDA-49FA-81D9-EA8959958EFC}.Debug|Win32.Build.0 = Debug|Win32 - {06B6DCBB-AEDA-49FA-81D9-EA8959958EFC}.Release|Win32.ActiveCfg = Release|Win32 - {06B6DCBB-AEDA-49FA-81D9-EA8959958EFC}.Release|Win32.Build.0 = Release|Win32 - {8D98821A-5033-4616-9AF4-2AEAA42D8456}.Debug|Win32.ActiveCfg = Debug|Win32 - {8D98821A-5033-4616-9AF4-2AEAA42D8456}.Debug|Win32.Build.0 = Debug|Win32 - {8D98821A-5033-4616-9AF4-2AEAA42D8456}.Release|Win32.ActiveCfg = Release|Win32 - {8D98821A-5033-4616-9AF4-2AEAA42D8456}.Release|Win32.Build.0 = Release|Win32 - {B63116BF-0F0C-4374-A6CE-77061FBC34FF}.Debug|Win32.ActiveCfg = Debug|Win32 - {B63116BF-0F0C-4374-A6CE-77061FBC34FF}.Debug|Win32.Build.0 = Debug|Win32 - {B63116BF-0F0C-4374-A6CE-77061FBC34FF}.Release|Win32.ActiveCfg = Release|Win32 - {B63116BF-0F0C-4374-A6CE-77061FBC34FF}.Release|Win32.Build.0 = Release|Win32 - {4C012342-116A-4E5E-9869-90389D5BBEBD}.Debug|Win32.ActiveCfg = Debug|Win32 - {4C012342-116A-4E5E-9869-90389D5BBEBD}.Debug|Win32.Build.0 = Debug|Win32 - {4C012342-116A-4E5E-9869-90389D5BBEBD}.Release|Win32.ActiveCfg = Release|Win32 - {4C012342-116A-4E5E-9869-90389D5BBEBD}.Release|Win32.Build.0 = Release|Win32 - {306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Debug|Win32.ActiveCfg = Debug|Win32 - {306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Debug|Win32.Build.0 = Debug|Win32 - {306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Release|Win32.ActiveCfg = Release|Win32 - {306E829F-ACEC-42D5-B1D4-2531B2F56EA3}.Release|Win32.Build.0 = Release|Win32 - {BA789719-B2FC-405A-9258-E9E4ABCE1791}.Debug|Win32.ActiveCfg = Debug|Win32 - {BA789719-B2FC-405A-9258-E9E4ABCE1791}.Debug|Win32.Build.0 = Debug|Win32 - {BA789719-B2FC-405A-9258-E9E4ABCE1791}.Release|Win32.ActiveCfg = Release|Win32 - {BA789719-B2FC-405A-9258-E9E4ABCE1791}.Release|Win32.Build.0 = Release|Win32 - {029117F7-1D6A-4A05-9FB7-93E09751C909}.Debug|Win32.ActiveCfg = Debug|Win32 - {029117F7-1D6A-4A05-9FB7-93E09751C909}.Debug|Win32.Build.0 = Debug|Win32 - {029117F7-1D6A-4A05-9FB7-93E09751C909}.Release|Win32.ActiveCfg = Release|Win32 - {029117F7-1D6A-4A05-9FB7-93E09751C909}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/algorithms/overlay/overlay_cases.hpp b/test/algorithms/overlay/overlay_cases.hpp index c3e4f356c..33d09c215 100644 --- a/test/algorithms/overlay/overlay_cases.hpp +++ b/test/algorithms/overlay/overlay_cases.hpp @@ -560,6 +560,12 @@ static std::string ticket_5103[2] = "POLYGON((-95269304 222758,-95260668 419862,-95234760 615696,-95192088 808228,-95132906 996442,-95057214 1178814,-94966028 1354074,-94860110 1520444,-94739968 1676908,-94606618 1822450,-94999048 2214880,-95165164 2033778,-95314770 1838706,-95446850 1631442,-95560388 1413510,-95654368 1186434,-95728282 951992,-95781368 711962,-95813626 468376,-95824294 222758,-95269304 222758))" }; +static std::string ticket_6958[2] = + { + "POLYGON((0.63872330997599124913 0.25963790394761232516 , 0.51901482278481125832 0.36860892060212790966 , 0.24443514109589159489 0.62663296470418572426 , 0.41175117865081167778 0.47178476291601745274 , 0.63872330997599124913 0.25963790394761232516))", + "POLYGON((0.52364358028948876367 0.36823021165656988352 , 0.7762673462275415659 0.13443113025277850237 , 0.59446187055393329146 0.29992923303868185281 , 0.52364358028948876367 0.36823021165656988352))" + }; + static std::string ticket_7462[2] = { "POLYGON((0 0 , -0.3681253195 0.9297761917 , 2.421203136 2.034152031 , 2.789328575 1.104375958 , 0 0))", @@ -573,6 +579,12 @@ static std::string ticket_8254[2] = "POLYGON((-0.27224111308522286334 0.57751061210314269534,-0.27201435369399112885 0.57735026899999997152,-0.27224111308522280783 0.57718992589685735872,-0.27224111308522286334 0.57751061210314269534))" }; +static std::string ticket_8652[2] = + { + "POLYGON((0 0, 0.05 0.04, 0.05 0, 0 0))", + "POLYGON((0.02 -2.77556e-17, 0.05 0.02, 0.05 -2.77556e-17, 0.02 -2.77556e-17))" + }; + static std::string ggl_list_20120229_volker[3] = { "POLYGON((1716 1554,2076 2250,2436 2352,2796 1248,3156 2484,3516 2688,3516 2688,3156 2484,2796 1248,2436 2352,2076 2250, 1716 1554))", diff --git a/test/algorithms/overlay/relative_order.vcproj b/test/algorithms/overlay/relative_order.vcproj deleted file mode 100644 index eb577fafe..000000000 --- a/test/algorithms/overlay/relative_order.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/robustness/Jamfile.v2 b/test/algorithms/overlay/robustness/Jamfile.v2 new file mode 100644 index 000000000..d48296d4b --- /dev/null +++ b/test/algorithms/overlay/robustness/Jamfile.v2 @@ -0,0 +1,26 @@ +# Boost.Geometry (aka GGL, Generic Geometry Library) +# +# Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands. +# Copyright (c) 2008-2013 Bruno Lalande, Paris, France. +# Copyright (c) 2009-2013 Mateusz Loskot, London, UK. +# Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland. +# +# 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) + +project boost-geometry-algorithms-overlay-robustness + : + requirements + . + /boost/program_options//boost_program_options + ; + +exe interior_triangles : interior_triangles.cpp ; +exe intersection_pies : intersection_pies.cpp ; +exe intersection_stars : intersection_stars.cpp ; +exe intersects : intersects.cpp ; +exe random_ellipses_stars : random_ellipses_stars.cpp ; +exe recursive_polygons : recursive_polygons.cpp ; +exe star_comb : star_comb.cpp ; + diff --git a/test/algorithms/overlay/robustness/interior_triangles.cpp b/test/algorithms/overlay/robustness/interior_triangles.cpp index 5dee530b9..baf945dd9 100644 --- a/test/algorithms/overlay/robustness/interior_triangles.cpp +++ b/test/algorithms/overlay/robustness/interior_triangles.cpp @@ -40,7 +40,7 @@ inline void make_polygon(Polygon& polygon, int count_x, int count_y, int index, { for(int k = 0; k < count_y; ++k) { - polygon.inners().push_back(Polygon::inner_container_type::value_type()); + polygon.inners().push_back(typename Polygon::inner_container_type::value_type()); polygon.inners().back().push_back(point_type(offset + j * 10 + 1, k * 10 + 1)); polygon.inners().back().push_back(point_type(offset + j * 10 + 7, k * 10 + 5 + index)); polygon.inners().back().push_back(point_type(offset + j * 10 + 5 + index, k * 10 + 7)); @@ -81,7 +81,6 @@ void test_all(int count, int count_x, int count_y, int offset, p_q_settings cons > polygon; - int index = 0; for(int i = 0; i < count; i++) { test_star_comb(count_x, count_y, offset, settings); diff --git a/test/algorithms/overlay/robustness/interior_triangles.vcproj b/test/algorithms/overlay/robustness/interior_triangles.vcproj deleted file mode 100644 index 831514b3e..000000000 --- a/test/algorithms/overlay/robustness/interior_triangles.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/robustness/intersection_pies.vcproj b/test/algorithms/overlay/robustness/intersection_pies.vcproj deleted file mode 100644 index 1ead5e8e9..000000000 --- a/test/algorithms/overlay/robustness/intersection_pies.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/robustness/intersection_stars.vcproj b/test/algorithms/overlay/robustness/intersection_stars.vcproj deleted file mode 100644 index 5c41db055..000000000 --- a/test/algorithms/overlay/robustness/intersection_stars.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/robustness/intersects.cpp b/test/algorithms/overlay/robustness/intersects.cpp index e16caeb03..6ad26d22a 100644 --- a/test/algorithms/overlay/robustness/intersects.cpp +++ b/test/algorithms/overlay/robustness/intersects.cpp @@ -36,7 +36,7 @@ inline void make_polygon(MultiPolygon& mp, int count_x, int count_y, int index, { for(int k = 0; k < count_y; ++k) { - mp.push_back(MultiPolygon::value_type()); + mp.push_back(typename MultiPolygon::value_type()); mp.back().outer().push_back(point_type(width_x + j * 10 + 1, k * 10 + 1)); mp.back().outer().push_back(point_type(width_x + j * 10 + width_x, k * 10 + 5 + index)); mp.back().outer().push_back(point_type(width_x + j * 10 + 5 + index, k * 10 + 7)); @@ -93,7 +93,6 @@ void test_all(int count, int count_x, int count_y, int width_x, p_q_settings con > multi_polygon; - int index = 0; for(int i = 0; i < count; i++) { test_intersects(count_x, count_y, width_x, settings); diff --git a/test/algorithms/overlay/robustness/intersects.vcproj b/test/algorithms/overlay/robustness/intersects.vcproj deleted file mode 100644 index 8331792e5..000000000 --- a/test/algorithms/overlay/robustness/intersects.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/robustness/random_ellipses_stars.vcproj b/test/algorithms/overlay/robustness/random_ellipses_stars.vcproj deleted file mode 100644 index 6f547c6f7..000000000 --- a/test/algorithms/overlay/robustness/random_ellipses_stars.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/robustness/recursive_polygons.vcproj b/test/algorithms/overlay/robustness/recursive_polygons.vcproj deleted file mode 100644 index b2cc41335..000000000 --- a/test/algorithms/overlay/robustness/recursive_polygons.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/robustness/robustness.sln b/test/algorithms/overlay/robustness/robustness.sln deleted file mode 100644 index dd6ff8821..000000000 --- a/test/algorithms/overlay/robustness/robustness.sln +++ /dev/null @@ -1,55 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "random_ellipses_stars", "random_ellipses_stars.vcproj", "{C16633DE-83F8-40E3-9915-3B9C872C7B1E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intersection_stars", "intersection_stars.vcproj", "{A76B81BF-B5B4-4D09-BB81-F235647891DE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intersection_pies", "intersection_pies.vcproj", "{24D92478-7C66-4DD5-A501-30A3D4376E4F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recursive_polygons", "recursive_polygons.vcproj", "{E1AA569C-858C-4789-A6FF-5CDFB41C59D7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "star_comb", "star_comb.vcproj", "{6D8C81C1-23CD-469E-8094-E0C01B51E944}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "interior_triangles", "interior_triangles.vcproj", "{7583C2E3-AD74-4C34-8E94-9162F641B215}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "intersects", "intersects.vcproj", "{1AC9B120-3ED0-4444-86E5-1916108943C7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C16633DE-83F8-40E3-9915-3B9C872C7B1E}.Debug|Win32.ActiveCfg = Debug|Win32 - {C16633DE-83F8-40E3-9915-3B9C872C7B1E}.Debug|Win32.Build.0 = Debug|Win32 - {C16633DE-83F8-40E3-9915-3B9C872C7B1E}.Release|Win32.ActiveCfg = Release|Win32 - {C16633DE-83F8-40E3-9915-3B9C872C7B1E}.Release|Win32.Build.0 = Release|Win32 - {A76B81BF-B5B4-4D09-BB81-F235647891DE}.Debug|Win32.ActiveCfg = Debug|Win32 - {A76B81BF-B5B4-4D09-BB81-F235647891DE}.Debug|Win32.Build.0 = Debug|Win32 - {A76B81BF-B5B4-4D09-BB81-F235647891DE}.Release|Win32.ActiveCfg = Release|Win32 - {A76B81BF-B5B4-4D09-BB81-F235647891DE}.Release|Win32.Build.0 = Release|Win32 - {24D92478-7C66-4DD5-A501-30A3D4376E4F}.Debug|Win32.ActiveCfg = Debug|Win32 - {24D92478-7C66-4DD5-A501-30A3D4376E4F}.Debug|Win32.Build.0 = Debug|Win32 - {24D92478-7C66-4DD5-A501-30A3D4376E4F}.Release|Win32.ActiveCfg = Release|Win32 - {24D92478-7C66-4DD5-A501-30A3D4376E4F}.Release|Win32.Build.0 = Release|Win32 - {E1AA569C-858C-4789-A6FF-5CDFB41C59D7}.Debug|Win32.ActiveCfg = Debug|Win32 - {E1AA569C-858C-4789-A6FF-5CDFB41C59D7}.Debug|Win32.Build.0 = Debug|Win32 - {E1AA569C-858C-4789-A6FF-5CDFB41C59D7}.Release|Win32.ActiveCfg = Release|Win32 - {E1AA569C-858C-4789-A6FF-5CDFB41C59D7}.Release|Win32.Build.0 = Release|Win32 - {6D8C81C1-23CD-469E-8094-E0C01B51E944}.Debug|Win32.ActiveCfg = Debug|Win32 - {6D8C81C1-23CD-469E-8094-E0C01B51E944}.Debug|Win32.Build.0 = Debug|Win32 - {6D8C81C1-23CD-469E-8094-E0C01B51E944}.Release|Win32.ActiveCfg = Release|Win32 - {6D8C81C1-23CD-469E-8094-E0C01B51E944}.Release|Win32.Build.0 = Release|Win32 - {7583C2E3-AD74-4C34-8E94-9162F641B215}.Debug|Win32.ActiveCfg = Debug|Win32 - {7583C2E3-AD74-4C34-8E94-9162F641B215}.Debug|Win32.Build.0 = Debug|Win32 - {7583C2E3-AD74-4C34-8E94-9162F641B215}.Release|Win32.ActiveCfg = Release|Win32 - {7583C2E3-AD74-4C34-8E94-9162F641B215}.Release|Win32.Build.0 = Release|Win32 - {1AC9B120-3ED0-4444-86E5-1916108943C7}.Debug|Win32.ActiveCfg = Debug|Win32 - {1AC9B120-3ED0-4444-86E5-1916108943C7}.Debug|Win32.Build.0 = Debug|Win32 - {1AC9B120-3ED0-4444-86E5-1916108943C7}.Release|Win32.ActiveCfg = Release|Win32 - {1AC9B120-3ED0-4444-86E5-1916108943C7}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/algorithms/overlay/robustness/star_comb.cpp b/test/algorithms/overlay/robustness/star_comb.cpp index 8b1269f61..6713c5618 100644 --- a/test/algorithms/overlay/robustness/star_comb.cpp +++ b/test/algorithms/overlay/robustness/star_comb.cpp @@ -60,8 +60,6 @@ void test_all(int count, int star_point_count, int comb_comb_count, double facto bg::model::d2::point_xy, Clockwise, Closed > polygon; - - int index = 0; for(int i = 0; i < count; i++) { test_star_comb(star_point_count, comb_comb_count, factor1, factor2, do_union, settings); diff --git a/test/algorithms/overlay/robustness/star_comb.vcproj b/test/algorithms/overlay/robustness/star_comb.vcproj deleted file mode 100644 index 01a30306a..000000000 --- a/test/algorithms/overlay/robustness/star_comb.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/select_rings.vcproj b/test/algorithms/overlay/select_rings.vcproj deleted file mode 100644 index 5706311fc..000000000 --- a/test/algorithms/overlay/select_rings.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/self_intersection_points.vcproj b/test/algorithms/overlay/self_intersection_points.vcproj deleted file mode 100644 index a4cdb8049..000000000 --- a/test/algorithms/overlay/self_intersection_points.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/split_rings.vcproj b/test/algorithms/overlay/split_rings.vcproj deleted file mode 100644 index cb9b6bf78..000000000 --- a/test/algorithms/overlay/split_rings.vcproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/overlay/traverse.vcproj b/test/algorithms/overlay/traverse.vcproj deleted file mode 100644 index f5c83a551..000000000 --- a/test/algorithms/overlay/traverse.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/perimeter.vcproj b/test/algorithms/perimeter.vcproj deleted file mode 100644 index a39d1880f..000000000 --- a/test/algorithms/perimeter.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/reverse.vcproj b/test/algorithms/reverse.vcproj deleted file mode 100644 index 9f438a8c2..000000000 --- a/test/algorithms/reverse.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/simplify.vcproj b/test/algorithms/simplify.vcproj deleted file mode 100644 index 3193c8abf..000000000 --- a/test/algorithms/simplify.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/test_difference.hpp b/test/algorithms/test_difference.hpp index c3e34206d..d5b8ab682 100644 --- a/test/algorithms/test_difference.hpp +++ b/test/algorithms/test_difference.hpp @@ -144,7 +144,7 @@ void test_difference(std::string const& caseid, G1 const& g1, G2 const& g2, "difference: " << caseid << " #points expected: " << expected_point_count << " detected: " << n - << " type: " << string_from_type::name() + << " type: " << (type_for_assert_message()) ); } @@ -154,7 +154,7 @@ void test_difference(std::string const& caseid, G1 const& g1, G2 const& g2, "difference: " << caseid << " #outputs expected: " << expected_count << " detected: " << clip.size() - << " type: " << string_from_type::name() + << " type: " << (type_for_assert_message()) ); } diff --git a/test/algorithms/test_distance.hpp b/test/algorithms/test_distance.hpp index 271bdab6e..a28e777ea 100644 --- a/test/algorithms/test_distance.hpp +++ b/test/algorithms/test_distance.hpp @@ -24,9 +24,9 @@ // For a point-segment-distance operation, there is some magic inside // using another point type and casting if necessary. Therefore, // two point-types are necessary. -template struct taxicab_distance { + template static inline typename bg::coordinate_type::type apply( P1 const& p1, P2 const& p2) { @@ -42,59 +42,40 @@ struct taxicab_distance namespace boost { namespace geometry { namespace strategy { namespace distance { namespace services { -template -struct tag > +template <> +struct tag { typedef strategy_tag_distance_point_point type; }; template -struct return_type > +struct return_type { typedef typename coordinate_type::type type; }; -template -struct similar_type, PN1, PN2> +template <> +struct comparable_type { - typedef taxicab_distance type; + typedef taxicab_distance type; }; - -template -struct get_similar, PN1, PN2> +template <> +struct get_comparable { - static inline typename similar_type - < - taxicab_distance, PN1, PN2 - >::type apply(taxicab_distance const& ) - { - return taxicab_distance(); - } -}; - -template -struct comparable_type > -{ - typedef taxicab_distance type; -}; - -template -struct get_comparable > -{ - static inline taxicab_distance apply(taxicab_distance const& input) + static inline taxicab_distance apply(taxicab_distance const& input) { return input; } }; template -struct result_from_distance > +struct result_from_distance { template - static inline typename coordinate_type::type apply(taxicab_distance const& , T const& value) + static inline typename coordinate_type::type apply(taxicab_distance const& , T const& value) { return value; } diff --git a/test/algorithms/test_intersection.hpp b/test/algorithms/test_intersection.hpp index 4594cb19e..119bdfbc7 100644 --- a/test/algorithms/test_intersection.hpp +++ b/test/algorithms/test_intersection.hpp @@ -42,7 +42,7 @@ typename bg::default_area_result::type test_intersection(std::string const& double percentage = 0.0001, bool debug = false) { - static const bool is_line = bg::geometry_id::type::value == 2; + bool const is_line = bg::geometry_id::type::value == 2; if (debug) { @@ -102,7 +102,7 @@ typename bg::default_area_result::type test_intersection(std::string const& "intersection: " << caseid << " #points expected: " << expected_point_count << " detected: " << n - << " type: " << string_from_type::name() + << " type: " << (type_for_assert_message()) ); } @@ -112,7 +112,7 @@ typename bg::default_area_result::type test_intersection(std::string const& "intersection: " << caseid << " #outputs expected: " << expected_count << " detected: " << clip.size() - << " type: " << string_from_type::name() + << " type: " << (type_for_assert_message()) ); } diff --git a/test/algorithms/test_simplify.hpp b/test/algorithms/test_simplify.hpp index 30f0998f7..b5ed1d359 100644 --- a/test/algorithms/test_simplify.hpp +++ b/test/algorithms/test_simplify.hpp @@ -64,18 +64,14 @@ void test_geometry(std::string const& wkt, std::string const& expected, double d // Check using user-specified strategy typedef typename bg::point_type::type point_type; typedef typename bg::cs_tag::type tag; - typedef bg::strategy::distance::projected_point - < - point_type, - point_type - > strategy; + typedef bg::strategy::distance::projected_point strategy; typedef bg::strategy::simplify::douglas_peucker < point_type, strategy > simplify_strategy_type; - BOOST_CONCEPT_ASSERT( (bg::concept::SimplifyStrategy) ); + BOOST_CONCEPT_ASSERT( (bg::concept::SimplifyStrategy) ); bg::simplify(geometry, simplified, distance, simplify_strategy_type()); { diff --git a/test/algorithms/test_union.hpp b/test/algorithms/test_union.hpp index c449c66e3..e05390629 100644 --- a/test/algorithms/test_union.hpp +++ b/test/algorithms/test_union.hpp @@ -96,7 +96,7 @@ void test_union(std::string const& caseid, G1 const& g1, G2 const& g2, "union: " << caseid << " #points expected: " << expected_point_count << " detected: " << n - << " type: " << string_from_type::name() + << " type: " << (type_for_assert_message()) ); } diff --git a/test/algorithms/touches.vcproj b/test/algorithms/touches.vcproj deleted file mode 100644 index 79cc17048..000000000 --- a/test/algorithms/touches.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/transform.vcproj b/test/algorithms/transform.vcproj deleted file mode 100644 index fcf3c902d..000000000 --- a/test/algorithms/transform.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/union.cpp b/test/algorithms/union.cpp index 751825244..1ac747d83 100644 --- a/test/algorithms/union.cpp +++ b/test/algorithms/union.cpp @@ -15,13 +15,8 @@ #include #include -#define BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE #define TEST_ISOVIST -//#define BOOST_GEOMETRY_DEBUG_ASSEMBLE -//#define BOOST_GEOMETRY_DEBUG_IDENTIFIER - - #include #include @@ -148,7 +143,7 @@ void test_areal() test_one("distance_zero", distance_zero[0], distance_zero[1], - 1, 0, 11, 9.0098387); + 1, 0, if_typed(9, 11), 9.0098387); test_one("wrapped_a", wrapped[0], wrapped[1], @@ -229,7 +224,7 @@ void test_areal() test_one("ggl_list_20110627_phillip", ggl_list_20110627_phillip[0], ggl_list_20110627_phillip[1], 1, 0, - if_typed(5, if_typed_tt(8, 7)), + if_typed(5, if_typed_tt(8, 8)), 14729.07145); @@ -254,7 +249,7 @@ void test_areal() isovist1[0], isovist1[1], 1, 0, - if_typed(71, if_typed(70, 73)), + if_typed(72, if_typed(70, 73)), 313.36036462, 0.1); // SQL Server gives: 313.360374193241 @@ -282,17 +277,17 @@ void test_areal() // Robustness issues, followed out buffer-robustness-tests, test them also reverse test_one("buffer_rt_f", buffer_rt_f[0], buffer_rt_f[1], - 1, 0, if_typed(22, 23), 4.60853); + 1, 0, if_typed(21, 23), 4.60853); test_one("buffer_rt_f_rev", buffer_rt_f[1], buffer_rt_f[0], - 1, 0, if_typed(22, 23), 4.60853); + 1, 0, if_typed(21, 23), 4.60853); test_one("buffer_rt_g", buffer_rt_g[0], buffer_rt_g[1], - 1, 0, 17, 16.571); + 1, 0, if_typed(18, 17), 16.571); test_one("buffer_rt_g_rev", buffer_rt_g[1], buffer_rt_g[0], - 1, 0, 17, 16.571); + 1, 0, if_typed(18, 17), 16.571); test_one("buffer_rt_i", buffer_rt_i[0], buffer_rt_i[1], - 1, 0, 13, 13.6569); + 1, 0, if_typed(14, 13), 13.6569); bool test_rt_i_rev = true; #ifndef _MSC_VER @@ -342,17 +337,17 @@ void test_areal() test_one("buffer_rt_t", buffer_rt_t[0], buffer_rt_t[1], 1, 0, if_typed_tt(16, 14), 15.6569); test_one("buffer_rt_t_ref", buffer_rt_t[1], buffer_rt_t[0], - 1, 0, if_typed_tt(16, 14), 15.6569); + 1, 0, if_typed_tt(16, if_typed(15, 14)), 15.6569); test_one("buffer_mp1", buffer_mp1[0], buffer_mp1[1], - 1, 0, 91, 22.815); + 1, 0, if_typed_tt(93, 91), 22.815); if (boost::is_same::type::value) { // Contains robustness issue for collinear-opposite. // In double it delivers a polygon and a hole test_one("buffer_mp2", buffer_mp2[0], buffer_mp2[1], - 1, 1, 218, 36.7535642); + 1, 1, 217, 36.7535642); } else if (boost::is_same::type::value) { @@ -423,10 +418,6 @@ void test_all() int test_main(int, char* []) { test_all >(); -#if defined(HAVE_TTMATH) - std::cout << "Testing TTMATH" << std::endl; - test_all >(); -#endif #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) test_all >(); diff --git a/test/algorithms/union.vcproj b/test/algorithms/union.vcproj deleted file mode 100644 index a3399b777..000000000 --- a/test/algorithms/union.vcproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/unique.vcproj b/test/algorithms/unique.vcproj deleted file mode 100644 index e4a67084e..000000000 --- a/test/algorithms/unique.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/algorithms/within.vcproj b/test/algorithms/within.vcproj deleted file mode 100644 index 89d03ef72..000000000 --- a/test/algorithms/within.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/arithmetic/arithmetic.vcproj b/test/arithmetic/arithmetic.vcproj deleted file mode 100644 index f2d448a33..000000000 --- a/test/arithmetic/arithmetic.vcproj +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/arithmetic/arithmetic_tests.sln b/test/arithmetic/arithmetic_tests.sln deleted file mode 100644 index 37a636a0e..000000000 --- a/test/arithmetic/arithmetic_tests.sln +++ /dev/null @@ -1,25 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "arithmetic", "arithmetic.vcproj", "{4D447233-54DC-4C1B-B8DF-4689590ACF56}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dot_product", "dot_product.vcproj", "{C9CD2A98-3327-4560-A979-4BF506F777A8}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4D447233-54DC-4C1B-B8DF-4689590ACF56}.Debug|Win32.ActiveCfg = Debug|Win32 - {4D447233-54DC-4C1B-B8DF-4689590ACF56}.Debug|Win32.Build.0 = Debug|Win32 - {4D447233-54DC-4C1B-B8DF-4689590ACF56}.Release|Win32.ActiveCfg = Release|Win32 - {4D447233-54DC-4C1B-B8DF-4689590ACF56}.Release|Win32.Build.0 = Release|Win32 - {C9CD2A98-3327-4560-A979-4BF506F777A8}.Debug|Win32.ActiveCfg = Debug|Win32 - {C9CD2A98-3327-4560-A979-4BF506F777A8}.Debug|Win32.Build.0 = Debug|Win32 - {C9CD2A98-3327-4560-A979-4BF506F777A8}.Release|Win32.ActiveCfg = Release|Win32 - {C9CD2A98-3327-4560-A979-4BF506F777A8}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/arithmetic/dot_product.vcproj b/test/arithmetic/dot_product.vcproj deleted file mode 100644 index 879b92154..000000000 --- a/test/arithmetic/dot_product.vcproj +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/boost.vsprops b/test/boost.vsprops deleted file mode 100644 index c527810d4..000000000 --- a/test/boost.vsprops +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - diff --git a/test/concepts/concepts_tests.sln b/test/concepts/concepts_tests.sln deleted file mode 100644 index 1430bdcc0..000000000 --- a/test/concepts/concepts_tests.sln +++ /dev/null @@ -1,25 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "linestring_concept", "linestring_concept.vcproj", "{CA8D5E44-7D8F-44A1-900C-35C28890299B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "polygon_concept", "polygon_concept.vcproj", "{306B99D1-576A-4EB6-BF7E-B111CA3807FE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Debug|Win32.ActiveCfg = Debug|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Debug|Win32.Build.0 = Debug|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Release|Win32.ActiveCfg = Release|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Release|Win32.Build.0 = Release|Win32 - {306B99D1-576A-4EB6-BF7E-B111CA3807FE}.Debug|Win32.ActiveCfg = Debug|Win32 - {306B99D1-576A-4EB6-BF7E-B111CA3807FE}.Debug|Win32.Build.0 = Debug|Win32 - {306B99D1-576A-4EB6-BF7E-B111CA3807FE}.Release|Win32.ActiveCfg = Release|Win32 - {306B99D1-576A-4EB6-BF7E-B111CA3807FE}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/concepts/linestring_concept.vcproj b/test/concepts/linestring_concept.vcproj deleted file mode 100644 index c40b03bf1..000000000 --- a/test/concepts/linestring_concept.vcproj +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/core/access.vcproj b/test/core/access.vcproj deleted file mode 100644 index 845fa4efe..000000000 --- a/test/core/access.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/core/core.sln b/test/core/core.sln deleted file mode 100644 index 9f368dbc0..000000000 --- a/test/core/core.sln +++ /dev/null @@ -1,37 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "access", "access.vcproj", "{5542B963-D229-4393-968F-E62DDCE4B87B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reverse_dispatch", "reverse_dispatch.vcproj", "{EA65AF97-67BC-49C8-9CAF-4136514A41EE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radian_access", "radian_access.vcproj", "{DE2968B5-DCA6-4D85-A620-7DA111FC0E06}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ring", "ring.vcproj", "{1EE3F112-638F-4447-8F9D-4C5BB3304C3B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5542B963-D229-4393-968F-E62DDCE4B87B}.Debug|Win32.ActiveCfg = Debug|Win32 - {5542B963-D229-4393-968F-E62DDCE4B87B}.Debug|Win32.Build.0 = Debug|Win32 - {5542B963-D229-4393-968F-E62DDCE4B87B}.Release|Win32.ActiveCfg = Release|Win32 - {5542B963-D229-4393-968F-E62DDCE4B87B}.Release|Win32.Build.0 = Release|Win32 - {EA65AF97-67BC-49C8-9CAF-4136514A41EE}.Debug|Win32.ActiveCfg = Debug|Win32 - {EA65AF97-67BC-49C8-9CAF-4136514A41EE}.Debug|Win32.Build.0 = Debug|Win32 - {EA65AF97-67BC-49C8-9CAF-4136514A41EE}.Release|Win32.ActiveCfg = Release|Win32 - {EA65AF97-67BC-49C8-9CAF-4136514A41EE}.Release|Win32.Build.0 = Release|Win32 - {DE2968B5-DCA6-4D85-A620-7DA111FC0E06}.Debug|Win32.ActiveCfg = Debug|Win32 - {DE2968B5-DCA6-4D85-A620-7DA111FC0E06}.Debug|Win32.Build.0 = Debug|Win32 - {DE2968B5-DCA6-4D85-A620-7DA111FC0E06}.Release|Win32.ActiveCfg = Release|Win32 - {DE2968B5-DCA6-4D85-A620-7DA111FC0E06}.Release|Win32.Build.0 = Release|Win32 - {1EE3F112-638F-4447-8F9D-4C5BB3304C3B}.Debug|Win32.ActiveCfg = Debug|Win32 - {1EE3F112-638F-4447-8F9D-4C5BB3304C3B}.Debug|Win32.Build.0 = Debug|Win32 - {1EE3F112-638F-4447-8F9D-4C5BB3304C3B}.Release|Win32.ActiveCfg = Release|Win32 - {1EE3F112-638F-4447-8F9D-4C5BB3304C3B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/core/radian_access.vcproj b/test/core/radian_access.vcproj deleted file mode 100644 index 5e5613ca0..000000000 --- a/test/core/radian_access.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/core/reverse_dispatch.vcproj b/test/core/reverse_dispatch.vcproj deleted file mode 100644 index 2966d9db4..000000000 --- a/test/core/reverse_dispatch.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/core/ring.vcproj b/test/core/ring.vcproj deleted file mode 100644 index e5e1a90fb..000000000 --- a/test/core/ring.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/boost_array_as_point.vcproj b/test/geometries/boost_array_as_point.vcproj deleted file mode 100644 index 75008a582..000000000 --- a/test/geometries/boost_array_as_point.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/boost_fusion.vcproj b/test/geometries/boost_fusion.vcproj deleted file mode 100644 index 95d2b6015..000000000 --- a/test/geometries/boost_fusion.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/boost_polygon.vcproj b/test/geometries/boost_polygon.vcproj deleted file mode 100644 index f346bb667..000000000 --- a/test/geometries/boost_polygon.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/boost_polygon_overlay.vcproj b/test/geometries/boost_polygon_overlay.vcproj deleted file mode 100644 index 8f662b36e..000000000 --- a/test/geometries/boost_polygon_overlay.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/boost_range.vcproj b/test/geometries/boost_range.vcproj deleted file mode 100644 index e6f7455e9..000000000 --- a/test/geometries/boost_range.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/box.vcproj b/test/geometries/box.vcproj deleted file mode 100644 index 08bf87585..000000000 --- a/test/geometries/box.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/concepts/check.sln b/test/geometries/concepts/check.sln deleted file mode 100644 index 98293a669..000000000 --- a/test/geometries/concepts/check.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "check", "check.vcproj", "{6260214E-DB6F-4934-ADF7-DD2B1666171B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.ActiveCfg = Debug|Win32 - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Debug|Win32.Build.0 = Debug|Win32 - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Release|Win32.ActiveCfg = Release|Win32 - {6260214E-DB6F-4934-ADF7-DD2B1666171B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/geometries/concepts/check.vcproj b/test/geometries/concepts/check.vcproj deleted file mode 100644 index 480b4145b..000000000 --- a/test/geometries/concepts/check.vcproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/custom_linestring.vcproj b/test/geometries/custom_linestring.vcproj deleted file mode 100644 index 8dfe0c7eb..000000000 --- a/test/geometries/custom_linestring.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometries/geometries_tests.sln b/test/geometries/geometries_tests.sln deleted file mode 100644 index 56097d012..000000000 --- a/test/geometries/geometries_tests.sln +++ /dev/null @@ -1,61 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "box", "box.vcproj", "{EB7B69C6-2D62-43BC-BA18-D15BEB998665}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "custom_linestring", "custom_linestring.vcproj", "{CA8D5E44-7D8F-44A1-900C-35C28890299B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "segment", "segment.vcproj", "{F995B070-62A2-46FE-A676-79AADB71DBD8}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_array_as_point", "boost_array_as_point.vcproj", "{77F84000-D088-46AD-A023-08552101B1C5}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_polygon", "boost_polygon.vcproj", "{6809180F-1E31-42B0-8481-67AC8E9B180B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_range", "boost_range.vcproj", "{8E719071-B525-4F58-832A-AB75FCA8BEA0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_fusion", "boost_fusion.vcproj", "{C218C979-890F-4690-84E0-837DC661CE57}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boost_polygon_overlay", "boost_polygon_overlay.vcproj", "{93C4EB19-8A0C-437E-9F82-A0DB4A4A5C32}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {EB7B69C6-2D62-43BC-BA18-D15BEB998665}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB7B69C6-2D62-43BC-BA18-D15BEB998665}.Debug|Win32.Build.0 = Debug|Win32 - {EB7B69C6-2D62-43BC-BA18-D15BEB998665}.Release|Win32.ActiveCfg = Release|Win32 - {EB7B69C6-2D62-43BC-BA18-D15BEB998665}.Release|Win32.Build.0 = Release|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Debug|Win32.ActiveCfg = Debug|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Debug|Win32.Build.0 = Debug|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Release|Win32.ActiveCfg = Release|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Release|Win32.Build.0 = Release|Win32 - {F995B070-62A2-46FE-A676-79AADB71DBD8}.Debug|Win32.ActiveCfg = Debug|Win32 - {F995B070-62A2-46FE-A676-79AADB71DBD8}.Debug|Win32.Build.0 = Debug|Win32 - {F995B070-62A2-46FE-A676-79AADB71DBD8}.Release|Win32.ActiveCfg = Release|Win32 - {F995B070-62A2-46FE-A676-79AADB71DBD8}.Release|Win32.Build.0 = Release|Win32 - {77F84000-D088-46AD-A023-08552101B1C5}.Debug|Win32.ActiveCfg = Debug|Win32 - {77F84000-D088-46AD-A023-08552101B1C5}.Debug|Win32.Build.0 = Debug|Win32 - {77F84000-D088-46AD-A023-08552101B1C5}.Release|Win32.ActiveCfg = Release|Win32 - {77F84000-D088-46AD-A023-08552101B1C5}.Release|Win32.Build.0 = Release|Win32 - {6809180F-1E31-42B0-8481-67AC8E9B180B}.Debug|Win32.ActiveCfg = Debug|Win32 - {6809180F-1E31-42B0-8481-67AC8E9B180B}.Debug|Win32.Build.0 = Debug|Win32 - {6809180F-1E31-42B0-8481-67AC8E9B180B}.Release|Win32.ActiveCfg = Release|Win32 - {6809180F-1E31-42B0-8481-67AC8E9B180B}.Release|Win32.Build.0 = Release|Win32 - {8E719071-B525-4F58-832A-AB75FCA8BEA0}.Debug|Win32.ActiveCfg = Debug|Win32 - {8E719071-B525-4F58-832A-AB75FCA8BEA0}.Debug|Win32.Build.0 = Debug|Win32 - {8E719071-B525-4F58-832A-AB75FCA8BEA0}.Release|Win32.ActiveCfg = Release|Win32 - {8E719071-B525-4F58-832A-AB75FCA8BEA0}.Release|Win32.Build.0 = Release|Win32 - {C218C979-890F-4690-84E0-837DC661CE57}.Debug|Win32.ActiveCfg = Debug|Win32 - {C218C979-890F-4690-84E0-837DC661CE57}.Debug|Win32.Build.0 = Debug|Win32 - {C218C979-890F-4690-84E0-837DC661CE57}.Release|Win32.ActiveCfg = Release|Win32 - {C218C979-890F-4690-84E0-837DC661CE57}.Release|Win32.Build.0 = Release|Win32 - {93C4EB19-8A0C-437E-9F82-A0DB4A4A5C32}.Debug|Win32.ActiveCfg = Debug|Win32 - {93C4EB19-8A0C-437E-9F82-A0DB4A4A5C32}.Debug|Win32.Build.0 = Debug|Win32 - {93C4EB19-8A0C-437E-9F82-A0DB4A4A5C32}.Release|Win32.ActiveCfg = Release|Win32 - {93C4EB19-8A0C-437E-9F82-A0DB4A4A5C32}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/geometries/segment.vcproj b/test/geometries/segment.vcproj deleted file mode 100644 index a25abee4e..000000000 --- a/test/geometries/segment.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/geometry_test_common.hpp b/test/geometry_test_common.hpp index 689408c77..0b05135be 100644 --- a/test/geometry_test_common.hpp +++ b/test/geometry_test_common.hpp @@ -38,7 +38,7 @@ // Include some always-included-for-testing files #if ! defined(BOOST_GEOMETRY_NO_BOOST_TEST) -// Until Boost fixes it, silence warning issued by clang: +// Until Boost.Test fixes it, silence warning issued by clang: // warning: unused variable 'check_is_close' [-Wunused-variable] #ifdef __clang__ # pragma clang diagnostic push @@ -73,6 +73,15 @@ # include #endif +// For all tests: +// - do NOT use "using namespace boost::geometry" to make clear what is Boost.Geometry +// - use bg:: as short alias +#include +#include +#include +#include +namespace bg = boost::geometry; + template struct string_from_type {}; @@ -130,8 +139,22 @@ inline T if_typed(T value_typed, T value) return boost::is_same::value ? value_typed : value; } +template +inline std::string type_for_assert_message() +{ + bool const ccw = + bg::point_order::value == bg::counterclockwise + || bg::point_order::value == bg::counterclockwise; + bool const open = + bg::closure::value == bg::open + || bg::closure::value == bg::open; - + std::ostringstream out; + out << string_from_type::type>::name() + << (ccw ? " ccw" : "") + << (open ? " open" : ""); + return out.str(); +} struct geographic_policy { @@ -154,12 +177,4 @@ struct mathematical_policy - -// For all tests: -// - do NOT use "using namespace boost::geometry" to make clear what is Boost.Geometry -// - use bg:: as short alias -#include -namespace bg = boost::geometry; - - #endif // GEOMETRY_TEST_GEOMETRY_TEST_COMMON_HPP diff --git a/test/io/wkt/io_wkt_tests.sln b/test/io/wkt/io_wkt_tests.sln deleted file mode 100644 index 626c327bc..000000000 --- a/test/io/wkt/io_wkt_tests.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wkt", "wkt.vcproj", "{1FA2ADE2-F649-4245-951E-A8F5935E7127}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Debug|Win32.ActiveCfg = Debug|Win32 - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Debug|Win32.Build.0 = Debug|Win32 - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Release|Win32.ActiveCfg = Release|Win32 - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/io/wkt/wkt.vcproj b/test/io/wkt/wkt.vcproj deleted file mode 100644 index 988ee6af7..000000000 --- a/test/io/wkt/wkt.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/iterators/closing_iterator.vcproj b/test/iterators/closing_iterator.vcproj deleted file mode 100644 index e11dc14ef..000000000 --- a/test/iterators/closing_iterator.vcproj +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/iterators/ever_circling_iterator.vcproj b/test/iterators/ever_circling_iterator.vcproj deleted file mode 100644 index ebeddee29..000000000 --- a/test/iterators/ever_circling_iterator.vcproj +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/iterators/iterators.sln b/test/iterators/iterators.sln deleted file mode 100644 index 8b1e55c7e..000000000 --- a/test/iterators/iterators.sln +++ /dev/null @@ -1,25 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ever_circling_iterator", "ever_circling_iterator.vcproj", "{73F8C969-FA1E-4D9D-81F9-35B1206F0C14}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "closing_iterator", "closing_iterator.vcproj", "{04C31A2D-BE88-4FDB-AFFE-EFDFFA9D9C39}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {73F8C969-FA1E-4D9D-81F9-35B1206F0C14}.Debug|Win32.ActiveCfg = Debug|Win32 - {73F8C969-FA1E-4D9D-81F9-35B1206F0C14}.Debug|Win32.Build.0 = Debug|Win32 - {73F8C969-FA1E-4D9D-81F9-35B1206F0C14}.Release|Win32.ActiveCfg = Release|Win32 - {73F8C969-FA1E-4D9D-81F9-35B1206F0C14}.Release|Win32.Build.0 = Release|Win32 - {04C31A2D-BE88-4FDB-AFFE-EFDFFA9D9C39}.Debug|Win32.ActiveCfg = Debug|Win32 - {04C31A2D-BE88-4FDB-AFFE-EFDFFA9D9C39}.Debug|Win32.Build.0 = Debug|Win32 - {04C31A2D-BE88-4FDB-AFFE-EFDFFA9D9C39}.Release|Win32.ActiveCfg = Release|Win32 - {04C31A2D-BE88-4FDB-AFFE-EFDFFA9D9C39}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/multi/algorithms/Jamfile.v2 b/test/multi/algorithms/Jamfile.v2 index 624193c21..1945fe36a 100644 --- a/test/multi/algorithms/Jamfile.v2 +++ b/test/multi/algorithms/Jamfile.v2 @@ -16,13 +16,14 @@ test-suite boost-geometry-multi-algorithms [ run multi_convex_hull.cpp ] [ run multi_correct.cpp ] [ run multi_covered_by.cpp ] - [ run multi_difference.cpp ] + [ run multi_difference.cpp : : : msvc:/bigobj ] + [ run multi_difference_spike.cpp : : : msvc:/bigobj ] [ run multi_disjoint.cpp ] [ run multi_distance.cpp ] [ run multi_envelope.cpp ] [ run multi_equals.cpp ] [ run multi_for_each.cpp ] - [ run multi_intersection.cpp ] + [ run multi_intersection.cpp : : : msvc:/bigobj ] [ run multi_intersects.cpp ] [ run multi_length.cpp ] [ run multi_num_geometries.cpp ] @@ -33,7 +34,7 @@ test-suite boost-geometry-multi-algorithms [ run multi_simplify.cpp ] [ run multi_touches.cpp ] [ run multi_transform.cpp ] - [ run multi_union.cpp ] + [ run multi_union.cpp : : : msvc:/bigobj ] [ run multi_unique.cpp ] [ run multi_within.cpp ] ; diff --git a/test/multi/algorithms/multi_area.vcproj b/test/multi/algorithms/multi_area.vcproj deleted file mode 100644 index 7adb7a058..000000000 --- a/test/multi/algorithms/multi_area.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_centroid.vcproj b/test/multi/algorithms/multi_centroid.vcproj deleted file mode 100644 index b713a4452..000000000 --- a/test/multi/algorithms/multi_centroid.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_convert.vcproj b/test/multi/algorithms/multi_convert.vcproj deleted file mode 100644 index 4829412be..000000000 --- a/test/multi/algorithms/multi_convert.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_convex_hull.vcproj b/test/multi/algorithms/multi_convex_hull.vcproj deleted file mode 100644 index 839e71c7c..000000000 --- a/test/multi/algorithms/multi_convex_hull.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_correct.vcproj b/test/multi/algorithms/multi_correct.vcproj deleted file mode 100644 index cc280ffd7..000000000 --- a/test/multi/algorithms/multi_correct.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_covered_by.vcproj b/test/multi/algorithms/multi_covered_by.vcproj deleted file mode 100644 index 87a62a938..000000000 --- a/test/multi/algorithms/multi_covered_by.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_difference.cpp b/test/multi/algorithms/multi_difference.cpp index 893d3009b..35160437d 100644 --- a/test/multi/algorithms/multi_difference.cpp +++ b/test/multi/algorithms/multi_difference.cpp @@ -205,11 +205,16 @@ void test_all() int test_main(int, char* []) { - test_all >(); + test_all >(); -#ifdef HAVE_TTMATH +#if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) + test_all >(); + +#if defined(HAVE_TTMATH) std::cout << "Testing TTMATH" << std::endl; test_all >(); +#endif + #endif return 0; diff --git a/test/multi/algorithms/multi_difference.vcproj b/test/multi/algorithms/multi_difference.vcproj deleted file mode 100644 index 825789743..000000000 --- a/test/multi/algorithms/multi_difference.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_difference_spike.cpp b/test/multi/algorithms/multi_difference_spike.cpp new file mode 100644 index 000000000..07bf65ea5 --- /dev/null +++ b/test/multi/algorithms/multi_difference_spike.cpp @@ -0,0 +1,105 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// Unit Test + +// Copyright (c) 2013 Barend Gehrels, 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) + + +#include +#include +#include +#include + +#include + + +template +void test_spikes_in_ticket_8364() +{ + // See: https://svn.boost.org/trac/boost/ticket/8364 + //_TPolygon polygon( "MULTIPOLYGON(((1031 1056,3232 1056,3232 2856,1031 2856)))" ); + //polygon -= _TPolygon( "MULTIPOLYGON(((1032 1458,1032 1212,2136 2328,3234 2220,3234 2412,2136 2646)))" ); + //polygon -= _TPolygon( "MULTIPOLYGON(((1032 1764,1032 1458,2136 2646,3234 2412,3234 2532,2136 2790)))" ); + // RESULTS OF ABOVE IS USED IN STEP 3 BELOW + //polygon -= _TPolygon( "MULTIPOLYGON(((1032 2130,1032 1764,2052 2712)),((3234 2580,2558 2690,3234 2532)),((2558 2690,2136 2790,2052 2712,2136 2760)))" ); USED IN STEP 3 + //polygon -= _TPolygon( "MULTIPOLYGON(((1032 2556,1032 2130,1778 2556)),((3234 2580,2136 2760,1778 2556,3234 2556)))" ); USED IN STEP 4 + // NOTE: polygons below are closed and clockwise + + typedef typename bg::coordinate_type

::type ct; + typedef bg::model::polygon polygon; + typedef bg::model::multi_polygon multi_polygon; + + // The difference of polygons below result in a spike. The spike should be there, it is also generated in ttmath, + // and (e.g.) in SQL Server. However, using int-coordinates, the spike makes the polygon invalid. Therefore it is now (since August 2013) checked and removed. + + // So using int's, the spike is removed automatically. Therefore there is one polygon less, and less points. Also area differs + test_one("ticket_8364_step3", + "MULTIPOLYGON(((3232 2532,2136 2790,1032 1764,1032 1458,1032 1212,2136 2328,3232 2220,3232 1056,1031 1056,1031 2856,3232 2856,3232 2532)))", + "MULTIPOLYGON(((1032 2130,2052 2712,1032 1764,1032 2130)),((3234 2580,3234 2532,2558 2690,3234 2580)),((2558 2690,2136 2760,2052 2712,2136 2790,2558 2690)))", + if_typed(1, 2), + if_typed(15, 22), + if_typed(2775561.0, 2775256.487954), // SQL Server: 2775256.47588724 + 3, + 14, + if_typed(7710.5, 7810.487954)); // SQL Server: 7810.48711165739 + + test_one("ticket_8364_step4", + "MULTIPOLYGON(((2567 2688,2136 2790,2052 2712,1032 2130,1032 1764,1032 1458,1032 1212,2136 2328,3232 2220,3232 1056,1031 1056,1031 2856,3232 2856,3232 2580,2567 2688)))", + "MULTIPOLYGON(((1032 2556,1778 2556,1032 2130,1032 2556)),((3234 2580,3234 2556,1778 2556,2136 2760,3234 2580)))", + 1, + if_typed(17, 20), + if_typed(2616292.0, 2616029.559567), // SQL Server: 2616029.55616044 + 1, + if_typed(9, 11), + if_typed(160996.0, 161054.559567)); // SQL Server: 161054.560110092 +} + +template +void test_spikes_in_ticket_8365() +{ + // See: https://svn.boost.org/trac/boost/ticket/8365 + // NOTE: polygons below are closed and clockwise + + typedef typename bg::coordinate_type

::type ct; + typedef bg::model::polygon polygon; + typedef bg::model::multi_polygon multi_polygon; + + test_one("ticket_8365_step2", + "MULTIPOLYGON(((971 2704,971 1402,4640 1402,3912 1722,3180 2376,3912 1884,4643 1402,5395 1402,5395 3353,971 3353,971 2865,1704 3348)))", + "MULTIPOLYGON(((5388 1560,4650 1722,3912 1884,4650 1398)),((2442 3186,1704 3348,966 2700,1704 3024)))", + if_typed(1, 2), + if_typed(17, 21), + if_typed(7974930.5, 7975207.6047877), // SQL Server: + 2, + 9, + if_typed(199.0, 197.1047877)); // SQL Server: +} + + + + + +int test_main(int, char* []) +{ + test_spikes_in_ticket_8364, true, true>(); + test_spikes_in_ticket_8364, true, true>(); + test_spikes_in_ticket_8364, false, false>(); + test_spikes_in_ticket_8364, false, false>(); + + test_spikes_in_ticket_8365, true, true>(); + test_spikes_in_ticket_8365, true, true >(); + test_spikes_in_ticket_8365, false, false>(); + test_spikes_in_ticket_8365, false, false >(); + +#ifdef HAVE_TTMATH + std::cout << "Testing TTMATH" << std::endl; + test_spikes_in_ticket_8364, true, true>(); + test_spikes_in_ticket_8365, true, true>(); +#endif + + return 0; +} + diff --git a/test/multi/algorithms/multi_disjoint.vcproj b/test/multi/algorithms/multi_disjoint.vcproj deleted file mode 100644 index fb55ab325..000000000 --- a/test/multi/algorithms/multi_disjoint.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_distance.cpp b/test/multi/algorithms/multi_distance.cpp index 249598c91..0c932474a 100644 --- a/test/multi/algorithms/multi_distance.cpp +++ b/test/multi/algorithms/multi_distance.cpp @@ -74,7 +74,7 @@ void test_2d() test_distance("MULTILINESTRING((1 1,2 2),(1 0,2 0),(0 2,0 3))", "MULTIPOINT((0 0),(1 1))", 0.0); // Test with a strategy - bg::strategy::distance::pythagoras pyth; + bg::strategy::distance::pythagoras<> pyth; test_distance(pyth, "POINT(0 0)", "POINT(1 1)", sqrt(2.0)); test_distance(pyth, "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); test_distance(pyth, "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); @@ -116,18 +116,18 @@ void test_mixed() // Test with a strategy using namespace bg::strategy::distance; - test_distance(pythagoras(), "POINT(0 0)", "POINT(1 1)", sqrt(2.0)); + test_distance(pythagoras<>(), "POINT(0 0)", "POINT(1 1)", sqrt(2.0)); - test_distance(pythagoras(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); - test_distance(pythagoras(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); - test_distance(pythagoras(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); - test_distance(pythagoras(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); + test_distance(pythagoras<>(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); + test_distance(pythagoras<>(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); + test_distance(pythagoras<>(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); + test_distance(pythagoras<>(), "POINT(0 0)", "MULTIPOINT((1 1),(1 0),(0 2))", 1.0); // Most interesting: reversal AND a strategy (note that the stategy must be reversed automatically - test_distance(pythagoras(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); - test_distance(pythagoras(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); - test_distance(pythagoras(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); - test_distance(pythagoras(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); + test_distance(pythagoras<>(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); + test_distance(pythagoras<>(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); + test_distance(pythagoras<>(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); + test_distance(pythagoras<>(), "MULTIPOINT((1 1),(1 0),(0 2))", "POINT(0 0)", 1.0); } template diff --git a/test/multi/algorithms/multi_distance.vcproj b/test/multi/algorithms/multi_distance.vcproj deleted file mode 100644 index 7b3e77d28..000000000 --- a/test/multi/algorithms/multi_distance.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_envelope.vcproj b/test/multi/algorithms/multi_envelope.vcproj deleted file mode 100644 index 9d4db61af..000000000 --- a/test/multi/algorithms/multi_envelope.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_equals.vcproj b/test/multi/algorithms/multi_equals.vcproj deleted file mode 100644 index c35636018..000000000 --- a/test/multi/algorithms/multi_equals.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_for_each.vcproj b/test/multi/algorithms/multi_for_each.vcproj deleted file mode 100644 index 51c5b9667..000000000 --- a/test/multi/algorithms/multi_for_each.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_intersection.cpp b/test/multi/algorithms/multi_intersection.cpp index fc94811f8..4df030253 100644 --- a/test/multi/algorithms/multi_intersection.cpp +++ b/test/multi/algorithms/multi_intersection.cpp @@ -218,9 +218,14 @@ int test_main(int, char* []) { test_all >(); -#ifdef HAVE_TTMATH +#if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) + test_all >(); + +#if defined(HAVE_TTMATH) std::cout << "Testing TTMATH" << std::endl; test_all >(); +#endif + #endif return 0; diff --git a/test/multi/algorithms/multi_intersection.vcproj b/test/multi/algorithms/multi_intersection.vcproj deleted file mode 100644 index a286b038c..000000000 --- a/test/multi/algorithms/multi_intersection.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_length.vcproj b/test/multi/algorithms/multi_length.vcproj deleted file mode 100644 index 43967af1a..000000000 --- a/test/multi/algorithms/multi_length.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_num_geometries.vcproj b/test/multi/algorithms/multi_num_geometries.vcproj deleted file mode 100644 index c1beefad1..000000000 --- a/test/multi/algorithms/multi_num_geometries.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_num_interior_rings.vcproj b/test/multi/algorithms/multi_num_interior_rings.vcproj deleted file mode 100644 index 68c6ebf62..000000000 --- a/test/multi/algorithms/multi_num_interior_rings.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_num_points.vcproj b/test/multi/algorithms/multi_num_points.vcproj deleted file mode 100644 index 590d220c3..000000000 --- a/test/multi/algorithms/multi_num_points.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_perimeter.vcproj b/test/multi/algorithms/multi_perimeter.vcproj deleted file mode 100644 index 4059e83bb..000000000 --- a/test/multi/algorithms/multi_perimeter.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_reverse.vcproj b/test/multi/algorithms/multi_reverse.vcproj deleted file mode 100644 index 6afcee18e..000000000 --- a/test/multi/algorithms/multi_reverse.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_simplify.vcproj b/test/multi/algorithms/multi_simplify.vcproj deleted file mode 100644 index e4d11963a..000000000 --- a/test/multi/algorithms/multi_simplify.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_touches.vcproj b/test/multi/algorithms/multi_touches.vcproj deleted file mode 100644 index 05468f6cd..000000000 --- a/test/multi/algorithms/multi_touches.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_transform.cpp b/test/multi/algorithms/multi_transform.cpp index dddb01c45..9c0002583 100644 --- a/test/multi/algorithms/multi_transform.cpp +++ b/test/multi/algorithms/multi_transform.cpp @@ -39,12 +39,13 @@ template void test_transform(std::string const& wkt, std::string const& expected) { - typedef typename bg::point_type::type point_type; + typedef typename bg::coordinate_type::type coordinate_type; + const std::size_t dim = bg::dimension::value; Geometry geometry_in, geometry_out; bg::read_wkt(wkt, geometry_in); bg::transform(geometry_in, geometry_out, - bg::strategy::transform::scale_transformer(2, 2)); + bg::strategy::transform::scale_transformer(2, 2)); std::ostringstream detected; detected << bg::wkt(geometry_out); BOOST_CHECK_EQUAL(detected.str(), expected); diff --git a/test/multi/algorithms/multi_transform.vcproj b/test/multi/algorithms/multi_transform.vcproj deleted file mode 100644 index 543890ffb..000000000 --- a/test/multi/algorithms/multi_transform.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_union.cpp b/test/multi/algorithms/multi_union.cpp index 5cbe1e7a7..e97e9fb43 100644 --- a/test/multi/algorithms/multi_union.cpp +++ b/test/multi/algorithms/multi_union.cpp @@ -140,9 +140,14 @@ int test_main(int, char* []) { test_all >(); -#ifdef HAVE_TTMATH +#if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) + test_all >(); + +#if defined(HAVE_TTMATH) std::cout << "Testing TTMATH" << std::endl; test_all >(); +#endif + #endif return 0; diff --git a/test/multi/algorithms/multi_union.vcproj b/test/multi/algorithms/multi_union.vcproj deleted file mode 100644 index 9adb10145..000000000 --- a/test/multi/algorithms/multi_union.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_unique.vcproj b/test/multi/algorithms/multi_unique.vcproj deleted file mode 100644 index d6a662b10..000000000 --- a/test/multi/algorithms/multi_unique.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/multi_within.vcproj b/test/multi/algorithms/multi_within.vcproj deleted file mode 100644 index f5d6ad350..000000000 --- a/test/multi/algorithms/multi_within.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/algorithms/overlay/multi_overlay.sln b/test/multi/algorithms/overlay/multi_overlay.sln deleted file mode 100644 index ecb94cc33..000000000 --- a/test/multi/algorithms/overlay/multi_overlay.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_traverse", "multi_traverse.vcproj", "{DB00BBA3-4959-4F9E-A235-E487FF766207}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DB00BBA3-4959-4F9E-A235-E487FF766207}.Debug|Win32.ActiveCfg = Debug|Win32 - {DB00BBA3-4959-4F9E-A235-E487FF766207}.Debug|Win32.Build.0 = Debug|Win32 - {DB00BBA3-4959-4F9E-A235-E487FF766207}.Release|Win32.ActiveCfg = Release|Win32 - {DB00BBA3-4959-4F9E-A235-E487FF766207}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/multi/algorithms/overlay/multi_traverse.vcproj b/test/multi/algorithms/overlay/multi_traverse.vcproj deleted file mode 100644 index c4cb7b8e0..000000000 --- a/test/multi/algorithms/overlay/multi_traverse.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/io/dsv/dsv.sln b/test/multi/io/dsv/dsv.sln deleted file mode 100644 index ecea59719..000000000 --- a/test/multi/io/dsv/dsv.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{6CD4A68C-3EA1-11E1-B9E4-BF144924019B}") = "dsv", "dsv.vcproj", "{7463ED40-3EA1-11E1-9FC7-D0144924019B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7463ED40-3EA1-11E1-9FC7-D0144924019B}.Debug|Win32.ActiveCfg = Debug|Win32 - {7463ED40-3EA1-11E1-9FC7-D0144924019B}.Debug|Win32.Build.0 = Debug|Win32 - {7463ED40-3EA1-11E1-9FC7-D0144924019B}.Release|Win32.ActiveCfg = Release|Win32 - {7463ED40-3EA1-11E1-9FC7-D0144924019B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/multi/io/dsv/dsv.vcproj b/test/multi/io/dsv/dsv.vcproj deleted file mode 100644 index 494551daa..000000000 --- a/test/multi/io/dsv/dsv.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/io/wkt/io_wkt_tests.sln b/test/multi/io/wkt/io_wkt_tests.sln deleted file mode 100644 index a804d533a..000000000 --- a/test/multi/io/wkt/io_wkt_tests.sln +++ /dev/null @@ -1,27 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wkt", "wkt.vcproj", "{CA8D5E44-7D8F-44A1-900C-35C28890299B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Debug|Win32.ActiveCfg = Debug|Win32 - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Debug|Win32.Build.0 = Debug|Win32 - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Release|Win32.ActiveCfg = Release|Win32 - {1FA2ADE2-F649-4245-951E-A8F5935E7127}.Release|Win32.Build.0 = Release|Win32 - {F2A680B0-F6FC-479E-9988-24CF6851C13C}.Debug|Win32.ActiveCfg = Debug|Win32 - {F2A680B0-F6FC-479E-9988-24CF6851C13C}.Debug|Win32.Build.0 = Debug|Win32 - {F2A680B0-F6FC-479E-9988-24CF6851C13C}.Release|Win32.ActiveCfg = Release|Win32 - {F2A680B0-F6FC-479E-9988-24CF6851C13C}.Release|Win32.Build.0 = Release|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Debug|Win32.ActiveCfg = Debug|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Debug|Win32.Build.0 = Debug|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Release|Win32.ActiveCfg = Release|Win32 - {CA8D5E44-7D8F-44A1-900C-35C28890299B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/multi/io/wkt/wkt.vcproj b/test/multi/io/wkt/wkt.vcproj deleted file mode 100644 index c8150e853..000000000 --- a/test/multi/io/wkt/wkt.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/multi/multi_tests.sln b/test/multi/multi_tests.sln deleted file mode 100644 index abfef0161..000000000 --- a/test/multi/multi_tests.sln +++ /dev/null @@ -1,163 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_within", "algorithms\multi_within.vcproj", "{CA8D5E44-7D8F-44A1-901C-35C28890299B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_distance", "algorithms\multi_distance.vcproj", "{D770F3E8-0567-4EDD-91FC-20BA402A3F74}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_convex_hull", "algorithms\multi_convex_hull.vcproj", "{B810C404-C4D9-4A6A-96B0-1DCED269D65D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_envelope", "algorithms\multi_envelope.vcproj", "{85385CF0-240C-4900-B5EA-E34D2415A18F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_centroid", "algorithms\multi_centroid.vcproj", "{7EE302E1-7FCF-4E9E-8DB3-36EA4D88B6CA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_correct", "algorithms\multi_correct.vcproj", "{DFB00B88-2ED8-49CA-B739-7C8A8602D681}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_simplify", "algorithms\multi_simplify.vcproj", "{76A74CE4-EBF8-4F8A-98B7-1AF607B2B68C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_for_each", "algorithms\multi_for_each.vcproj", "{B016FE33-D587-45C6-8444-607839BB2C2D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_area", "algorithms\multi_area.vcproj", "{691082ED-2778-4300-9860-42DFBBABE535}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_length", "algorithms\multi_length.vcproj", "{9087BA6C-7563-41E6-90AD-F60BC58DDC17}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_perimeter", "algorithms\multi_perimeter.vcproj", "{D91C3F39-B8A5-4EB9-A7A8-D72B297DCFBF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_intersection", "algorithms\multi_intersection.vcproj", "{FFB78F24-7999-4416-BDED-9C35A3DDF32D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_union", "algorithms\multi_union.vcproj", "{1A8443BE-2666-4D6B-B4BC-6A7B7DD224B0}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_equals", "algorithms\multi_equals.vcproj", "{AA0EFD64-E034-421A-BD4A-E5A336D95C30}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_reverse", "algorithms\multi_reverse.vcproj", "{698BE05D-43E2-4BF5-B7FD-48BE3EE7BC21}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_unique", "algorithms\multi_unique.vcproj", "{71879D37-84A8-4949-8CDB-212982F81D80}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_num_geometries", "algorithms\multi_num_geometries.vcproj", "{8DB68EB9-07CA-4705-859E-B1A7098B5CF3}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_num_points", "algorithms\multi_num_points.vcproj", "{EA4B2EB3-1FBA-42BE-B7D7-5A517BC74E2B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_num_interior_rings", "algorithms\multi_num_interior_rings.vcproj", "{3F8E4B3A-43D5-49ED-89F6-C6D1CF609B02}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_difference", "algorithms\multi_difference.vcproj", "{7F85B87A-48A6-47BD-A08C-AB12AEA56582}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_transform", "algorithms\multi_transform.vcproj", "{64985954-0A74-46F5-908F-865E905C3414}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_covered_by", "algorithms\multi_covered_by.vcproj", "{680E56F0-229C-4377-BDC0-80EB9B59314B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_convert", "algorithms\multi_convert.vcproj", "{21B7EF55-23C3-4FD2-9F2F-FD8F0F3FE167}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_disjoint", "algorithms\multi_disjoint.vcproj", "{5DEA6558-9DF7-42D4-AF10-4D6D8BB7EAD1}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "multi_touches", "algorithms\multi_touches.vcproj", "{108173B8-B6F4-4366-8018-2BF282ED4881}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CA8D5E44-7D8F-44A1-901C-35C28890299B}.Debug|Win32.ActiveCfg = Debug|Win32 - {CA8D5E44-7D8F-44A1-901C-35C28890299B}.Debug|Win32.Build.0 = Debug|Win32 - {CA8D5E44-7D8F-44A1-901C-35C28890299B}.Release|Win32.ActiveCfg = Release|Win32 - {CA8D5E44-7D8F-44A1-901C-35C28890299B}.Release|Win32.Build.0 = Release|Win32 - {D770F3E8-0567-4EDD-91FC-20BA402A3F74}.Debug|Win32.ActiveCfg = Debug|Win32 - {D770F3E8-0567-4EDD-91FC-20BA402A3F74}.Debug|Win32.Build.0 = Debug|Win32 - {D770F3E8-0567-4EDD-91FC-20BA402A3F74}.Release|Win32.ActiveCfg = Release|Win32 - {D770F3E8-0567-4EDD-91FC-20BA402A3F74}.Release|Win32.Build.0 = Release|Win32 - {B810C404-C4D9-4A6A-96B0-1DCED269D65D}.Debug|Win32.ActiveCfg = Debug|Win32 - {B810C404-C4D9-4A6A-96B0-1DCED269D65D}.Debug|Win32.Build.0 = Debug|Win32 - {B810C404-C4D9-4A6A-96B0-1DCED269D65D}.Release|Win32.ActiveCfg = Release|Win32 - {B810C404-C4D9-4A6A-96B0-1DCED269D65D}.Release|Win32.Build.0 = Release|Win32 - {85385CF0-240C-4900-B5EA-E34D2415A18F}.Debug|Win32.ActiveCfg = Debug|Win32 - {85385CF0-240C-4900-B5EA-E34D2415A18F}.Debug|Win32.Build.0 = Debug|Win32 - {85385CF0-240C-4900-B5EA-E34D2415A18F}.Release|Win32.ActiveCfg = Release|Win32 - {85385CF0-240C-4900-B5EA-E34D2415A18F}.Release|Win32.Build.0 = Release|Win32 - {7EE302E1-7FCF-4E9E-8DB3-36EA4D88B6CA}.Debug|Win32.ActiveCfg = Debug|Win32 - {7EE302E1-7FCF-4E9E-8DB3-36EA4D88B6CA}.Debug|Win32.Build.0 = Debug|Win32 - {7EE302E1-7FCF-4E9E-8DB3-36EA4D88B6CA}.Release|Win32.ActiveCfg = Release|Win32 - {7EE302E1-7FCF-4E9E-8DB3-36EA4D88B6CA}.Release|Win32.Build.0 = Release|Win32 - {DFB00B88-2ED8-49CA-B739-7C8A8602D681}.Debug|Win32.ActiveCfg = Debug|Win32 - {DFB00B88-2ED8-49CA-B739-7C8A8602D681}.Debug|Win32.Build.0 = Debug|Win32 - {DFB00B88-2ED8-49CA-B739-7C8A8602D681}.Release|Win32.ActiveCfg = Release|Win32 - {DFB00B88-2ED8-49CA-B739-7C8A8602D681}.Release|Win32.Build.0 = Release|Win32 - {76A74CE4-EBF8-4F8A-98B7-1AF607B2B68C}.Debug|Win32.ActiveCfg = Debug|Win32 - {76A74CE4-EBF8-4F8A-98B7-1AF607B2B68C}.Debug|Win32.Build.0 = Debug|Win32 - {76A74CE4-EBF8-4F8A-98B7-1AF607B2B68C}.Release|Win32.ActiveCfg = Release|Win32 - {76A74CE4-EBF8-4F8A-98B7-1AF607B2B68C}.Release|Win32.Build.0 = Release|Win32 - {B016FE33-D587-45C6-8444-607839BB2C2D}.Debug|Win32.ActiveCfg = Debug|Win32 - {B016FE33-D587-45C6-8444-607839BB2C2D}.Debug|Win32.Build.0 = Debug|Win32 - {B016FE33-D587-45C6-8444-607839BB2C2D}.Release|Win32.ActiveCfg = Release|Win32 - {B016FE33-D587-45C6-8444-607839BB2C2D}.Release|Win32.Build.0 = Release|Win32 - {691082ED-2778-4300-9860-42DFBBABE535}.Debug|Win32.ActiveCfg = Debug|Win32 - {691082ED-2778-4300-9860-42DFBBABE535}.Debug|Win32.Build.0 = Debug|Win32 - {691082ED-2778-4300-9860-42DFBBABE535}.Release|Win32.ActiveCfg = Release|Win32 - {691082ED-2778-4300-9860-42DFBBABE535}.Release|Win32.Build.0 = Release|Win32 - {9087BA6C-7563-41E6-90AD-F60BC58DDC17}.Debug|Win32.ActiveCfg = Debug|Win32 - {9087BA6C-7563-41E6-90AD-F60BC58DDC17}.Debug|Win32.Build.0 = Debug|Win32 - {9087BA6C-7563-41E6-90AD-F60BC58DDC17}.Release|Win32.ActiveCfg = Release|Win32 - {9087BA6C-7563-41E6-90AD-F60BC58DDC17}.Release|Win32.Build.0 = Release|Win32 - {D91C3F39-B8A5-4EB9-A7A8-D72B297DCFBF}.Debug|Win32.ActiveCfg = Debug|Win32 - {D91C3F39-B8A5-4EB9-A7A8-D72B297DCFBF}.Debug|Win32.Build.0 = Debug|Win32 - {D91C3F39-B8A5-4EB9-A7A8-D72B297DCFBF}.Release|Win32.ActiveCfg = Release|Win32 - {D91C3F39-B8A5-4EB9-A7A8-D72B297DCFBF}.Release|Win32.Build.0 = Release|Win32 - {FFB78F24-7999-4416-BDED-9C35A3DDF32D}.Debug|Win32.ActiveCfg = Debug|Win32 - {FFB78F24-7999-4416-BDED-9C35A3DDF32D}.Debug|Win32.Build.0 = Debug|Win32 - {FFB78F24-7999-4416-BDED-9C35A3DDF32D}.Release|Win32.ActiveCfg = Release|Win32 - {FFB78F24-7999-4416-BDED-9C35A3DDF32D}.Release|Win32.Build.0 = Release|Win32 - {1A8443BE-2666-4D6B-B4BC-6A7B7DD224B0}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A8443BE-2666-4D6B-B4BC-6A7B7DD224B0}.Debug|Win32.Build.0 = Debug|Win32 - {1A8443BE-2666-4D6B-B4BC-6A7B7DD224B0}.Release|Win32.ActiveCfg = Release|Win32 - {1A8443BE-2666-4D6B-B4BC-6A7B7DD224B0}.Release|Win32.Build.0 = Release|Win32 - {AA0EFD64-E034-421A-BD4A-E5A336D95C30}.Debug|Win32.ActiveCfg = Debug|Win32 - {AA0EFD64-E034-421A-BD4A-E5A336D95C30}.Debug|Win32.Build.0 = Debug|Win32 - {AA0EFD64-E034-421A-BD4A-E5A336D95C30}.Release|Win32.ActiveCfg = Release|Win32 - {AA0EFD64-E034-421A-BD4A-E5A336D95C30}.Release|Win32.Build.0 = Release|Win32 - {698BE05D-43E2-4BF5-B7FD-48BE3EE7BC21}.Debug|Win32.ActiveCfg = Debug|Win32 - {698BE05D-43E2-4BF5-B7FD-48BE3EE7BC21}.Debug|Win32.Build.0 = Debug|Win32 - {698BE05D-43E2-4BF5-B7FD-48BE3EE7BC21}.Release|Win32.ActiveCfg = Release|Win32 - {698BE05D-43E2-4BF5-B7FD-48BE3EE7BC21}.Release|Win32.Build.0 = Release|Win32 - {71879D37-84A8-4949-8CDB-212982F81D80}.Debug|Win32.ActiveCfg = Debug|Win32 - {71879D37-84A8-4949-8CDB-212982F81D80}.Debug|Win32.Build.0 = Debug|Win32 - {71879D37-84A8-4949-8CDB-212982F81D80}.Release|Win32.ActiveCfg = Release|Win32 - {71879D37-84A8-4949-8CDB-212982F81D80}.Release|Win32.Build.0 = Release|Win32 - {8DB68EB9-07CA-4705-859E-B1A7098B5CF3}.Debug|Win32.ActiveCfg = Debug|Win32 - {8DB68EB9-07CA-4705-859E-B1A7098B5CF3}.Debug|Win32.Build.0 = Debug|Win32 - {8DB68EB9-07CA-4705-859E-B1A7098B5CF3}.Release|Win32.ActiveCfg = Release|Win32 - {8DB68EB9-07CA-4705-859E-B1A7098B5CF3}.Release|Win32.Build.0 = Release|Win32 - {EA4B2EB3-1FBA-42BE-B7D7-5A517BC74E2B}.Debug|Win32.ActiveCfg = Debug|Win32 - {EA4B2EB3-1FBA-42BE-B7D7-5A517BC74E2B}.Debug|Win32.Build.0 = Debug|Win32 - {EA4B2EB3-1FBA-42BE-B7D7-5A517BC74E2B}.Release|Win32.ActiveCfg = Release|Win32 - {EA4B2EB3-1FBA-42BE-B7D7-5A517BC74E2B}.Release|Win32.Build.0 = Release|Win32 - {3F8E4B3A-43D5-49ED-89F6-C6D1CF609B02}.Debug|Win32.ActiveCfg = Debug|Win32 - {3F8E4B3A-43D5-49ED-89F6-C6D1CF609B02}.Debug|Win32.Build.0 = Debug|Win32 - {3F8E4B3A-43D5-49ED-89F6-C6D1CF609B02}.Release|Win32.ActiveCfg = Release|Win32 - {3F8E4B3A-43D5-49ED-89F6-C6D1CF609B02}.Release|Win32.Build.0 = Release|Win32 - {7F85B87A-48A6-47BD-A08C-AB12AEA56582}.Debug|Win32.ActiveCfg = Debug|Win32 - {7F85B87A-48A6-47BD-A08C-AB12AEA56582}.Debug|Win32.Build.0 = Debug|Win32 - {7F85B87A-48A6-47BD-A08C-AB12AEA56582}.Release|Win32.ActiveCfg = Release|Win32 - {7F85B87A-48A6-47BD-A08C-AB12AEA56582}.Release|Win32.Build.0 = Release|Win32 - {64985954-0A74-46F5-908F-865E905C3414}.Debug|Win32.ActiveCfg = Debug|Win32 - {64985954-0A74-46F5-908F-865E905C3414}.Debug|Win32.Build.0 = Debug|Win32 - {64985954-0A74-46F5-908F-865E905C3414}.Release|Win32.ActiveCfg = Release|Win32 - {64985954-0A74-46F5-908F-865E905C3414}.Release|Win32.Build.0 = Release|Win32 - {680E56F0-229C-4377-BDC0-80EB9B59314B}.Debug|Win32.ActiveCfg = Debug|Win32 - {680E56F0-229C-4377-BDC0-80EB9B59314B}.Debug|Win32.Build.0 = Debug|Win32 - {680E56F0-229C-4377-BDC0-80EB9B59314B}.Release|Win32.ActiveCfg = Release|Win32 - {680E56F0-229C-4377-BDC0-80EB9B59314B}.Release|Win32.Build.0 = Release|Win32 - {21B7EF55-23C3-4FD2-9F2F-FD8F0F3FE167}.Debug|Win32.ActiveCfg = Debug|Win32 - {21B7EF55-23C3-4FD2-9F2F-FD8F0F3FE167}.Debug|Win32.Build.0 = Debug|Win32 - {21B7EF55-23C3-4FD2-9F2F-FD8F0F3FE167}.Release|Win32.ActiveCfg = Release|Win32 - {21B7EF55-23C3-4FD2-9F2F-FD8F0F3FE167}.Release|Win32.Build.0 = Release|Win32 - {5DEA6558-9DF7-42D4-AF10-4D6D8BB7EAD1}.Debug|Win32.ActiveCfg = Debug|Win32 - {5DEA6558-9DF7-42D4-AF10-4D6D8BB7EAD1}.Debug|Win32.Build.0 = Debug|Win32 - {5DEA6558-9DF7-42D4-AF10-4D6D8BB7EAD1}.Release|Win32.ActiveCfg = Release|Win32 - {5DEA6558-9DF7-42D4-AF10-4D6D8BB7EAD1}.Release|Win32.Build.0 = Release|Win32 - {108173B8-B6F4-4366-8018-2BF282ED4881}.Debug|Win32.ActiveCfg = Debug|Win32 - {108173B8-B6F4-4366-8018-2BF282ED4881}.Debug|Win32.Build.0 = Debug|Win32 - {108173B8-B6F4-4366-8018-2BF282ED4881}.Release|Win32.ActiveCfg = Release|Win32 - {108173B8-B6F4-4366-8018-2BF282ED4881}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/policies/compare.vcproj b/test/policies/compare.vcproj deleted file mode 100644 index 916e6d72b..000000000 --- a/test/policies/compare.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/policies/policy_tests.sln b/test/policies/policy_tests.sln deleted file mode 100644 index 16917fd38..000000000 --- a/test/policies/policy_tests.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "compare", "compare.vcproj", "{71AFA3C2-6873-4368-81D9-CA305A43B458}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {71AFA3C2-6873-4368-81D9-CA305A43B458}.Debug|Win32.ActiveCfg = Debug|Win32 - {71AFA3C2-6873-4368-81D9-CA305A43B458}.Debug|Win32.Build.0 = Debug|Win32 - {71AFA3C2-6873-4368-81D9-CA305A43B458}.Release|Win32.ActiveCfg = Release|Win32 - {71AFA3C2-6873-4368-81D9-CA305A43B458}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/robustness/convex_hull/random_multi_points.sln b/test/robustness/convex_hull/random_multi_points.sln deleted file mode 100644 index 1261464c0..000000000 --- a/test/robustness/convex_hull/random_multi_points.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "random_multi_points", "random_multi_points.vcproj", "{334B6950-6F92-4FA3-9A82-ED6E3B19BB2C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {334B6950-6F92-4FA3-9A82-ED6E3B19BB2C}.Debug|Win32.ActiveCfg = Debug|Win32 - {334B6950-6F92-4FA3-9A82-ED6E3B19BB2C}.Debug|Win32.Build.0 = Debug|Win32 - {334B6950-6F92-4FA3-9A82-ED6E3B19BB2C}.Release|Win32.ActiveCfg = Release|Win32 - {334B6950-6F92-4FA3-9A82-ED6E3B19BB2C}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/robustness/convex_hull/random_multi_points.vcproj b/test/robustness/convex_hull/random_multi_points.vcproj deleted file mode 100644 index 3db9cd3be..000000000 --- a/test/robustness/convex_hull/random_multi_points.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/robustness/overlay/buffer/recursive_polygons_buffer.sln b/test/robustness/overlay/buffer/recursive_polygons_buffer.sln deleted file mode 100644 index 6e8c2574f..000000000 --- a/test/robustness/overlay/buffer/recursive_polygons_buffer.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recursive_polygons_buffer", "recursive_polygons_buffer.vcxproj", "{02C9CFA4-C625-55CA-1C8E-2B96EBB09FE8}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {02C9CFA4-C625-55CA-1C8E-2B96EBB09FE8}.Debug|Win32.ActiveCfg = Debug|Win32 - {02C9CFA4-C625-55CA-1C8E-2B96EBB09FE8}.Debug|Win32.Build.0 = Debug|Win32 - {02C9CFA4-C625-55CA-1C8E-2B96EBB09FE8}.Release|Win32.ActiveCfg = Release|Win32 - {02C9CFA4-C625-55CA-1C8E-2B96EBB09FE8}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/robustness/overlay/buffer/recursive_polygons_buffer.vcproj b/test/robustness/overlay/buffer/recursive_polygons_buffer.vcproj deleted file mode 100644 index 3cc4a384f..000000000 --- a/test/robustness/overlay/buffer/recursive_polygons_buffer.vcproj +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.sln b/test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.sln deleted file mode 100644 index 5865e1c36..000000000 --- a/test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recursive_polygons_linear_areal", "recursive_polygons_linear_areal.vcproj", "{1E269699-9450-4DD6-ACC3-C6A9AD2FC6E0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1E269699-9450-4DD6-ACC3-C6A9AD2FC6E0}.Debug|Win32.ActiveCfg = Debug|Win32 - {1E269699-9450-4DD6-ACC3-C6A9AD2FC6E0}.Debug|Win32.Build.0 = Debug|Win32 - {1E269699-9450-4DD6-ACC3-C6A9AD2FC6E0}.Release|Win32.ActiveCfg = Release|Win32 - {1E269699-9450-4DD6-ACC3-C6A9AD2FC6E0}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.vcproj b/test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.vcproj deleted file mode 100644 index 14e8dd6fd..000000000 --- a/test/robustness/overlay/linear_areal/recursive_polygons_linear_areal.vcproj +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/cross_track.cpp b/test/strategies/cross_track.cpp index 38840dc72..2d3b031de 100644 --- a/test/strategies/cross_track.cpp +++ b/test/strategies/cross_track.cpp @@ -46,18 +46,20 @@ void test_distance( { typedef bg::strategy::distance::cross_track < - Point, - Point + typename bg::coordinate_type::type > strategy_type; + typedef typename bg::strategy::distance::services::return_type < - strategy_type + strategy_type, + Point, + Point >::type return_type; BOOST_CONCEPT_ASSERT ( - (bg::concept::PointSegmentDistanceStrategy) + (bg::concept::PointSegmentDistanceStrategy) ); @@ -72,6 +74,10 @@ void test_distance( BOOST_CHECK_CLOSE(radius * d, expected, tolerance); + // The strategy should return the same result if we reverse the parameters + d = strategy.apply(p1, p3, p2); + BOOST_CHECK_CLOSE(radius * d, expected, tolerance); + // Test specifying radius explicitly strategy_type strategy_radius(radius); d = strategy_radius.apply(p1, p2, p3); diff --git a/test/strategies/cross_track.vcproj b/test/strategies/cross_track.vcproj deleted file mode 100644 index e51666fca..000000000 --- a/test/strategies/cross_track.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/haversine.cpp b/test/strategies/haversine.cpp index 9468810b8..b95ed9a0f 100644 --- a/test/strategies/haversine.cpp +++ b/test/strategies/haversine.cpp @@ -37,25 +37,17 @@ double const average_earth_radius = 6372795.0; template struct test_distance { - typedef bg::strategy::distance::haversine - < - Point, - Point - > haversine_type; - - BOOST_CONCEPT_ASSERT( (bg::concept::PointDistanceStrategy) ); - - - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef bg::strategy::distance::haversine haversine_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; BOOST_CONCEPT_ASSERT ( - (bg::concept::PointDistanceStrategy) + (bg::concept::PointDistanceStrategy) ); static void test(double lon1, double lat1, double lon2, double lat2, - double radius, return_type expected, double tolerance) + double radius, double expected, double tolerance) { haversine_type strategy(radius); @@ -117,21 +109,15 @@ void test_services() // 1: normal, calculate distance: - typedef bgsd::haversine strategy_type; - typedef typename bgsd::services::return_type::type return_type; + typedef bgsd::haversine strategy_type; + typedef typename bgsd::services::return_type::type return_type; strategy_type strategy(average_earth_radius); return_type result = strategy.apply(p1, p2); BOOST_CHECK_CLOSE(result, return_type(expected), 0.001); - // 2: "similar" to construct a similar strategy (similar but with other template-parameters) for, e.g., the reverse P2/P1 - // 2a: similar_type: - typedef typename services::similar_type::type similar_type; - // 2b: get_similar - similar_type similar = services::get_similar::apply(strategy); - - //result = similar.apply(p1, p2); // should NOT compile because p1/p2 should also be reversed here - result = similar.apply(p2, p1); + // 2: the strategy should return the same result if we reverse parameters + result = strategy.apply(p2, p1); BOOST_CHECK_CLOSE(result, return_type(expected), 0.001); @@ -149,14 +135,14 @@ void test_services() // First the result of the comparable strategy return_type c_result = comparable.apply(p1, p2); // Second the comparable result of the expected distance - return_type c_expected = services::result_from_distance::apply(comparable, expected); + return_type c_expected = services::result_from_distance::apply(comparable, expected); // And that one should be equa. BOOST_CHECK_CLOSE(c_result, return_type(c_expected), 0.001); // 4: the comparable_type should have a distance_strategy_constructor as well, // knowing how to compare something with a fixed distance - return_type c_dist_lower = services::result_from_distance::apply(comparable, expected_lower); - return_type c_dist_higher = services::result_from_distance::apply(comparable, expected_higher); + return_type c_dist_lower = services::result_from_distance::apply(comparable, expected_lower); + return_type c_dist_higher = services::result_from_distance::apply(comparable, expected_higher); // If this is the case: BOOST_CHECK(c_dist_lower < c_result && c_result < c_dist_higher); @@ -166,8 +152,8 @@ void test_services() BOOST_CHECK_CLOSE(c_check, expected, 0.001); // This should also be the case - return_type dist_lower = services::result_from_distance::apply(strategy, expected_lower); - return_type dist_higher = services::result_from_distance::apply(strategy, expected_higher); + return_type dist_lower = services::result_from_distance::apply(strategy, expected_lower); + return_type dist_higher = services::result_from_distance::apply(strategy, expected_higher); BOOST_CHECK(dist_lower < result && result < dist_higher); } @@ -194,8 +180,8 @@ void time_compare_s(int const n) template void time_compare(int const n) { - time_compare_s >(n); - time_compare_s >(n); + time_compare_s >(n); + time_compare_s >(n); } #include diff --git a/test/strategies/haversine.vcproj b/test/strategies/haversine.vcproj deleted file mode 100644 index 31ac6291d..000000000 --- a/test/strategies/haversine.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/projected_point.cpp b/test/strategies/projected_point.cpp index 11ea749a1..fde126a20 100644 --- a/test/strategies/projected_point.cpp +++ b/test/strategies/projected_point.cpp @@ -52,23 +52,18 @@ void test_services() namespace services = bg::strategy::distance::services; // 1: normal, calculate distance: - typedef bgsd::projected_point strategy_type; + typedef bgsd::projected_point strategy_type; - BOOST_CONCEPT_ASSERT( (bg::concept::PointSegmentDistanceStrategy) ); + BOOST_CONCEPT_ASSERT( (bg::concept::PointSegmentDistanceStrategy) ); - typedef typename services::return_type::type return_type; + typedef typename services::return_type::type return_type; strategy_type strategy; return_type result = strategy.apply(p, p1, p2); BOOST_CHECK_CLOSE(result, return_type(expected), 0.001); - // 2: "similar" to construct a similar strategy (similar but with other template-parameters) for, e.g., the reverse P2/P1 - // 2a: similar_type: - typedef typename services::similar_type::type similar_type; - // 2b: get_similar - similar_type similar = services::get_similar::apply(strategy); - - result = similar.apply(p, p1, p2); + // 2: the strategy should return the same result if we reverse parameters + result = strategy.apply(p, p1, p2); BOOST_CHECK_CLOSE(result, return_type(expected), 0.001); @@ -100,19 +95,15 @@ void test_all_2d(std::string const& wkt_p, bg::read_wkt(wkt_sp2, sp2); { - typedef bg::strategy::distance::projected_point - < - P1, - P2 - > strategy_type; + typedef bg::strategy::distance::projected_point<> strategy_type; BOOST_CONCEPT_ASSERT ( - (bg::concept::PointSegmentDistanceStrategy) + (bg::concept::PointSegmentDistanceStrategy) ); strategy_type strategy; - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; return_type d = strategy.apply(p, sp1, sp2); BOOST_CHECK_CLOSE(d, expected_distance, 0.001); } @@ -121,13 +112,11 @@ void test_all_2d(std::string const& wkt_p, { typedef bg::strategy::distance::projected_point < - P1, - P2, void, - bg::strategy::distance::comparable::pythagoras + bg::strategy::distance::comparable::pythagoras<> > strategy_type; strategy_type strategy; - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; return_type d = strategy.apply(p, sp1, sp2); T expected_squared_distance = expected_distance * expected_distance; BOOST_CHECK_CLOSE(d, expected_squared_distance, 0.01); diff --git a/test/strategies/projected_point.vcproj b/test/strategies/projected_point.vcproj deleted file mode 100644 index 0964383bf..000000000 --- a/test/strategies/projected_point.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/pythagoras.cpp b/test/strategies/pythagoras.cpp index 2b1f42886..c250d88c0 100644 --- a/test/strategies/pythagoras.cpp +++ b/test/strategies/pythagoras.cpp @@ -51,8 +51,8 @@ void test_null_distance_3d() P2 p2; bg::assign_values(p2, 1, 2, 3); - typedef bg::strategy::distance::pythagoras pythagoras_type; - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef bg::strategy::distance::pythagoras<> pythagoras_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; pythagoras_type pythagoras; return_type result = pythagoras.apply(p1, p2); @@ -68,8 +68,8 @@ void test_axis_3d() P2 p2; bg::assign_values(p2, 1, 0, 0); - typedef bg::strategy::distance::pythagoras pythagoras_type; - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef bg::strategy::distance::pythagoras<> pythagoras_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; pythagoras_type pythagoras; @@ -94,8 +94,8 @@ void test_arbitrary_3d() bg::assign_values(p2, 9, 8, 7); { - typedef bg::strategy::distance::pythagoras strategy_type; - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef bg::strategy::distance::pythagoras<> strategy_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; strategy_type strategy; return_type result = strategy.apply(p1, p2); @@ -104,8 +104,8 @@ void test_arbitrary_3d() { // Check comparable distance - typedef bg::strategy::distance::comparable::pythagoras strategy_type; - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef bg::strategy::distance::comparable::pythagoras<> strategy_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; strategy_type strategy; return_type result = strategy.apply(p1, p2); @@ -137,24 +137,18 @@ void test_services() // 1: normal, calculate distance: - typedef bgsd::pythagoras strategy_type; + typedef bgsd::pythagoras strategy_type; - BOOST_CONCEPT_ASSERT( (bg::concept::PointDistanceStrategy) ); + BOOST_CONCEPT_ASSERT( (bg::concept::PointDistanceStrategy) ); - typedef typename bgsd::services::return_type::type return_type; + typedef typename bgsd::services::return_type::type return_type; strategy_type strategy; return_type result = strategy.apply(p1, p2); BOOST_CHECK_CLOSE(result, return_type(expected), 0.001); - // 2: "similar" to construct a similar strategy (similar but with other template-parameters) for, e.g., the reverse P2/P1 - // 2a: similar_type: - typedef typename services::similar_type::type similar_type; - // 2b: get_similar - similar_type similar = services::get_similar::apply(strategy); - - //result = similar.apply(p1, p2); // should NOT compile because p1/p2 should also be reversed here - result = similar.apply(p2, p1); + // 2: the strategy should return the same result if we reverse parameters + result = strategy.apply(p2, p1); BOOST_CHECK_CLOSE(result, return_type(expected), 0.001); @@ -173,15 +167,15 @@ void test_services() // 4: the comparable_type should have a distance_strategy_constructor as well, // knowing how to compare something with a fixed distance - return_type c_dist5 = services::result_from_distance::apply(comparable, 5.0); - return_type c_dist6 = services::result_from_distance::apply(comparable, 6.0); + return_type c_dist5 = services::result_from_distance::apply(comparable, 5.0); + return_type c_dist6 = services::result_from_distance::apply(comparable, 6.0); // If this is the case: BOOST_CHECK(c_dist5 < c_result && c_result < c_dist6); // This should also be the case - return_type dist5 = services::result_from_distance::apply(strategy, 5.0); - return_type dist6 = services::result_from_distance::apply(strategy, 6.0); + return_type dist5 = services::result_from_distance::apply(strategy, 5.0); + return_type dist6 = services::result_from_distance::apply(strategy, 6.0); BOOST_CHECK(dist5 < result && result < dist6); } @@ -191,15 +185,10 @@ void test_big_2d_with(AssignType const& x1, AssignType const& y1, AssignType const& x2, AssignType const& y2) { typedef bg::model::point point_type; - typedef bg::strategy::distance::pythagoras - < - point_type, - point_type, - CalculationType - > pythagoras_type; + typedef bg::strategy::distance::pythagoras pythagoras_type; pythagoras_type pythagoras; - typedef typename bg::strategy::distance::services::return_type::type return_type; + typedef typename bg::strategy::distance::services::return_type::type return_type; point_type p1, p2; @@ -242,10 +231,7 @@ void test_integer(bool check_types) bg::assign_values(p1, 12345678, 23456789); bg::assign_values(p2, 98765432, 87654321); - typedef bg::strategy::distance::pythagoras - < - point_type - > pythagoras_type; + typedef bg::strategy::distance::pythagoras<> pythagoras_type; pythagoras_type pythagoras; BOOST_AUTO(distance, pythagoras.apply(p1, p2)); BOOST_CHECK_CLOSE(distance, 107655455.02347542, 0.001); @@ -300,7 +286,7 @@ void time_compare_s(int const n) bg::assign_values(p1, 1, 1); bg::assign_values(p2, 2, 2); Strategy strategy; - typename bg::strategy::distance::services::return_type::type s = 0; + typename bg::strategy::distance::services::return_type::type s = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) @@ -315,8 +301,8 @@ void time_compare_s(int const n) template void time_compare(int const n) { - time_compare_s >(n); - time_compare_s >(n); + time_compare_s >(n); + time_compare_s >(n); } int test_main(int, char* []) diff --git a/test/strategies/pythagoras.vcproj b/test/strategies/pythagoras.vcproj deleted file mode 100644 index 7dedcaaa0..000000000 --- a/test/strategies/pythagoras.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/segment_intersection.vcproj b/test/strategies/segment_intersection.vcproj deleted file mode 100644 index 6ce11dee0..000000000 --- a/test/strategies/segment_intersection.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/segment_intersection_collinear.vcproj b/test/strategies/segment_intersection_collinear.vcproj deleted file mode 100644 index 0d479586f..000000000 --- a/test/strategies/segment_intersection_collinear.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/spherical_side.vcproj b/test/strategies/spherical_side.vcproj deleted file mode 100644 index 70dd8689c..000000000 --- a/test/strategies/spherical_side.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/strategies_tests.sln b/test/strategies/strategies_tests.sln deleted file mode 100644 index d29448213..000000000 --- a/test/strategies/strategies_tests.sln +++ /dev/null @@ -1,73 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythagoras", "pythagoras.vcproj", "{763CA955-FC01-4AFD-9593-69D36836B3F7}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transformer", "transformer.vcproj", "{9B62EBF7-D444-4D67-BA00-48CAEAF92756}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "segment_intersection", "segment_intersection.vcproj", "{4CCCD6BD-E77F-4A7B-BD9D-89ED2E213309}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "haversine", "haversine.vcproj", "{AA654B76-E384-4E10-B367-4F51B5D3E96F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cross_track", "cross_track.vcproj", "{4CE6F112-9EA1-4D7E-9AC6-907E77895263}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "projected_point", "projected_point.vcproj", "{A27A46D2-AAD2-47F9-86E2-21FF849EF2D4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "segment_intersection_collinear", "segment_intersection_collinear.vcproj", "{2D0CB6D3-6ABC-4119-A235-66E6065A279E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spherical_side", "spherical_side.vcproj", "{ADBE38D8-1828-48A2-BBA1-81F50B53C67C}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "within", "within.vcproj", "{AB13D2AC-FD34-4DE4-BD8E-4D463050E5DD}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "transform_cs", "transform_cs.vcproj", "{2128A5D9-C67E-4C00-A917-A79058C78FCC}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {763CA955-FC01-4AFD-9593-69D36836B3F7}.Debug|Win32.ActiveCfg = Debug|Win32 - {763CA955-FC01-4AFD-9593-69D36836B3F7}.Debug|Win32.Build.0 = Debug|Win32 - {763CA955-FC01-4AFD-9593-69D36836B3F7}.Release|Win32.ActiveCfg = Release|Win32 - {763CA955-FC01-4AFD-9593-69D36836B3F7}.Release|Win32.Build.0 = Release|Win32 - {9B62EBF7-D444-4D67-BA00-48CAEAF92756}.Debug|Win32.ActiveCfg = Debug|Win32 - {9B62EBF7-D444-4D67-BA00-48CAEAF92756}.Debug|Win32.Build.0 = Debug|Win32 - {9B62EBF7-D444-4D67-BA00-48CAEAF92756}.Release|Win32.ActiveCfg = Release|Win32 - {9B62EBF7-D444-4D67-BA00-48CAEAF92756}.Release|Win32.Build.0 = Release|Win32 - {4CCCD6BD-E77F-4A7B-BD9D-89ED2E213309}.Debug|Win32.ActiveCfg = Debug|Win32 - {4CCCD6BD-E77F-4A7B-BD9D-89ED2E213309}.Debug|Win32.Build.0 = Debug|Win32 - {4CCCD6BD-E77F-4A7B-BD9D-89ED2E213309}.Release|Win32.ActiveCfg = Release|Win32 - {4CCCD6BD-E77F-4A7B-BD9D-89ED2E213309}.Release|Win32.Build.0 = Release|Win32 - {AA654B76-E384-4E10-B367-4F51B5D3E96F}.Debug|Win32.ActiveCfg = Debug|Win32 - {AA654B76-E384-4E10-B367-4F51B5D3E96F}.Debug|Win32.Build.0 = Debug|Win32 - {AA654B76-E384-4E10-B367-4F51B5D3E96F}.Release|Win32.ActiveCfg = Release|Win32 - {AA654B76-E384-4E10-B367-4F51B5D3E96F}.Release|Win32.Build.0 = Release|Win32 - {4CE6F112-9EA1-4D7E-9AC6-907E77895263}.Debug|Win32.ActiveCfg = Debug|Win32 - {4CE6F112-9EA1-4D7E-9AC6-907E77895263}.Debug|Win32.Build.0 = Debug|Win32 - {4CE6F112-9EA1-4D7E-9AC6-907E77895263}.Release|Win32.ActiveCfg = Release|Win32 - {4CE6F112-9EA1-4D7E-9AC6-907E77895263}.Release|Win32.Build.0 = Release|Win32 - {A27A46D2-AAD2-47F9-86E2-21FF849EF2D4}.Debug|Win32.ActiveCfg = Debug|Win32 - {A27A46D2-AAD2-47F9-86E2-21FF849EF2D4}.Debug|Win32.Build.0 = Debug|Win32 - {A27A46D2-AAD2-47F9-86E2-21FF849EF2D4}.Release|Win32.ActiveCfg = Release|Win32 - {A27A46D2-AAD2-47F9-86E2-21FF849EF2D4}.Release|Win32.Build.0 = Release|Win32 - {2D0CB6D3-6ABC-4119-A235-66E6065A279E}.Debug|Win32.ActiveCfg = Debug|Win32 - {2D0CB6D3-6ABC-4119-A235-66E6065A279E}.Debug|Win32.Build.0 = Debug|Win32 - {2D0CB6D3-6ABC-4119-A235-66E6065A279E}.Release|Win32.ActiveCfg = Release|Win32 - {2D0CB6D3-6ABC-4119-A235-66E6065A279E}.Release|Win32.Build.0 = Release|Win32 - {ADBE38D8-1828-48A2-BBA1-81F50B53C67C}.Debug|Win32.ActiveCfg = Debug|Win32 - {ADBE38D8-1828-48A2-BBA1-81F50B53C67C}.Debug|Win32.Build.0 = Debug|Win32 - {ADBE38D8-1828-48A2-BBA1-81F50B53C67C}.Release|Win32.ActiveCfg = Release|Win32 - {ADBE38D8-1828-48A2-BBA1-81F50B53C67C}.Release|Win32.Build.0 = Release|Win32 - {AB13D2AC-FD34-4DE4-BD8E-4D463050E5DD}.Debug|Win32.ActiveCfg = Debug|Win32 - {AB13D2AC-FD34-4DE4-BD8E-4D463050E5DD}.Debug|Win32.Build.0 = Debug|Win32 - {AB13D2AC-FD34-4DE4-BD8E-4D463050E5DD}.Release|Win32.ActiveCfg = Release|Win32 - {AB13D2AC-FD34-4DE4-BD8E-4D463050E5DD}.Release|Win32.Build.0 = Release|Win32 - {2128A5D9-C67E-4C00-A917-A79058C78FCC}.Debug|Win32.ActiveCfg = Debug|Win32 - {2128A5D9-C67E-4C00-A917-A79058C78FCC}.Debug|Win32.Build.0 = Debug|Win32 - {2128A5D9-C67E-4C00-A917-A79058C78FCC}.Release|Win32.ActiveCfg = Release|Win32 - {2128A5D9-C67E-4C00-A917-A79058C78FCC}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/strategies/transform_cs.vcproj b/test/strategies/transform_cs.vcproj deleted file mode 100644 index ea115c56f..000000000 --- a/test/strategies/transform_cs.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/transformer.cpp b/test/strategies/transformer.cpp index b469e08cc..5cdc567e6 100644 --- a/test/strategies/transformer.cpp +++ b/test/strategies/transformer.cpp @@ -34,7 +34,10 @@ BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian) template void check_inverse(P const& p, T const& trans) { - bg::strategy::transform::inverse_transformer inverse(trans); + typedef typename bg::coordinate_type

::type coordinate_type; + const std::size_t dim = bg::dimension

::value; + + bg::strategy::transform::inverse_transformer inverse(trans); P i; bg::transform(p, i, inverse); @@ -46,11 +49,14 @@ void check_inverse(P const& p, T const& trans) template void test_all() { + typedef typename bg::coordinate_type

::type coordinate_type; + const std::size_t dim = bg::dimension

::value; + P p; bg::assign_values(p, 1, 1); { - bg::strategy::transform::translate_transformer trans(1, 1); + bg::strategy::transform::translate_transformer trans(1, 1); P tp; bg::transform(p, tp, trans); @@ -61,7 +67,7 @@ void test_all() } { - bg::strategy::transform::scale_transformer trans(10, 10); + bg::strategy::transform::scale_transformer trans(10, 10); P tp; bg::transform(p, tp, trans); @@ -72,7 +78,7 @@ void test_all() } { - bg::strategy::transform::rotate_transformer trans(90.0); + bg::strategy::transform::rotate_transformer trans(90.0); P tp; bg::transform(p, tp, trans); @@ -83,7 +89,7 @@ void test_all() { // Map from 0,0,2,2 to 0,0,500,500 - bg::strategy::transform::map_transformer trans + bg::strategy::transform::map_transformer trans ( 0.0, 0.0, 2.0, 2.0, 500, 500 ); diff --git a/test/strategies/transformer.vcproj b/test/strategies/transformer.vcproj deleted file mode 100644 index f9c02344a..000000000 --- a/test/strategies/transformer.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/strategies/within.vcproj b/test/strategies/within.vcproj deleted file mode 100644 index 8ad1dbc87..000000000 --- a/test/strategies/within.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/ttmath.vsprops b/test/ttmath.vsprops deleted file mode 100644 index e01e29698..000000000 --- a/test/ttmath.vsprops +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/test/util/as_range.vcproj b/test/util/as_range.vcproj deleted file mode 100644 index cc96fd53b..000000000 --- a/test/util/as_range.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/util/calculation_type.vcproj b/test/util/calculation_type.vcproj deleted file mode 100644 index 9c2920035..000000000 --- a/test/util/calculation_type.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/util/for_each_coordinate.vcproj b/test/util/for_each_coordinate.vcproj deleted file mode 100644 index 5afce6532..000000000 --- a/test/util/for_each_coordinate.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/util/rational.vcproj b/test/util/rational.vcproj deleted file mode 100644 index 28ad0a237..000000000 --- a/test/util/rational.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/util/select_most_precise.vcproj b/test/util/select_most_precise.vcproj deleted file mode 100644 index ebe824503..000000000 --- a/test/util/select_most_precise.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/util/util_tests.sln b/test/util/util_tests.sln deleted file mode 100644 index 1e140df83..000000000 --- a/test/util/util_tests.sln +++ /dev/null @@ -1,49 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "for_each_coordinate", "for_each_coordinate.vcproj", "{900CD32E-1B78-40E3-887F-9BCCC0A1041E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "select_most_precise", "select_most_precise.vcproj", "{D0982142-D3B1-4084-B724-83FB7E49EB98}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "write_dsv", "write_dsv.vcproj", "{FC796B9D-2FC4-46C1-B733-9C2C5BB48094}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "as_range", "as_range.vcproj", "{A36D8426-67EB-405C-B6E8-3FBB3374A59B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rational", "rational.vcproj", "{6ABF6324-C1DC-4687-9895-B4CE2B27446F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "calculation_type", "calculation_type.vcproj", "{CF8FE803-A26B-4553-B605-9C28225B5595}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {900CD32E-1B78-40E3-887F-9BCCC0A1041E}.Debug|Win32.ActiveCfg = Debug|Win32 - {900CD32E-1B78-40E3-887F-9BCCC0A1041E}.Debug|Win32.Build.0 = Debug|Win32 - {900CD32E-1B78-40E3-887F-9BCCC0A1041E}.Release|Win32.ActiveCfg = Release|Win32 - {900CD32E-1B78-40E3-887F-9BCCC0A1041E}.Release|Win32.Build.0 = Release|Win32 - {D0982142-D3B1-4084-B724-83FB7E49EB98}.Debug|Win32.ActiveCfg = Debug|Win32 - {D0982142-D3B1-4084-B724-83FB7E49EB98}.Debug|Win32.Build.0 = Debug|Win32 - {D0982142-D3B1-4084-B724-83FB7E49EB98}.Release|Win32.ActiveCfg = Release|Win32 - {D0982142-D3B1-4084-B724-83FB7E49EB98}.Release|Win32.Build.0 = Release|Win32 - {FC796B9D-2FC4-46C1-B733-9C2C5BB48094}.Debug|Win32.ActiveCfg = Debug|Win32 - {FC796B9D-2FC4-46C1-B733-9C2C5BB48094}.Debug|Win32.Build.0 = Debug|Win32 - {FC796B9D-2FC4-46C1-B733-9C2C5BB48094}.Release|Win32.ActiveCfg = Release|Win32 - {FC796B9D-2FC4-46C1-B733-9C2C5BB48094}.Release|Win32.Build.0 = Release|Win32 - {A36D8426-67EB-405C-B6E8-3FBB3374A59B}.Debug|Win32.ActiveCfg = Debug|Win32 - {A36D8426-67EB-405C-B6E8-3FBB3374A59B}.Debug|Win32.Build.0 = Debug|Win32 - {A36D8426-67EB-405C-B6E8-3FBB3374A59B}.Release|Win32.ActiveCfg = Release|Win32 - {A36D8426-67EB-405C-B6E8-3FBB3374A59B}.Release|Win32.Build.0 = Release|Win32 - {6ABF6324-C1DC-4687-9895-B4CE2B27446F}.Debug|Win32.ActiveCfg = Debug|Win32 - {6ABF6324-C1DC-4687-9895-B4CE2B27446F}.Debug|Win32.Build.0 = Debug|Win32 - {6ABF6324-C1DC-4687-9895-B4CE2B27446F}.Release|Win32.ActiveCfg = Release|Win32 - {6ABF6324-C1DC-4687-9895-B4CE2B27446F}.Release|Win32.Build.0 = Release|Win32 - {CF8FE803-A26B-4553-B605-9C28225B5595}.Debug|Win32.ActiveCfg = Debug|Win32 - {CF8FE803-A26B-4553-B605-9C28225B5595}.Debug|Win32.Build.0 = Debug|Win32 - {CF8FE803-A26B-4553-B605-9C28225B5595}.Release|Win32.ActiveCfg = Release|Win32 - {CF8FE803-A26B-4553-B605-9C28225B5595}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/test/util/write_dsv.vcproj b/test/util/write_dsv.vcproj deleted file mode 100644 index 8525f7393..000000000 --- a/test/util/write_dsv.vcproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/views/box_view.vcproj b/test/views/box_view.vcproj deleted file mode 100644 index ab1036bee..000000000 --- a/test/views/box_view.vcproj +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/views/closeable_view.vcproj b/test/views/closeable_view.vcproj deleted file mode 100644 index 204e1ac30..000000000 --- a/test/views/closeable_view.vcproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/views/reversible_closeable.vcproj b/test/views/reversible_closeable.vcproj deleted file mode 100644 index b2a3846b1..000000000 --- a/test/views/reversible_closeable.vcproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/views/reversible_view.vcproj b/test/views/reversible_view.vcproj deleted file mode 100644 index f81885210..000000000 --- a/test/views/reversible_view.vcproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/views/segment_view.vcproj b/test/views/segment_view.vcproj deleted file mode 100644 index 9b8840193..000000000 --- a/test/views/segment_view.vcproj +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/views/views.sln b/test/views/views.sln deleted file mode 100644 index 7fcf73665..000000000 --- a/test/views/views.sln +++ /dev/null @@ -1,43 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "closeable_view", "closeable_view.vcproj", "{5C40995A-B6FC-4C94-B552-0D80EC9E2049}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reversible_closeable", "reversible_closeable.vcproj", "{AAA72638-34CD-4A34-8329-984DFC766E24}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reversible_view", "reversible_view.vcproj", "{BFB08FEE-76D6-4F3D-9184-BE03CC3F7968}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "box_view", "box_view.vcproj", "{34A1F53A-DA46-41E6-9E26-740D22D662DC}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "segment_view", "segment_view.vcproj", "{B49AC3E2-3497-465B-88C2-BCADA4B4ADAF}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5C40995A-B6FC-4C94-B552-0D80EC9E2049}.Debug|Win32.ActiveCfg = Debug|Win32 - {5C40995A-B6FC-4C94-B552-0D80EC9E2049}.Debug|Win32.Build.0 = Debug|Win32 - {5C40995A-B6FC-4C94-B552-0D80EC9E2049}.Release|Win32.ActiveCfg = Release|Win32 - {5C40995A-B6FC-4C94-B552-0D80EC9E2049}.Release|Win32.Build.0 = Release|Win32 - {AAA72638-34CD-4A34-8329-984DFC766E24}.Debug|Win32.ActiveCfg = Debug|Win32 - {AAA72638-34CD-4A34-8329-984DFC766E24}.Debug|Win32.Build.0 = Debug|Win32 - {AAA72638-34CD-4A34-8329-984DFC766E24}.Release|Win32.ActiveCfg = Release|Win32 - {AAA72638-34CD-4A34-8329-984DFC766E24}.Release|Win32.Build.0 = Release|Win32 - {BFB08FEE-76D6-4F3D-9184-BE03CC3F7968}.Debug|Win32.ActiveCfg = Debug|Win32 - {BFB08FEE-76D6-4F3D-9184-BE03CC3F7968}.Debug|Win32.Build.0 = Debug|Win32 - {BFB08FEE-76D6-4F3D-9184-BE03CC3F7968}.Release|Win32.ActiveCfg = Release|Win32 - {BFB08FEE-76D6-4F3D-9184-BE03CC3F7968}.Release|Win32.Build.0 = Release|Win32 - {34A1F53A-DA46-41E6-9E26-740D22D662DC}.Debug|Win32.ActiveCfg = Debug|Win32 - {34A1F53A-DA46-41E6-9E26-740D22D662DC}.Debug|Win32.Build.0 = Debug|Win32 - {34A1F53A-DA46-41E6-9E26-740D22D662DC}.Release|Win32.ActiveCfg = Release|Win32 - {34A1F53A-DA46-41E6-9E26-740D22D662DC}.Release|Win32.Build.0 = Release|Win32 - {B49AC3E2-3497-465B-88C2-BCADA4B4ADAF}.Debug|Win32.ActiveCfg = Debug|Win32 - {B49AC3E2-3497-465B-88C2-BCADA4B4ADAF}.Debug|Win32.Build.0 = Debug|Win32 - {B49AC3E2-3497-465B-88C2-BCADA4B4ADAF}.Release|Win32.ActiveCfg = Release|Win32 - {B49AC3E2-3497-465B-88C2-BCADA4B4ADAF}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal