$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: huseyinakcan_at_[hidden]
Date: 2007-07-18 23:17:48
Author: huseyinakcan
Date: 2007-07-18 23:17:47 EDT (Wed, 18 Jul 2007)
New Revision: 7473
URL: http://svn.boost.org/trac/boost/changeset/7473
Log:
there is a cycle between stored_halfedge and 
container_gen for halfedge_descriptor that should be fixed.
Text files modified: 
   sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_ds.hpp          |    12 ++++++++++                              
   sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_functions.hpp   |    47 ++++++++++++++++++++------------------- 
   sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.hpp   |    16 +++++-------                            
   sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.t.cpp |    31 +++++++++++++++++--------               
   4 files changed, 64 insertions(+), 42 deletions(-)
Modified: sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_ds.hpp
==============================================================================
--- sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_ds.hpp	(original)
+++ sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_ds.hpp	2007-07-18 23:17:47 EDT (Wed, 18 Jul 2007)
@@ -59,6 +59,9 @@
         
         enum { halfedge_supports_facets= !meta_is_same<FacetS,noFacetS>::value}; 
             // facet config
+
+        typedef typename boost::ct_if<halfedge_has_opposite_member,
+              halfedge_ptr, std::size_t>::type halfedge_descriptor;
     };
 };
 
@@ -80,6 +83,9 @@
         enum { is_target = false }; // has no meaning here 
         
         enum { halfedge_supports_facets = false };
+        
+        typedef typename boost::ct_if<halfedge_has_opposite_member,
+              halfedge_ptr, std::size_t>::type halfedge_descriptor;
     };
 };
 
@@ -102,6 +108,9 @@
         
         enum { halfedge_supports_facets= !meta_is_same<FacetS,noFacetS>::value}; 
             // facet config
+        
+        typedef typename boost::ct_if<halfedge_has_opposite_member,
+              halfedge_ptr, std::size_t>::type halfedge_descriptor;
     };
 };
 
@@ -125,6 +134,9 @@
         
         enum { halfedge_supports_facets= false }; 
             // facet config
+        
+        typedef typename boost::ct_if<halfedge_has_opposite_member,
+              halfedge_ptr, std::size_t>::type halfedge_descriptor;
     };
 };
 
