$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r65255 - in sandbox/geometry/boost/geometry: algorithms algorithms/detail/overlay extensions/gis/io/shapelib multi/algorithms/detail/overlay
From: barend.gehrels_at_[hidden]
Date: 2010-09-04 11:16:58
Author: barendgehrels
Date: 2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
New Revision: 65255
URL: http://svn.boost.org/trac/boost/changeset/65255
Log:
Modified  IntersectionStrategy and AssignPolicy into a TurnPolicy (having the two)
Added:
   sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp   (contents, props changed)
Text files modified: 
   sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp          |    12 +                                       
   sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turns.hpp              |   109 ++++++++-----------                     
   sandbox/geometry/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp       |    45 ++++---                                 
   sandbox/geometry/boost/geometry/algorithms/difference.hpp                            |    17 +-                                      
   sandbox/geometry/boost/geometry/algorithms/disjoint.hpp                              |     5                                         
   sandbox/geometry/boost/geometry/algorithms/intersection.hpp                          |   216 +++++++++++++++++++++++++++------------ 
   sandbox/geometry/boost/geometry/algorithms/intersects.hpp                            |    40 ++++---                                 
   sandbox/geometry/boost/geometry/extensions/gis/io/shapelib/shape_creator.hpp         |    28 +++++                                   
   sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp        |    45 +++-----                                
   sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/self_turn_points.hpp |    14 +-                                      
   10 files changed, 316 insertions(+), 215 deletions(-)
Added: sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp
==============================================================================
--- (empty file)
+++ sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -0,0 +1,145 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Copyright Barend Gehrels 2007-2010, Geodan, Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_INTERSECTION_POINTS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_INTERSECTION_POINTS_HPP
+
+
+#include <cstddef>
+#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace get_intersection_points
+{
+
+
+template
+<
+    typename Point1,
+    typename Point2,
+    typename TurnInfo
+>
+struct get_turn_without_info
+{
+    typedef strategy_intersection
+        <
+            typename cs_tag<typename TurnInfo::point_type>::type,
+            Point1,
+            Point2,
+            typename TurnInfo::point_type
+        > si;
+
+    typedef typename si::segment_intersection_strategy_type strategy;
+
+
+
+    template <typename OutputIterator>
+    static inline OutputIterator apply(
+                Point1 const& pi, Point1 const& pj, Point1 const& pk,
+                Point2 const& qi, Point2 const& qj, Point2 const& qk,
+                TurnInfo const& tp_model,
+                OutputIterator out)
+    {
+        typedef segment<Point1 const> segment_type1;
+        typedef segment<Point1 const> segment_type2;
+        segment_type1 p1(pi, pj), p2(pj, pk);
+        segment_type2 q1(qi, qj), q2(qj, qk);
+
+        // 
+        typename strategy::return_type result = strategy::apply(p1, q1);
+
+        for (std::size_t i = 0; i < result.template get<0>().count; i++)
+        {
+
+            TurnInfo tp;
+            copy_coordinates(result.template get<0>().intersections[i], tp.point);
+            *out++ = tp;
+        }
+
+        return out;
+    }
+};
+
+}} // namespace detail::get_intersection_points
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+
+template
+<
+    typename Geometry1,
+    typename Geometry2,
+    typename Turns
+>
+inline void get_intersection_points(Geometry1 const& geometry1,
+            Geometry2 const& geometry2,
+            Turns& turns)
+{
+    concept::check_concepts_and_equal_dimensions<Geometry1 const, Geometry2 const>();
+
+    typedef detail::get_intersection_points::get_turn_without_info
+                        <
+                            typename point_type<Geometry1>::type,
+                            typename point_type<Geometry2>::type,
+                            typename boost::range_value<Turns>::type
+                        > TurnPolicy;
+
+    typedef typename strategy_intersection
+        <
+            typename cs_tag<Geometry1>::type,
+            Geometry1,
+            Geometry2,
+            typename boost::range_value<Turns>::type
+        >::segment_intersection_strategy_type segment_intersection_strategy_type;
+
+    detail::get_turns::no_interrupt_policy interrupt_policy;
+
+    boost::mpl::if_c
+        <
+            reverse_dispatch<Geometry1, Geometry2>::type::value,
+            dispatch::get_turns_reversed
+            <
+                typename tag<Geometry1>::type,
+                typename tag<Geometry2>::type,
+                is_multi<Geometry1>::type::value,
+                is_multi<Geometry2>::type::value,
+                Geometry1,
+                Geometry2,
+                Turns, TurnPolicy,
+                //segment_intersection_strategy_type,
+                detail::get_turns::no_interrupt_policy
+            >,
+            dispatch::get_turns
+            <
+                typename tag<Geometry1>::type,
+                typename tag<Geometry2>::type,
+                is_multi<Geometry1>::type::value,
+                is_multi<Geometry2>::type::value,
+                Geometry1,
+                Geometry2,
+                Turns, TurnPolicy,
+                //segment_intersection_strategy_type,
+                detail::get_turns::no_interrupt_policy
+            >
+        >::type::apply(
+            0, geometry1,
+            1, geometry2,
+            turns, interrupt_policy);
+}
+
+
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_INTERSECTION_POINTS_HPP
Modified: sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp	(original)
+++ sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -682,10 +682,10 @@
 
 
 /*!
-    \brief Policy doing nothing
-    \details get_turn_info can have an optional policy to get/assign some
-        extra information. By default it does not, and this class
-        is that default.
+\brief Policy doing nothing
+\details get_turn_info can have an optional policy to get/assign some
+    extra information. By default it does not, and this class
+    is that default.
  */
 struct assign_null_policy
 {
@@ -730,7 +730,7 @@
 
 
     template <typename OutputIterator>
-    static inline void apply(
+    static inline OutputIterator apply(
                 Point1 const& pi, Point1 const& pj, Point1 const& pk,
                 Point2 const& qi, Point2 const& qj, Point2 const& qk,
                 TurnInfo const& tp_model,
@@ -881,6 +881,8 @@
             default :
                 std::cout << "get_turns, nyi: " << method << std::endl;
         }
+
+        return out;
     }
 };
 
