$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r63971 - sandbox/geometry/boost/geometry/strategies/concepts
From: barend.gehrels_at_[hidden]
Date: 2010-07-13 13:40:11
Author: barendgehrels
Date: 2010-07-13 13:40:11 EDT (Tue, 13 Jul 2010)
New Revision: 63971
URL: http://svn.boost.org/trac/boost/changeset/63971
Log:
Using function_types now instead of defining first_point_type and second_point_type
Text files modified: 
   sandbox/geometry/boost/geometry/strategies/concepts/distance_concept.hpp |   270 ++++++++++++++++++++++----------------- 
   1 files changed, 153 insertions(+), 117 deletions(-)
Modified: sandbox/geometry/boost/geometry/strategies/concepts/distance_concept.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/strategies/concepts/distance_concept.hpp	(original)
+++ sandbox/geometry/boost/geometry/strategies/concepts/distance_concept.hpp	2010-07-13 13:40:11 EDT (Tue, 13 Jul 2010)
@@ -13,47 +13,28 @@
 
 #include <boost/concept_check.hpp>
 
-#include <boost/geometry/geometries/concepts/point_concept.hpp>
-#include <boost/geometry/geometries/segment.hpp>
+#include <boost/type_traits.hpp>
 
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/plus.hpp>
+
+#include <boost/function_types/function_arity.hpp>
+#include <boost/function_types/is_member_function_pointer.hpp>
+#include <boost/function_types/parameter_types.hpp>
+
+//#define RMP
+#ifdef RMP
+#include <boost/remove_member_pointer.hpp>
+#endif
 