Modified: sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_functions.hpp
==============================================================================
--- sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_functions.hpp	(original)
+++ sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_functions.hpp	2007-07-18 23:17:47 EDT (Wed, 18 Jul 2007)
@@ -19,33 +19,33 @@
 namespace hdstl {
 
 // FREE FUNCTIONS
-template <typename HalfedgeS, typename HalfedgeDescriptor, 
+template <typename HalfedgeS, 
           typename VertexDescriptor, typename FacetDescriptor, typename Config>
-typename halfedge_gen<HalfedgeS, HalfedgeDescriptor, VertexDescriptor, 
+typename halfedge_gen<HalfedgeS,  VertexDescriptor, 
                                    FacetDescriptor, Config>::halfedge_iterator
-halfedges_begin(halfedge_gen<HalfedgeS, HalfedgeDescriptor, VertexDescriptor, 
+halfedges_begin(halfedge_gen<HalfedgeS,  VertexDescriptor, 
                                          FacetDescriptor, Config>& hds) {
-    typedef typename halfedge_gen<HalfedgeS, HalfedgeDescriptor,
+    typedef typename halfedge_gen<HalfedgeS, 
           VertexDescriptor,FacetDescriptor, Config>::ContainerGen ContainerGen;
     return ContainerGen::container_begin(hds.m_container);
 }
 
-template <typename HalfedgeS, typename HalfedgeDescriptor, 
+template <typename HalfedgeS,  
           typename VertexDescriptor, typename FacetDescriptor, typename Config>
-typename halfedge_gen<HalfedgeS, HalfedgeDescriptor, VertexDescriptor, 
+typename halfedge_gen<HalfedgeS, VertexDescriptor, 
                                     FacetDescriptor, Config>::halfedge_iterator
-halfedges_end(halfedge_gen<HalfedgeS, HalfedgeDescriptor, VertexDescriptor, 
+halfedges_end(halfedge_gen<HalfedgeS, VertexDescriptor, 
                                          FacetDescriptor, Config>& hds) {
-    typedef typename halfedge_gen<HalfedgeS, HalfedgeDescriptor,
+    typedef typename halfedge_gen<HalfedgeS, 
           VertexDescriptor,FacetDescriptor, Config>::ContainerGen ContainerGen;
     return ContainerGen::container_end(hds.m_container);
 }
 
-template <typename HalfedgeS, typename HalfedgeDescriptor, 
+template <typename HalfedgeS, 
           typename VertexDescriptor, typename FacetDescriptor, typename Config>
-typename halfedge_gen<HalfedgeS, HalfedgeDescriptor, VertexDescriptor, 
+typename halfedge_gen<HalfedgeS,  VertexDescriptor, 
                                     FacetDescriptor, Config>::size_type
-num_halfedges(halfedge_gen<HalfedgeS, HalfedgeDescriptor, VertexDescriptor, 
+num_halfedges(halfedge_gen<HalfedgeS,  VertexDescriptor, 
                                          FacetDescriptor, Config>& hds) {
     return hds.m_container.size();
 }
@@ -53,8 +53,8 @@
 template<typename HalfedgeS, typename HalfedgeDescriptor>
 struct opposite_function_helper {
     static
-    HalfedgeDescriptor&
-    opposite(HalfedgeDescriptor& h)
+    HalfedgeDescriptor
+    opposite(HalfedgeDescriptor h)
     {
         // halfedges come in pairs, point to each other as
         // opposite. If halfedges stored in a list, use the
@@ -66,8 +66,8 @@
 template<typename HalfedgeDescriptor, typename TraversalS>
 struct opposite_function_helper<halfedgeS<vecS,TraversalS>, HalfedgeDescriptor> {
     static
-    HalfedgeDescriptor&
-    opposite(HalfedgeDescriptor& h)
+    HalfedgeDescriptor
+    opposite(HalfedgeDescriptor h)
     {
         // halfedges come in pairs, point to each other as
         // opposite. If halfedges stored in a vector:
@@ -75,18 +75,19 @@
     }
 };
 
-template <typename HalfedgeS, typename HalfedgeDescriptor, 
+template <typename HalfedgeS,  
           typename VertexDescriptor, typename FacetDescriptor, typename Config>
-HalfedgeDescriptor
-opposite(HalfedgeDescriptor& h, halfedge_gen<HalfedgeS, HalfedgeDescriptor, 
+typename Config::halfedge_descriptor
+opposite(typename Config::halfedge_descriptor h, halfedge_gen<HalfedgeS, 
                                 VertexDescriptor, FacetDescriptor, Config>& hds)
 {
     
-//  typedef typename halfedge_gen<HalfedgeS, HalfedgeDescriptor,
-//                                VertexDescriptor,FacetDescriptor, Config>
-//                                ::halfedge_selector halfedge_selector;
-//  return opposite_function_helper<halfedge_selector,HalfedgeDescriptor>
-//                                 ::opposite(h);
+    typedef typename halfedge_gen<HalfedgeS, 
+                                  VertexDescriptor,FacetDescriptor, Config>
+                                  ::halfedge_selector halfedge_selector;
+    return opposite_function_helper<halfedge_selector,
+                                    typename Config::halfedge_descriptor>
+                                    ::opposite(h);
 }
 
 
Modified: sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.hpp
==============================================================================
--- sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.hpp	(original)
+++ sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.hpp	2007-07-18 23:17:47 EDT (Wed, 18 Jul 2007)
@@ -184,22 +184,22 @@
                    // class halfedge_gen
                    // ==================
 
-template <typename HalfedgeS, typename HalfedgeDescriptor,
+template <typename HalfedgeS,
           typename VertexDescriptor, typename FacetDescriptor, typename Config>
 struct halfedge_gen {
 };
 
 // SPECIALIZATIONS
-template <typename ContainerS, typename TraversalS, typename HalfedgeDescriptor, 
+template <typename ContainerS, typename TraversalS, 
           typename VertexDescriptor, typename FacetDescriptor, typename Config>
-struct halfedge_gen<halfedgeS<ContainerS,TraversalS>, HalfedgeDescriptor, 
+struct halfedge_gen<halfedgeS<ContainerS,TraversalS>,  
                     VertexDescriptor, FacetDescriptor, Config> {
     // TYPES
     typedef halfedgeS<ContainerS,TraversalS>            halfedge_selector;
-    
 
-    typedef stored_halfedge<HalfedgeDescriptor, VertexDescriptor, 
-                               FacetDescriptor, Config> halfedge_type;
+    typedef stored_halfedge<typename Config::halfedge_descriptor, 
+                            VertexDescriptor, FacetDescriptor, 
+                            Config> halfedge_type;
         // The stored halfedge type for this halfedge generator.
 
     typedef container_gen<ContainerS, halfedge_type>    ContainerGen;
@@ -214,9 +214,7 @@
     typedef typename ContainerGen::iterator             halfedge_iterator;
         // The halfedge iterator type for this halfedge generator.
     
-    typedef typename ContainerGen::descriptor           halfedge_descriptor;
-        // The halfedge descriptor type for this halfedge generator.
-
+    typedef Config                                      config;
 
     // DATA
     container_type m_container;
Modified: sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.t.cpp
==============================================================================
--- sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.t.cpp	(original)
+++ sandbox/SOC/2007/geometry/libs/hdstl/dev/halfedge_ds/halfedge_selectors.t.cpp	2007-07-18 23:17:47 EDT (Wed, 18 Jul 2007)
@@ -17,6 +17,7 @@
 #include <boost/hdstl/halfedge_ds/halfedge_functions.hpp>
 #include <boost/hdstl/halfedge_ds/vertex_selectors.hpp>
 #include <boost/hdstl/halfedge_ds/meta_functions.hpp>
+#include <boost/pending/ct_if.hpp>
 
 #include <boost/test/minimal.hpp>
 
@@ -60,6 +61,8 @@
 //                              CLASS HALFEDGE_GEN
 // ===========================================================================
 
+typedef void* halfedge_ptr;
+
 template <typename HalfedgeS, typename VertexS, typename FacetS>
 struct halfedge_config {
     // This halfedge_config to identically replace the halfedge_ds_gen::config
@@ -76,6 +79,8 @@
         is_source = VertexS::is_source,
         halfedge_supports_facets = !meta_is_same<FacetS,noFacetS>::value
     };
+    typedef typename boost::ct_if<halfedge_has_opposite_member,
+                  halfedge_ptr, std::size_t>::type halfedge_descriptor;
 };
 
 template <typename HalfedgeS>
@@ -89,6 +94,8 @@
         is_source = false,
         halfedge_supports_facets = false
     };
+    typedef typename boost::ct_if<halfedge_has_opposite_member,
+                  halfedge_ptr, std::size_t>::type halfedge_descriptor;
 };
 
 template <typename HalfedgeS, typename FacetS>
@@ -102,6 +109,8 @@
         is_source = false,
         halfedge_supports_facets = !meta_is_same<FacetS,noFacetS>::value
     };
+    typedef typename boost::ct_if<halfedge_has_opposite_member,
+                  halfedge_ptr, std::size_t>::type halfedge_descriptor;
 };
 
 template <typename HalfedgeS, typename VertexS>
@@ -115,6 +124,8 @@
         is_source = VertexS::is_source,
         halfedge_supports_facets = false
     };
+    typedef typename boost::ct_if<halfedge_has_opposite_member,
+                  halfedge_ptr, std::size_t>::type halfedge_descriptor;
 };
 
 
@@ -123,19 +134,19 @@
     
     // Types must exist.
     typedef typename HalfedgeGen::halfedge_selector   halfedge_selector;
-    typedef typename HalfedgeGen::halfedge_descriptor halfedge_descriptor;
     typedef typename HalfedgeGen::halfedge_iterator   halfedge_iterator;
     typedef typename HalfedgeGen::halfedge_type       halfedge_type;
     typedef typename HalfedgeGen::container_type      container_type;
+    typedef typename HalfedgeGen::config              config;
 
     halfedge_type fa;
     halfedge_type fb;
     halfedge_type fc;
     halfedge_type fd;
-//  fa.m_opposite = 1;
-//  fb.m_opposite = 2;
-//  fc.m_opposite = 3;
-//  fd.m_opposite = 4;
+    fa.m_opposite = &fb;
+    fb.m_opposite = &fa;
+    fc.m_opposite = &fd;
+    fd.m_opposite = &fc;
     halfedge_type array[] = { fa, fb, fc, fd };  
     
     // Construct a halfedge_gen object whose container contains array.  Verify
@@ -145,6 +156,7 @@
     HalfedgeGen halfedgeGen;
     halfedgeGen.m_container = halfedges;
 
+    BOOST_CHECK(( opposite(*halfedges_begin(halfedgeGen), halfedgeGen) == 1 ));
     return true;
 }
 