Modified: sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turns.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turns.hpp	(original)
+++ sandbox/geometry/boost/geometry/algorithms/detail/overlay/get_turns.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -85,8 +85,7 @@
     typename Geometry1, typename Geometry2,
     typename Section1, typename Section2,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 class get_turns_in_sections
@@ -204,12 +203,7 @@
 
                     std::size_t const size_before = boost::size(turns);
 
-                    detail::overlay::get_turn_info
-                        <
-                            point1_type, point2_type,
-                            turn_info,
-                            AssignPolicy
-                        >::apply(*prev1, *it1, *nd_next1, *prev2, *it2, *nd_next2,
+                    TurnPolicy::apply(*prev1, *it1, *nd_next1, *prev2, *it2, *nd_next2,
                             ti, std::back_inserter(turns));
 
                     if (InterruptPolicy::enabled)
@@ -302,8 +296,7 @@
     typename Geometry1,
     typename Geometry2,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 class get_turns_generic
@@ -370,8 +363,8 @@
                                     typename boost::range_value<Sections1>::type,
                                     typename boost::range_value<Sections2>::type,
                                     Turns,
-                                    IntersectionStrategy,
-                                    AssignPolicy, InterruptPolicy
+                                    TurnPolicy,
+                                    InterruptPolicy
                                 >::apply(
                                         source_id1, geometry1, *it1,
                                         source_id2, geometry2, *it2,
@@ -500,8 +493,7 @@
     typename Range,
     typename Box,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns_cs
@@ -580,13 +572,6 @@
             if (true)
             {
                 typedef typename boost::range_value<Turns>::type turn_info;
-                typedef detail::overlay::get_turn_info
-                    <
-                        box_point_type,
-                        point_type,
-                        turn_info,
-                        AssignPolicy
-                    > relater;
 
                 // Depending on code some relations can be left out
                 turn_info ti;
@@ -595,25 +580,25 @@
 
                 ti.operations[1].seg_id = segment_identifier(source_id2, -1, -1, 0);
                 ti.operations[0].other_id = ti.operations[1].seg_id;
-                relater::apply(*prev, *it, *next,
+                TurnPolicy::apply(*prev, *it, *next,
                         lower_left, upper_left, upper_right,
                         ti, std::back_inserter(turns));
 
                 ti.operations[1].seg_id = segment_identifier(source_id2, -1, -1, 1);
                 ti.operations[0].other_id = ti.operations[1].seg_id;
-                relater::apply(*prev, *it, *next,
+                TurnPolicy::apply(*prev, *it, *next,
                         upper_left, upper_right, lower_right,
                         ti, std::back_inserter(turns));
 
                 ti.operations[1].seg_id = segment_identifier(source_id2, -1, -1, 2);
                 ti.operations[0].other_id = ti.operations[1].seg_id;
-                relater::apply(*prev, *it, *next,
+                TurnPolicy::apply(*prev, *it, *next,
                         upper_right, lower_right, lower_left,
                         ti, std::back_inserter(turns));
 
                 ti.operations[1].seg_id = segment_identifier(source_id2, -1, -1, 3);
                 ti.operations[0].other_id = ti.operations[1].seg_id;
-                relater::apply(*prev, *it, *next,
+                TurnPolicy::apply(*prev, *it, *next,
                         lower_right, lower_left, upper_left,
                         ti, std::back_inserter(turns));
 
@@ -664,8 +649,7 @@
     bool IsMulti1, bool IsMulti2,
     typename Geometry1, typename Geometry2,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns
@@ -674,8 +658,8 @@
             Geometry1,
             Geometry2,
             Turns,
-            IntersectionStrategy,
-            AssignPolicy, InterruptPolicy
+            TurnPolicy,
+            InterruptPolicy
         >
 {};
 
@@ -685,8 +669,7 @@
     typename Polygon,
     typename Box,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns
@@ -694,8 +677,7 @@
         polygon_tag, box_tag, false, false,
         Polygon, Box,
         Turns,
-        IntersectionStrategy,
-        AssignPolicy,
+        TurnPolicy,
         InterruptPolicy
     >
 {
@@ -718,8 +700,8 @@
                 ring_type,
                 Box,
                 Turns,
-                IntersectionStrategy,
-                AssignPolicy, InterruptPolicy
+                TurnPolicy,
+                InterruptPolicy
             > intersector_type;
 
         intersector_type::apply(
@@ -746,8 +728,7 @@
     typename Ring,
     typename Box,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns
@@ -755,8 +736,8 @@
         ring_tag, box_tag, false, false,
         Ring, Box,
         Turns,
-        IntersectionStrategy,
-        AssignPolicy, InterruptPolicy
+        TurnPolicy,
+        InterruptPolicy
     >
 {
     static inline void apply(
@@ -774,8 +755,8 @@
                 Ring,
                 Box,
                 Turns,
-                IntersectionStrategy,
-                AssignPolicy, InterruptPolicy
+                TurnPolicy,
+                InterruptPolicy
             > intersector_type;
 
         intersector_type::apply(
@@ -793,8 +774,8 @@
     bool IsMulti1, bool IsMulti2,
     typename Geometry1, typename Geometry2,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy, typename InterruptPolicy
+    typename TurnPolicy,
+    typename InterruptPolicy
 >
 struct get_turns_reversed
 {
@@ -808,8 +789,8 @@
                 GeometryTag2, GeometryTag1,
                 IsMulti2, IsMulti1,
                 Geometry2, Geometry1,
-                Turns, IntersectionStrategy,
-                AssignPolicy, InterruptPolicy
+                Turns, TurnPolicy,
+                InterruptPolicy
             >::apply(source_id2, g2, source_id1, g1, turns, interrupt_policy);
     }
 };
@@ -821,16 +802,16 @@
 
 
 /*!
-    \brief Calculate intersection points of two geometries
-    \ingroup overlay
-    \tparam Geometry1 first geometry type
-    \tparam Geometry2 second geometry type
-    \tparam Turns type of turn-container (e.g. vector of "intersection/turn point"'s)
-    \param geometry1 first geometry
-    \param geometry2 second geometry
-    \param turns container which will contain intersection points
-    \param interrupt_policy policy determining if process is stopped
-        when intersection is found
+\brief \brief_calc2{turn points}
+\ingroup overlay
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam Turns type of turn-container (e.g. vector of "intersection/turn point"'s)
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param turns container which will contain turn points
+\param interrupt_policy policy determining if process is stopped
+    when intersection is found
  */
 template
 <
@@ -855,6 +836,14 @@
             typename boost::range_value<Turns>::type
         >::segment_intersection_strategy_type segment_intersection_strategy_type;
 
+    typedef detail::overlay::get_turn_info
+        <
+            typename point_type<Geometry1>::type,
+            typename point_type<Geometry2>::type,
+            typename boost::range_value<Turns>::type,
+            AssignPolicy
+        > TurnPolicy;
+
     boost::mpl::if_c
         <
             reverse_dispatch<Geometry1, Geometry2>::type::value,
@@ -866,9 +855,8 @@
                 is_multi<Geometry2>::type::value,
                 Geometry1,
                 Geometry2,
-                Turns,
-                segment_intersection_strategy_type,
-                AssignPolicy, InterruptPolicy
+                Turns, TurnPolicy,
+                InterruptPolicy
             >,
             dispatch::get_turns
             <
@@ -878,9 +866,8 @@
                 is_multi<Geometry2>::type::value,
                 Geometry1,
                 Geometry2,
-                Turns,
-                segment_intersection_strategy_type,
-                AssignPolicy, InterruptPolicy
+                Turns, TurnPolicy,
+                InterruptPolicy
             >
         >::type::apply(
             0, geometry1,
Modified: sandbox/geometry/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp	(original)
+++ sandbox/geometry/boost/geometry/algorithms/detail/overlay/self_turn_points.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -33,8 +33,7 @@
 <
     typename Geometry,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns
@@ -74,8 +73,8 @@
                             Geometry, Geometry,
                             typename boost::range_value<sections_type>::type,
                             typename boost::range_value<sections_type>::type,
-                            Turns, IntersectionStrategy,
-                            AssignPolicy, InterruptPolicy
+                            Turns, TurnPolicy,
+                            InterruptPolicy
                         >::apply(
                                 0, geometry, *it1,
                                 0, geometry, *it2,
@@ -105,8 +104,7 @@
     bool IsMulti,
     typename Geometry,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct self_get_turn_points
@@ -118,23 +116,22 @@
 <
     typename Ring,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct self_get_turn_points
     <
         ring_tag, false, Ring,
         Turns,
-        IntersectionStrategy,
-        AssignPolicy, InterruptPolicy
+        TurnPolicy,
+        InterruptPolicy
     >
     : detail::self_get_turn_points::get_turns
         <
             Ring,
             Turns,
-            IntersectionStrategy,
-            AssignPolicy, InterruptPolicy
+            TurnPolicy, 
+            InterruptPolicy
         >
 {};
 
@@ -143,22 +140,22 @@
 <
     typename Polygon,
     typename Turns,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct self_get_turn_points
     <
         polygon_tag, false, Polygon,
-        Turns, IntersectionStrategy,
-        AssignPolicy, InterruptPolicy
+        Turns, 
+        TurnPolicy,
+        InterruptPolicy
     >
     : detail::self_get_turn_points::get_turns
         <
             Polygon,
             Turns,
-            IntersectionStrategy,
-            AssignPolicy, InterruptPolicy
+            TurnPolicy, 
+            InterruptPolicy
         >
 {};
 
@@ -198,14 +195,22 @@
             typename boost::range_value<Turns>::type
         >::segment_intersection_strategy_type strategy_type;
 
+    typedef detail::overlay::get_turn_info
+                        <
+                            typename point_type<Geometry>::type, 
+                            typename point_type<Geometry>::type,
+                            typename boost::range_value<Turns>::type,
+                            detail::overlay::assign_null_policy
+                        > TurnPolicy;
 
     dispatch::self_get_turn_points
             <
                 typename tag<Geometry>::type,
                 is_multi<Geometry>::type::value,
                 Geometry,
-                Turns, strategy_type,
-                AssignPolicy, InterruptPolicy
+                Turns, 
+                TurnPolicy, 
+                InterruptPolicy
             >::apply(geometry, turns, interrupt_policy);
 }
 
Modified: sandbox/geometry/boost/geometry/algorithms/difference.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/difference.hpp	(original)
+++ sandbox/geometry/boost/geometry/algorithms/difference.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -20,14 +20,15 @@
 
 
 /*!
-    \ingroup difference
-    \tparam Geometry1 first geometry type
-    \tparam Geometry2 second geometry type
-    \tparam Collection output collection, either a multi-geometry,
-        or a std::vector<Geometry> / std::deque<Geometry> etc
-    \param geometry1 first geometry
-    \param geometry2 second geometry
-    \param output_collection the output collection
+\brief_calc2{difference}
+\ingroup difference
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam Collection output collection, either a multi-geometry,
+    or a std::vector<Geometry> / std::deque<Geometry> etc
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param output_collection the output collection
 */
 template
 <
Modified: sandbox/geometry/boost/geometry/algorithms/disjoint.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/disjoint.hpp	(original)
+++ sandbox/geometry/boost/geometry/algorithms/disjoint.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -170,6 +170,11 @@
     : detail::disjoint::disjoint_segment<Linestring1, Linestring2>
 {};
 
+template <typename Linestring, typename Segment>
+struct disjoint<linestring_tag, segment_tag, Linestring, Segment, false, false, 2>
+    : detail::disjoint::disjoint_linear<Linestring, Segment>
+{};
+
 
 template
 <
Modified: sandbox/geometry/boost/geometry/algorithms/intersection.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/intersection.hpp	(original)
+++ sandbox/geometry/boost/geometry/algorithms/intersection.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -20,49 +20,31 @@
 #include <boost/geometry/geometries/concepts/check.hpp>
 #include <boost/geometry/algorithms/detail/overlay/clip_linestring.hpp>
 #include <boost/geometry/algorithms/detail/overlay/assemble.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_turns.hpp>
+#include <boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp>
 #include <boost/geometry/ranges/segment_range.hpp>
 
 
 namespace boost { namespace geometry
 {
 
-#ifndef DOXYGEN_NO_DISPATCH
-namespace dispatch
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace intersection
 {
 
 template
 <
-    typename TagIn1, typename TagIn2, typename TagOut,
-    typename Geometry1, typename Geometry2,
-    typename OutputIterator,
-    typename GeometryOut,
-    typename Strategy
->
-struct intersection_inserter
-    : detail::overlay::overlay
-        <Geometry1, Geometry2, OutputIterator, GeometryOut, -1, Strategy>
-{};
-
-
-template
-<
     typename Segment1, typename Segment2,
-    typename OutputIterator, typename GeometryOut,
+    typename OutputIterator, typename PointOut,
     typename Strategy
 >
-struct intersection_inserter
-    <
-        segment_tag, segment_tag, point_tag,
-        Segment1, Segment2,
-        OutputIterator, GeometryOut,
-        Strategy
-    >
+struct intersection_segment_segment_point
 {
     static inline OutputIterator apply(Segment1 const& segment1,
             Segment2 const& segment2, OutputIterator out,
             Strategy const& strategy)
     {
-        typedef typename point_type<GeometryOut>::type point_type;
+        typedef typename point_type<PointOut>::type point_type;
 
         // Get the intersection point (or two points)
         segment_intersection_points<point_type> is
@@ -78,15 +60,110 @@
 
         for (std::size_t i = 0; i < is.count; i++)
         {
-            GeometryOut p;
+            PointOut p;
             geometry::copy_coordinates(is.intersections[i], p);
-            *out = p;
-            out++;
+            *out++ = p;
         }
         return out;
     }
 };
 
+template
+<
+    typename Linestring1, typename Linestring2,
+    typename OutputIterator, typename PointOut,
+    typename Strategy
+>
+struct intersection_linestring_linestring_point
+{
+    static inline OutputIterator apply(Linestring1 const& linestring1,
+            Linestring2 const& linestring2, OutputIterator out,
+            Strategy const& strategy)
+    {
+        typedef typename point_type<PointOut>::type point_type;
+
+        typedef detail::overlay::turn_info<point_type> turn_info;
+        std::deque<turn_info> turns;
+
+        geometry::get_intersection_points(linestring1, linestring2, turns);
+
+        for (typename boost::range_iterator<std::deque<turn_info> const>::type
+            it = boost::begin(turns); it != boost::end(turns); ++it)
+        {
+            PointOut p;
+            geometry::copy_coordinates(it->point, p);
+            *out++ = p;
+        }
+        return out;
+    }
+};
+
+
+
+}} // namespace detail::disjoint
+#endif // DOXYGEN_NO_DETAIL
+
+
+
+#ifndef DOXYGEN_NO_DISPATCH
+namespace dispatch
+{
+
+template
+<
+    typename TagIn1, typename TagIn2, typename TagOut,
+    typename Geometry1, typename Geometry2,
+    typename OutputIterator,
+    typename GeometryOut,
+    typename Strategy
+>
+struct intersection_inserter
+    : detail::overlay::overlay
+        <Geometry1, Geometry2, OutputIterator, GeometryOut, -1, Strategy>
+{};
+
+
+template
+<
+    typename Segment1, typename Segment2,
+    typename OutputIterator, typename GeometryOut,
+    typename Strategy
+>
+struct intersection_inserter
+    <
+        segment_tag, segment_tag, point_tag,
+        Segment1, Segment2,
+        OutputIterator, GeometryOut,
+        Strategy
+    > : detail::intersection::intersection_segment_segment_point
+            <
+                Segment1, Segment2,
+                OutputIterator, GeometryOut,
+                Strategy
+            >
+{};
+
+
+template
+<
+    typename Linestring1, typename Linestring2,
+    typename OutputIterator, typename GeometryOut,
+    typename Strategy
+>
+struct intersection_inserter
+    <
+        linestring_tag, linestring_tag, point_tag,
+        Linestring1, Linestring2,
+        OutputIterator, GeometryOut,
+        Strategy
+    > : detail::intersection::intersection_linestring_linestring_point
+            <
+                Linestring1, Linestring2,
+                OutputIterator, GeometryOut,
+                Strategy
+            >
+{};
+
 
 template
 <
@@ -169,21 +246,24 @@
 #endif // DOXYGEN_NO_DISPATCH
 
 /*!
-    \brief Intersects two geometries
-    \ingroup intersection
-    \details The two input geometries are intersected and the resulting
-        linestring(s), ring(s) or polygon(s) are sent
-        to the specified output operator.
-    \tparam GeometryOut output geometry type, must be specified
-    \tparam Geometry1 first geometry type
-    \tparam Geometry2 second geometry type
-    \tparam OutputIterator output iterator
-    \tparam Strategy compound strategy for intersection
-    \param geometry1 first geometry
-    \param geometry2 second geometry
-    \param out the output iterator, outputting linestrings or polygons
-    \param strategy the strategy
-    \return the output iterator
+\brief \brief_calc2{intersection} \brief_strategy
+\ingroup intersection
+\details \details_calc2{intersection_inserter, spatial set theoretic intersection}
+    \brief_strategy. \details_inserter{intersection}
+\tparam GeometryOut \tparam_geometry{\p_l_or_c}
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam OutputIterator \tparam_out{\p_l_or_c}
+\tparam Strategy Compound strategy for intersection
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param out \param_out{intersection}
+\param strategy The strategy
+\return \return_out
+
+\qbk{behavior,[qbk_out __point__]:Calculates intersection points of input geometries}
+\qbk{behavior,[qbk_out __linestring__]:Calculates intersection linestrings of input geometries (NYI)}
+\qbk{behavior,[qbk_out __polygon__]:Calculates intersection polygons input (multi)polygons and/or boxes}
 */
 template
 <
@@ -229,19 +309,19 @@
 
 
 /*!
-    \brief Intersects two geometries
-    \ingroup intersection
-    \details The two input geometries are intersected and the resulting
-        linestring(s), ring(s) or polygon(s) are sent
-        to the specified output operator.
-    \tparam GeometryOut output geometry type, must be specified
-    \tparam Geometry1 first geometry type
-    \tparam Geometry2 second geometry type
-    \tparam OutputIterator output iterator
-    \param geometry1 first geometry
-    \param geometry2 second geometry
-    \param out the output iterator, outputting linestrings or polygons
-    \return the output iterator
+\brief \brief_calc2{intersection}
+\ingroup intersection
+\details \details_calc2{intersection_inserter, spatial set theoretic intersection}. \details_inserter{intersection}
+\tparam GeometryOut \tparam_geometry{\p_l_or_c}
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam OutputIterator \tparam_out{\p_l_or_c}
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param out \param_out{intersection}
+\return \return_out
+
+\qbk{snippet,intersection_segment_inserter}
 */
 template
 <
@@ -271,18 +351,18 @@
 
 
 /*!
-    \brief Intersects two geometries
-    \ingroup intersection
-    \details The two input geometries are intersected and the resulting
-        linestring(s), ring(s) or polygon(s) are added
-        to the specified collection.
-    \tparam Geometry1 first geometry type
-    \tparam Geometry2 second geometry type
-    \tparam Collection collection of rings, polygons (e.g. a vector<polygon> or a multi_polygon)
-    \param geometry1 first geometry
-    \param geometry2 second geometry
-    \param output_collection the collection
-    \return true if successful
+\brief \brief_calc2{intersection}
+\ingroup intersection
+\details \details_calc2{intersection, spatial set theoretic intersection}.
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\tparam Collection Collection of geometries (e.g. std::vector, std::deque, boost::geometry::multi*) of which
+    the value_type (below referred to as 'GeometryOut') fulfills a \p_l_or_c concept.
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\param output_collection The collection being filled or extended by the algorithm
+
+\qbk{snippet,intersection_linestring}
 */
 template
 <
Modified: sandbox/geometry/boost/geometry/algorithms/intersects.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/intersects.hpp	(original)
+++ sandbox/geometry/boost/geometry/algorithms/intersects.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -21,14 +21,13 @@
 {
 
 /*!
-    \brief Determine if there is at least one intersection
-        (crossing or self-tangency)
-    \note This function can be called for one geometry (self-intersection) and
-        also for two geometries (intersection)
-    \ingroup intersects
-    \tparam Geometry geometry type
-    \param geometry geometry
-    \return true if there are intersections, else false
+\brief \brief_check{at least one intersection(crossing or self-tangency)}
+\note This function can be called for one geometry (self-intersection) and
+    also for two geometries (intersection)
+\ingroup intersects
+\tparam Geometry geometry type
+\param geometry geometry
+\return \return_check{is self-intersecting}
  */
 template <typename Geometry>
 inline bool intersects(Geometry const& geometry)
@@ -50,13 +49,20 @@
             typename geometry::point_type<Geometry>::type
         >::segment_intersection_strategy_type segment_intersection_strategy_type;
 
+    typedef detail::overlay::get_turn_info
+        <
+            typename point_type<Geometry>::type, 
+            typename point_type<Geometry>::type,
+            turn_info,
+            detail::overlay::assign_null_policy
+        > TurnPolicy;
+
     detail::disjoint::disjoint_interrupt_policy policy;
     detail::self_get_turn_points::get_turns
             <
                 Geometry,
                 std::deque<turn_info>,
-                segment_intersection_strategy_type,
-                detail::overlay::assign_null_policy,
+                TurnPolicy,
                 detail::disjoint::disjoint_interrupt_policy
             >::apply(geometry, turns, policy);
     return policy.has_intersections;
@@ -64,13 +70,13 @@
 
 
 /*!
-    \brief Determine if there is at least one intersection
-    \ingroup intersects
-    \tparam Geometry1 first geometry type
-    \tparam Geometry2 second geometry type
-    \param geometry1 first geometry
-    \param geometry2 second geometry
-    \return true if there are intersection(s), else false
+\brief \brief_check2{have at least one intersection}
+\ingroup intersects
+\tparam Geometry1 \tparam_geometry
+\tparam Geometry2 \tparam_geometry
+\param geometry1 \param_geometry
+\param geometry2 \param_geometry
+\return \return_check2{intersect each other}
  */
 template <typename Geometry1, typename Geometry2>
 inline bool intersects(Geometry1 const& geometry1, Geometry2 const& geometry2)
Modified: sandbox/geometry/boost/geometry/extensions/gis/io/shapelib/shape_creator.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/extensions/gis/io/shapelib/shape_creator.hpp	(original)
+++ sandbox/geometry/boost/geometry/extensions/gis/io/shapelib/shape_creator.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -8,9 +8,10 @@
 #ifndef BOOST_GEOMETRY_EXT_GIS_IO_SHAPELIB_SHAPE_CREATOR_HPP
 #define BOOST_GEOMETRY_EXT_GIS_IO_SHAPELIB_SHAPE_CREATOR_HPP
 
-
+#include <fstream>
 #include "shapefil.h"
 
+
 #include <boost/noncopyable.hpp>
 #include <boost/type_traits/promote.hpp>
 
@@ -78,6 +79,7 @@
     {
         m_shp = ::SHPCreate((name + ".shp").c_str(), ShapeType);
         m_dbf = ::DBFCreate((name + ".dbf").c_str());
+        m_prj_name = name + ".prj";
 
         if (m_shp == NULL || m_dbf == NULL)
         {
@@ -122,10 +124,34 @@
             >::apply(m_dbf, row_index, field_index, value);
     }
 
+    inline void SetSrid(int srid)
+    {
+        if (srid == 28992)
+        {
+            std::ofstream out(m_prj_name.c_str());
+            out << "PROJCS[\"RD_New\""
+                << ",GEOGCS[\"GCS_Amersfoort\""
+                << ",DATUM[\"D_Amersfoort\""
+                << ",SPHEROID[\"Bessel_1841\",6377397.155,299.1528128]]"
+                << ",PRIMEM[\"Greenwich\",0]"
+                << ",UNIT[\"Degree\",0.0174532925199432955]]"
+                << ",PROJECTION[\"Double_Stereographic\"]"
+                << ",PARAMETER[\"False_Easting\",155000]"
+                << ",PARAMETER[\"False_Northing\",463000]"
+                << ",PARAMETER[\"Central_Meridian\",5.38763888888889]"
+                << ",PARAMETER[\"Scale_Factor\",0.9999079]"
+                << ",PARAMETER[\"Latitude_Of_Origin\",52.15616055555555]"
+                << ",UNIT[\"Meter\",1]]"
+                << std::endl;
+        }
+    }
+
 
 private :
     ::SHPHandle m_shp;
     ::DBFHandle m_dbf;
+    std::string m_prj_name;
+
 };
 
 
Modified: sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp	(original)
+++ sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/get_turns.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -34,9 +34,8 @@
     typename MultiTag2,
     typename MultiGeometry1,
     typename MultiGeometry2,
-    typename IntersectionPoints,
-    typename Strategy,
-    typename AssignPolicy,
+    typename Turns,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns
@@ -44,17 +43,15 @@
         MultiTag1, MultiTag2,
         true, true,
         MultiGeometry1, MultiGeometry2,
-        IntersectionPoints,
-        Strategy,
-        AssignPolicy, InterruptPolicy
+        Turns,
+        TurnPolicy, InterruptPolicy
     >
     : detail::get_turns::get_turns_generic
         <
             MultiGeometry1,
             MultiGeometry2,
-            IntersectionPoints,
-            Strategy,
-            AssignPolicy, InterruptPolicy
+            Turns,
+            TurnPolicy, InterruptPolicy
         >
 {};
 
@@ -65,9 +62,8 @@
     typename MultiTag,
     typename SingleGeometry,
     typename MultiGeometry,
-    typename IntersectionPoints,
-    typename Strategy,
-    typename AssignPolicy,
+    typename Turns,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns
@@ -75,17 +71,15 @@
         SingleTag, MultiTag,
         false, true,
         SingleGeometry, MultiGeometry,
-        IntersectionPoints,
-        Strategy,
-        AssignPolicy, InterruptPolicy
+        Turns,
+        TurnPolicy, InterruptPolicy
     >
     : detail::get_turns::get_turns_generic
         <
             SingleGeometry,
             MultiGeometry,
-            IntersectionPoints,
-            Strategy,
-            AssignPolicy, InterruptPolicy
+            Turns,
+            TurnPolicy, InterruptPolicy
         >
 {};
 
@@ -97,9 +91,8 @@
     typename SingleTag,
     typename MultiGeometry,
     typename SingleGeometry,
-    typename IntersectionPoints,
-    typename Strategy,
-    typename AssignPolicy,
+    typename Turns,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct get_turns
@@ -107,17 +100,15 @@
         MultiTag, SingleTag,
         true, false,
         MultiGeometry, SingleGeometry,
-        IntersectionPoints,
-        Strategy,
-        AssignPolicy, InterruptPolicy
+        Turns,
+        TurnPolicy, InterruptPolicy
     >
     : detail::get_turns::get_turns_generic
         <
             MultiGeometry,
             SingleGeometry,
-            IntersectionPoints,
-            Strategy,
-            AssignPolicy, InterruptPolicy
+            Turns,
+            TurnPolicy, InterruptPolicy
         >
 {};
 
Modified: sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/self_turn_points.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/self_turn_points.hpp	(original)
+++ sandbox/geometry/boost/geometry/multi/algorithms/detail/overlay/self_turn_points.hpp	2010-09-04 11:16:56 EDT (Sat, 04 Sep 2010)
@@ -25,23 +25,21 @@
 template
 <
     typename MultiPolygon,
-    typename IntersectionPoints,
-    typename IntersectionStrategy,
-    typename AssignPolicy,
+    typename Turns,
+    typename TurnPolicy,
     typename InterruptPolicy
 >
 struct self_get_turn_points
     <
         multi_polygon_tag, true, MultiPolygon,
-        IntersectionPoints, IntersectionStrategy,
-        AssignPolicy, InterruptPolicy
+        Turns, 
+        TurnPolicy, InterruptPolicy
     >
     : detail::self_get_turn_points::get_turns
         <
             MultiPolygon,
-            IntersectionPoints,
-            IntersectionStrategy,
-            AssignPolicy,
+            Turns,
+            TurnPolicy,
             InterruptPolicy
         >
 {};