-namespace boost { namespace geometry { namespace concept
-{
-
-namespace detail
-{
-
-template <typename Strategy> struct first_point_type {};
-template <typename Strategy> struct second_point_type {};
-
-// Specializations for strategies having P1,P2,CalculationType
-template <template <typename, typename, typename> class Strategy, typename P1, typename P2, typename C>
-struct first_point_type<Strategy<P1, P2, C> >
-{
-    typedef P1 type;
-};
-
-template <template <typename, typename, typename> class Strategy, typename P1, typename P2, typename C>
-struct second_point_type<Strategy<P1, P2, C> >
-{
-    typedef P2 type;
-};
 
+#include <boost/geometry/geometries/concepts/point_concept.hpp>
+#include <boost/geometry/geometries/segment.hpp>
 
-// Specializations for strategies having P1,P2
-template <template <typename, typename> class Strategy, typename P1, typename P2>
-struct first_point_type<Strategy<P1, P2> >
-{
-    typedef P1 type;
-};
 
-template <template <typename, typename> class Strategy, typename P1, typename P2>
-struct second_point_type<Strategy<P1, P2> >
+namespace boost { namespace geometry { namespace concept
 {
-    typedef P2 type;
-};
-
-}
 
 /*!
     \brief Checks strategy for point-segment-distance
@@ -63,94 +44,149 @@
 struct PointDistanceStrategy
 {
 #ifndef DOXYGEN_NO_CONCEPT_MEMBERS
-    private :
-
-        // Helper to get first_point_type
-        //typedef typename Strategy::first_point_type ptype1;
-        typedef typename detail::first_point_type<Strategy>::type ptype1;
-        BOOST_CONCEPT_ASSERT
-            (
-                (concept::ConstPoint<ptype1>)
-            );
+private :
 
-        // Helper to get second_point_type
-        typedef typename detail::second_point_type<Strategy>::type ptype2;
-        BOOST_CONCEPT_ASSERT
-            (
-                (concept::ConstPoint<ptype2>)
-            );
-
-        // 1) must define meta-function return_type
-        typedef typename strategy::distance::services::return_type<Strategy>::type rtype;
-
-        // 2) must define meta-function "similar_type"
-        typedef typename strategy::distance::services::similar_type
-            <
-                Strategy, ptype2, ptype1
-            >::type stype;
-
-        // 3) must define meta-function "comparable_type"
-        typedef typename strategy::distance::services::comparable_type
-            <
-                Strategy
-            >::type ctype;
-
-        // 4) must define meta-function "tag"
-        typedef typename strategy::distance::services::tag
-            <
-                Strategy
-            >::type tag;
-
-        // 5) must implement apply with arguments
-        struct apply_checker
+    struct checker
+    {
+        template <typename ApplyMethod>
+        static void check(ApplyMethod const&)
         {
-            static void check()
-            {
-                Strategy* str;
-                ptype1 *p1;
-                ptype2 *p2;
-                rtype r = str->apply(*p1, *p2);
-
-                boost::ignore_unused_variable_warning(str);
-                boost::ignore_unused_variable_warning(r);
-            }
-        };
 
-        // 6) must define (meta)struct "get_similar" with apply
-        // 7) must define (meta)struct "get_comparable" with apply
-        // 8) must define (meta)struct "result_from_distance" with apply
-        struct services_checker
-        {
-            static void check()
-            {
-                Strategy* str;
-                stype s = strategy::distance::services::get_similar
-                    <
-                        Strategy,
-                        ptype2, ptype1
-                    >::apply(*str);
-                ctype c = strategy::distance::services::get_comparable
-                    <
-                        Strategy
-                    >::apply(*str);
-                rtype r = strategy::distance::services::result_from_distance
-                    <
-                        Strategy
-                    >::apply(*str, 1.0);
+    #ifdef RMP
+            typedef boost::function_traits
+                <
+                    typename boost::remove_pointer
+                        <
+                            typename boost::remove_member_pointer<ApplyMethod>::type
+                        >::type
+                > ftraits;
+                
+            typedef typename boost::remove_const
+                <
+                    typename boost::remove_reference
+                        <
+                            typename ftraits::arg1_type
+                        >::type
+                >::type ptype1;
+            typedef typename boost::remove_const
+                <
+                    typename boost::remove_reference
+                        <
+                            typename ftraits::arg2_type
+                        >::type
+                >::type ptype2;
+    #else
+
+            typedef typename boost::function_types::parameter_types<ApplyMethod>::type typeseq;
+
+            typedef typename boost::mpl::if_
+                <
+                    boost::function_types::is_member_function_pointer<ApplyMethod>,
+                    boost::mpl::int_<1>,
+                    boost::mpl::int_<0>
+                >::type base_index;
+
+            typedef typename boost::remove_const
+                <
+                    typename boost::remove_reference
+                        <
+                            typename boost::mpl::at
+                                <
+                                    typeseq, 
+                                    base_index
+                                >::type
+                        >::type
+                >::type ptype1;
+
+
+            typedef typename boost::remove_const
+                <
+                    typename boost::remove_reference
+                        <
+                            typename boost::mpl::at
+                                <
+                                    typeseq, 
+                                    typename boost::mpl::plus
+                                        <
+                                            base_index, 
+                                            boost::mpl::int_<1> 
+                                        >::type
+                                >::type
+                        >::type
+                >::type ptype2;
+    #endif
+
+            BOOST_CONCEPT_ASSERT
+                (
+                    (concept::ConstPoint<ptype1>)
+                );
+
+            BOOST_CONCEPT_ASSERT
+                (
+                    (concept::ConstPoint<ptype2>)
+                );
+
+
+            // 1) must define meta-function return_type
+            typedef typename strategy::distance::services::return_type<Strategy>::type rtype;
+
+            // 2) must define meta-function "similar_type"
+            typedef typename strategy::distance::services::similar_type
+                <
+                    Strategy, ptype2, ptype1
+                >::type stype;
+
+            // 3) must define meta-function "comparable_type"
+            typedef typename strategy::distance::services::comparable_type
+                <
+                    Strategy
+                >::type ctype;
+
+            // 4) must define meta-function "tag"
+            typedef typename strategy::distance::services::tag
+                <
+                    Strategy
+                >::type tag;
+
+            // 5) must implement apply with arguments
+            Strategy* str;
+            ptype1 *p1;
+            ptype2 *p2;
+            rtype r = str->apply(*p1, *p2);
+
+            // 6) must define (meta)struct "get_similar" with apply
+            stype s = strategy::distance::services::get_similar
+                <
+                    Strategy,
+                    ptype2, ptype1
+                >::apply(*str);
+
+            // 7) must define (meta)struct "get_comparable" with apply
+            ctype c = strategy::distance::services::get_comparable
+                <
+                    Strategy
+                >::apply(*str);
+
+            // 8) must define (meta)struct "result_from_distance" with apply
+            r = strategy::distance::services::result_from_distance
+                <
+                    Strategy
+                >::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);
+        }
+    };
 
-                boost::ignore_unused_variable_warning(s);
-                boost::ignore_unused_variable_warning(c);
-                boost::ignore_unused_variable_warning(r);
-            }
-        };
 
 
-    public :
-        BOOST_CONCEPT_USAGE(PointDistanceStrategy)
-        {
-            apply_checker::check();
-            services_checker::check();
-        }
+public :
+    BOOST_CONCEPT_USAGE(PointDistanceStrategy)
+    {
+        checker::check(&Strategy::apply);
+    }
 #endif
 };