@@ -152,7 +164,6 @@
 bool halfedge_gen_requirements() {
     
     typedef typename HalfedgeGen::halfedge_selector   halfedge_selector;
-    typedef typename HalfedgeGen::halfedge_descriptor halfedge_descriptor;
     typedef typename HalfedgeGen::halfedge_iterator   halfedge_iterator;
     typedef typename HalfedgeGen::halfedge_type       halfedge_type;
     typedef typename HalfedgeGen::container_type   container_type;
@@ -217,12 +228,12 @@
     BOOST_CHECK(( halfedge_gen_requirements_void<
                     halfedge_gen<
                       halfedgeS<ContainerS, forwardS<next_in_facet_tag> >, 
-                        int, int, int, 
+                        /*int,*/ int, int, 
                         halfedge_config<
                            halfedgeS<ContainerS, forwardS<next_in_facet_tag> >, 
                         noVertexS, noFacetS> > 
                   >() ));
-    BOOST_CHECK(( halfedge_gen_requirements_void<
+/*    BOOST_CHECK(( halfedge_gen_requirements_void<
                   halfedge_gen<
                   halfedgeS<ContainerS, forwardS<next_at_source_tag> >, 
                   int, int, int, 
@@ -348,14 +359,14 @@
                   halfedgeS<ContainerS, forwardS<next_in_facet_tag> >, 
                   noVertexS, facetS<ContainerS,false> > > 
                   >() ));
-
+*/
     return true;
 }
 
 int test_main(int, char**)
 {
     BOOST_CHECK(( test_container_selector<listS>() ));
-    BOOST_CHECK(( test_container_selector<vecS>() ));
+    //BOOST_CHECK(( test_container_selector<vecS>() ));
     // BOOST_CHECK(( test_container_selector() ));
     return 0;
 }