diff --git a/Packages/Segment_Voronoi_diagram_2/TODO b/Packages/Segment_Voronoi_diagram_2/TODO index c55a06afdfe..87318293073 100644 --- a/Packages/Segment_Voronoi_diagram_2/TODO +++ b/Packages/Segment_Voronoi_diagram_2/TODO @@ -1,4 +1,5 @@ -- make number_of* methods return a size_type +- in the doc change the name of the template parameter for the + point container from SC to PC. - add two different storage sites, one for the case of intersecting segments and one for the case of non-intersecting segments - add boolean parameter in Segment_Voronoi_diagram_2 class that indicates @@ -15,38 +16,9 @@ derive from that; the base class should accomodate different sites, other than points, and also have the capability of having a different type for storage and the actual site. Then derive from that. -- move the definition of the Segment_Voronoi_diagram_hierarchy_vertex_base_2 - class in a separate file - add the methods insert_polyline and insert_polygon that do some optimized insertion for polylines and polygons; add these in both the one-level and hierarchy classes -- remove the macro USE_KERNEL_PREDICATES from the traits classes, once - the traits' interface is finalized -- define the Orientation_2 predicate in the traits but for sites, not - for points. -- replace the Point_container class by a more generic class called - Simple_container_wrapper; the Segment_Voronoi_diagram_2 class - should take as template parameter the real container (by default - std::list) and then inside wrap it. -- remove the typedef for Face_face_map; it is not used -- check if implementing the Face_map as an std::set is faster - than std::map. -- add a boolean template parameter in the Segment_Voronoi_diagram_2 - that indicates if we want to optimize for space or time; in the case of space - use the Edge_list class and a set in add_bogus_vertices; in the case of time - use the In_place_edge_list_class and a vector in add_bogus_vertices -- remove the macros USE_VECTOR, USE_SET from the add_bogus_vertices - method of the Segment_Voronoi_diagram_2 class; use a set (which - should be static) -- remove the macros USE_BF, USE_STD_MAP and USE_INIT from the Edge_list - class; change the class Edge_list so that it takes an additional - boolean template parameter that indicates whether to use Unique_hash_map - of CGAL, or STL's map; use the STL map by default -- remove the macro USE_INPLACE_EDGE_LIST -- check if using an STL map in place of the Unique_hash_map, the edge - list runs faster. Also check if the Edge_vector, Vertex_map and - Face_map can be replaced by implementations using the - Unique_hash_map of CGAL. - fix the bug in insert_third for point - add the check for a segment intersecting an existing point and a point intersecting an existing segment. diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.C b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.C index 68e36bc4acd..cf6c1387f46 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.C +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.C @@ -29,9 +29,9 @@ CGAL_BEGIN_NAMESPACE //-------------------------------------------------------------------- // test method //-------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: is_valid(bool verbose, int level) const { if (level < 0) { return true; } @@ -149,10 +149,10 @@ is_valid(bool verbose, int level) const //-------------------------------------------------------------------- // circumcenter -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Point -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Point +Segment_Voronoi_diagram_2:: circumcenter(const Face_handle& f) const { CGAL_precondition( this->dimension()==2 || !is_infinite(f) ); @@ -161,10 +161,10 @@ circumcenter(const Face_handle& f) const f->vertex(2)->site()); } -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Point -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Point +Segment_Voronoi_diagram_2:: circumcenter(const Site& t0, const Site& t1, const Site& t2) const { @@ -173,10 +173,10 @@ circumcenter(const Site& t0, const Site& t1, } // circumcircle -template< class Gt, class PContainer, class Svdds > +template inline typename Gt::Circle_2 -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: circumcircle(const Face_handle& f) const { CGAL_precondition( this->dimension()==2 || !is_infinite(f) ); @@ -185,20 +185,20 @@ circumcircle(const Face_handle& f) const f->vertex(2)->site()); } -template< class Gt, class PContainer, class Svdds > +template inline typename Gt::Circle_2 -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: circumcircle(const Site& t0, const Site& t1, const Site& t2) const { return Construct_svd_circle_2()(t0, t1, t2); } -template< class Gt, class PContainer, class Svdds > +template inline typename Gt::Line_2 -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: circumcircle(const Point& p0, const Point& p1) const { return @@ -207,20 +207,20 @@ circumcircle(const Point& p0, const Point& p1) const // primal -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Point -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Point +Segment_Voronoi_diagram_2:: primal(const Face_handle& f) const { return circumcenter(f); } -template< class Gt, class PContainer, class Svdds > +template inline Object -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: primal(const Edge e) const { typedef typename Gt::Line_2 Line; @@ -286,10 +286,10 @@ primal(const Edge e) const //-------------------------------------------------------------------- // combinatorial operations //-------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Edge -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Edge +Segment_Voronoi_diagram_2:: flip(Face_handle& f, int i) { CGAL_precondition ( f != NULL ); @@ -303,20 +303,20 @@ flip(Face_handle& f, int i) return Edge(f, ccw(i)); } -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Edge -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Edge +Segment_Voronoi_diagram_2:: flip(Edge e) { return flip(e.first, e.second); } /* -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_in_face(Face_handle& f, const Weighted_point& p) { Vertex_handle v = ds().insert_in_face( f ); @@ -326,10 +326,10 @@ insert_in_face(Face_handle& f, const Weighted_point& p) } */ -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: is_degree_2(const Vertex_handle& v) const { Face_circulator fc = v->incident_faces(); @@ -338,19 +338,19 @@ is_degree_2(const Vertex_handle& v) const return ( fc == fc1 ); } -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_degree_2(Edge e) { return this->_tds.insert_degree_2(e.first,e.second); } -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_degree_2(Edge e, const Storage_site_2& ss) { Vertex_handle v = insert_degree_2(e); @@ -358,10 +358,10 @@ insert_degree_2(Edge e, const Storage_site_2& ss) return v; } -template< class Gt, class PContainer, class Svdds > +template inline void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_degree_2(Vertex_handle v) { CGAL_precondition( is_degree_2(v) ); @@ -371,20 +371,20 @@ remove_degree_2(Vertex_handle v) #if 0 -template< class Gt, class PContainer, class Svdds > +template inline void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_degree_3(Vertex_handle v) { remove_degree_3(v, NULL); } -template< class Gt, class PContainer, class Svdds > +template inline void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_degree_3(Vertex_handle v, Face* f) { CGAL_precondition( v->degree() == 3 ); @@ -396,10 +396,10 @@ remove_degree_3(Vertex_handle v, Face* f) // insertion of site //-------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_first(const Point& p) { CGAL_precondition( number_of_vertices() == 0 ); @@ -412,10 +412,10 @@ insert_first(const Point& p) return v; } -template< class Gt, class PContainer, class Svdds > +template inline -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_second(const Point& p) { CGAL_precondition( number_of_vertices() == 1 ); @@ -431,9 +431,9 @@ insert_second(const Point& p) return create_vertex_dim_up(ss); } -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_third(const Point& p) { CGAL_precondition( number_of_vertices() == 2 ); @@ -444,8 +444,8 @@ insert_third(const Point& p) Site_2 t0 = finite_vertices_begin()->site(); Site_2 t1 = (++finite_vertices_begin())->site(); - // MK: change the equality test between points by the functor in - // geometric traits + // MK::ERROR: change the equality test between points by the functor + // in geometric traits if ( are_same_points(t, t0) ) { return Vertex_handle(finite_vertices_begin()); } @@ -458,12 +458,12 @@ insert_third(const Point& p) Face_handle f(finite_faces_begin()); - Point p1 = f->vertex(0)->site().point(); - Point p2 = f->vertex(1)->site().point(); - Point p3 = f->vertex(2)->site().point(); + Site s1 = f->vertex(0)->site(); + Site s2 = f->vertex(1)->site(); + Site s3 = f->vertex(2)->site(); Orientation o = - geom_traits().orientation_2_object()(p1, p2, p3); + geom_traits().orientation_2_object()(s1, s2, s3); if ( o != COLLINEAR ) { if ( o == RIGHT_TURN ) { @@ -473,6 +473,7 @@ insert_third(const Point& p) } } } else { + // MK::ERROR: // *************************URGENT*************************** // Here I have to test for collinearlity... and maybe more // In particular the code works correctly if the triangle created by @@ -483,9 +484,9 @@ insert_third(const Point& p) return v; } -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: //insert_third(const Point& p0, const Point & p1) insert_third(Vertex_handle v0, Vertex_handle v1) { @@ -512,10 +513,10 @@ insert_third(Vertex_handle v0, Vertex_handle v1) } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: do_intersect(const Site& t, Vertex_handle v) const { if ( is_infinite(v) ) { return false; } @@ -535,9 +536,9 @@ do_intersect(const Site& t, Vertex_handle v) const return false; } -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_point(const Point& p, Vertex_handle vnear) { if ( number_of_vertices() == 0 ) { @@ -658,9 +659,9 @@ insert_point(const Point& p, Vertex_handle vnear) } -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_point(const Storage_site_2& ss, const Site& t, Vertex_handle vnear) { @@ -784,9 +785,9 @@ insert_point(const Storage_site_2& ss, const Site& t, } -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_segment(const Site& t, Vertex_handle vnear, bool insert_endpoints) { @@ -824,9 +825,9 @@ insert_segment(const Site& t, Vertex_handle vnear, } -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_segment2(const Site_2& t, const Storage_site_2& ss, Vertex_handle vnearest, bool insert_endpoints) { @@ -975,9 +976,9 @@ insert_segment2(const Site_2& t, const Storage_site_2& ss, //-------------------------------------------------------------------- // insertion of intersecting site //-------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: insert_intersecting_segment(const Storage_site_2& ss, const Site_2& t, Vertex_handle v) { @@ -1112,9 +1113,9 @@ insert_intersecting_segment(const Storage_site_2& ss, // find conflict region //-------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: initialize_conflict_region(const Face_handle& f, List& l) { @@ -1126,9 +1127,9 @@ initialize_conflict_region(const Face_handle& f, List& l) } -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: expand_conflict_region(const Face_handle& f, const Site& t, const Storage_site_2& ss, List& l, Face_map& fm, @@ -1235,9 +1236,9 @@ expand_conflict_region(const Face_handle& f, const Site& t, // retriangulate conflict region //-------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: add_bogus_vertex(Edge e, List& l) { Edge esym = sym_edge(e); @@ -1269,88 +1270,43 @@ add_bogus_vertex(Edge e, List& l) return v; } -#define USE_VECTOR 0 -#define USE_SET 1 -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_list -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_list +Segment_Voronoi_diagram_2:: add_bogus_vertices(List& l) { Vertex_list vertex_list; -#define MK_STATIC static - //#define MK_STATIC ; - -#if USE_VECTOR - MK_STATIC Edge_vector edge_list; -#elif USE_SET - MK_STATIC std::set edge_list; -#else - MK_STATIC std::map edge_list; -#endif + static std::set edge_list; edge_list.clear(); Edge e_start = l.front(); Edge e = e_start; -#if USE_VECTOR - do { - Edge esym = sym_edge(e); - if ( l.is_in_list(esym) ) { - bool found(false); - typename Edge_vector::iterator it; - for (it = edge_list.begin(); it != edge_list.end(); ++it) { - if ( *it == esym ) { - found = true; - break; - } - } - if ( !found ) { edge_list.push_back(e); } - } - e = l.next(e); - } while ( e != e_start ); - typename Edge_vector::iterator it; -#else do { Edge esym = sym_edge(e); if ( l.is_in_list(esym) && edge_list.find(esym) == edge_list.end() ) { -# if USE_SET edge_list.insert(e); -# else - edge_list[e] = true; -# endif } e = l.next(e); } while ( e != e_start ); -# if USE_SET typename std::set::iterator it; -# else - typename std::map::iterator it; -# endif -#endif for (it = edge_list.begin(); it != edge_list.end(); ++it) { -#if USE_VECTOR - e = *it; -#elif USE_SET - e = *it; -#else - e = it->first; -#endif - Vertex_handle v = add_bogus_vertex(e, l); + Vertex_handle v = add_bogus_vertex(*it, l); vertex_list.push_back(v); } return vertex_list; } -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_bogus_vertices(Vertex_list& vl) { while ( vl.size() > 0 ) { @@ -1361,9 +1317,9 @@ remove_bogus_vertices(Vertex_list& vl) } #if 0 -template< class Gt, class PContainer, class Svdds > -std::vector::Face*> -Segment_Voronoi_diagram_2:: +template +std::vector::Face*> +Segment_Voronoi_diagram_2:: get_faces_for_recycling(Face_map& fm, unsigned int n_wanted) { std::vector vf; @@ -1389,9 +1345,9 @@ get_faces_for_recycling(Face_map& fm, unsigned int n_wanted) } #endif -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: retriangulate_conflict_region(Vertex_handle v, List& l, Face_map& fm) { @@ -1417,17 +1373,16 @@ retriangulate_conflict_region(Vertex_handle v, List& l, } while ( eit != e_start ); // std::vector vf = get_faces_for_recycling(fm, l.size()); - std::list vf; + // std::list vf; - // 3. copy the edge list to a vector of edges and clear the in place + // 3. copy the edge list to a vector of edges and clear the edge // list - typedef typename Svdds::Edge Svdds_edge; - std::vector ve; + std::vector ve; Edge efront = l.front(); Edge e = efront; do { - ve.push_back(Svdds_edge(e.first, e.second)); + ve.push_back(e); e = l.next(e); } while ( e != efront ); @@ -1458,9 +1413,9 @@ retriangulate_conflict_region(Vertex_handle v, List& l, //-------------------------------------------------------------------- // point location //-------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Vertex_handle -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Vertex_handle +Segment_Voronoi_diagram_2:: nearest_neighbor(const Site_2& p, Vertex_handle start_vertex) const { @@ -1541,17 +1496,17 @@ nearest_neighbor(const Site_2& p, //---------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: are_same_points(const Site_2& p, const Site_2& q) const { return geom_traits().are_same_points_2_object()(p, q); } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: same_segments(const Site_2& t, Vertex_handle v) const { if ( is_infinite(v) ) { return false; } @@ -1559,9 +1514,9 @@ same_segments(const Site_2& t, Vertex_handle v) const return same_segments(t, v->site()); } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: same_segments(const Site_2& p, const Site_2& q) const { CGAL_precondition( p.is_segment() && q.is_segment() ); @@ -1573,9 +1528,9 @@ same_segments(const Site_2& p, const Site_2& q) const are_same_points(p.target_site(), q.source_site())); } -template< class Gt, class PContainer, class Svdds > +template inline Oriented_side -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: side_of_bisector(const Site &t1, const Site &t2, const Site &q) const { #if 0 @@ -1590,18 +1545,18 @@ side_of_bisector(const Site &t1, const Site &t2, const Site &q) const } -template< class Gt, class PContainer, class Svdds > +template inline Sign -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: incircle(const Site &t1, const Site &t2, const Site &t3, const Site &q) const { return geom_traits().vertex_conflict_2_object()(t1, t2, t3, q); } -template< class Gt, class PContainer, class Svdds > +template inline Sign -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: incircle(const Site &t1, const Site &t2, const Site &q) const { @@ -1610,9 +1565,9 @@ incircle(const Site &t1, const Site &t2, } -template< class Gt, class PContainer, class Svdds > +template Sign -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: incircle(const Face_handle& f, const Site& q) const { if ( !is_infinite(f) ) { @@ -1633,9 +1588,9 @@ incircle(const Face_handle& f, const Site& q) const } -template< class Gt, class PContainer, class Svdds > +template inline Sign -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: incircle(const Vertex_handle& v0, const Vertex_handle& v1, const Vertex_handle& v) const { @@ -1645,9 +1600,9 @@ incircle(const Vertex_handle& v0, const Vertex_handle& v1, return incircle( v0->site(), v1->site(), v->site()); } -template< class Gt, class PContainer, class Svdds > +template Sign -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: incircle(const Vertex_handle& v0, const Vertex_handle& v1, const Vertex_handle& v2, const Vertex_handle& v) const { @@ -1674,9 +1629,9 @@ incircle(const Vertex_handle& v0, const Vertex_handle& v1, } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: finite_edge_interior(const Site& t1, const Site& t2, const Site& t3, const Site& t4, const Site& q, Sign sgn) const @@ -1685,9 +1640,9 @@ finite_edge_interior(const Site& t1, const Site& t2, geom_traits().finite_edge_interior_conflict_2_object()(t1,t2,t3,t4,q,sgn); } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: finite_edge_interior(const Face_handle& f, int i, const Site& q, Sign sgn) const { @@ -1699,9 +1654,9 @@ finite_edge_interior(const Face_handle& f, int i, f->mirror_vertex(i)->site(), q, sgn); } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: finite_edge_interior(const Vertex_handle& v1, const Vertex_handle& v2, const Vertex_handle& v3, @@ -1716,9 +1671,9 @@ finite_edge_interior(const Vertex_handle& v1, v->site(), sgn); } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: finite_edge_interior_degenerated(const Site& t1, const Site& t2, const Site& t3, const Site& q, Sign sgn) const @@ -1727,9 +1682,9 @@ finite_edge_interior_degenerated(const Site& t1, const Site& t2, geom_traits().finite_edge_interior_conflict_2_object()(t1,t2,t3,q,sgn); } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: finite_edge_interior_degenerated(const Site& t1, const Site& t2, const Site& q, Sign sgn) const { @@ -1738,9 +1693,9 @@ finite_edge_interior_degenerated(const Site& t1, const Site& t2, } -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: finite_edge_interior_degenerated(const Face_handle& f, int i, const Site& q, Sign sgn) const { @@ -1766,9 +1721,9 @@ finite_edge_interior_degenerated(const Face_handle& f, int i, return finite_edge_interior_degenerated(t1, t2, t3, q, sgn); } -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: finite_edge_interior_degenerated(const Vertex_handle& v1, const Vertex_handle& v2, const Vertex_handle& v3, @@ -1798,9 +1753,9 @@ finite_edge_interior_degenerated(const Vertex_handle& v1, return finite_edge_interior_degenerated(t1, t2, t3, q, sgn); } -template< class Gt, class PContainer, class Svdds > +template inline bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: infinite_edge_interior(const Site& t2, const Site& t3, const Site& t4, const Site& q, Sign sgn) const { @@ -1808,9 +1763,9 @@ infinite_edge_interior(const Site& t2, const Site& t3, geom_traits().infinite_edge_interior_conflict_2_object()(t2,t3,t4,q,sgn); } -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: infinite_edge_interior(const Face_handle& f, int i, const Site& q, Sign sgn) const { @@ -1832,9 +1787,9 @@ infinite_edge_interior(const Face_handle& f, int i, } -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: infinite_edge_interior(const Vertex_handle& v1, const Vertex_handle& v2, const Vertex_handle& v3, @@ -1863,9 +1818,9 @@ infinite_edge_interior(const Vertex_handle& v1, -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: edge_interior(const Vertex_handle& v1, const Vertex_handle& v2, const Vertex_handle& v3, @@ -1893,9 +1848,9 @@ edge_interior(const Vertex_handle& v1, } -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: edge_interior(const Face_handle& f, int i, const Site& q, Sign sgn) const { @@ -1923,9 +1878,9 @@ edge_interior(const Face_handle& f, int i, } /* -template< class Gt, class PContainer, class Svdds > -typename Segment_Voronoi_diagram_2::Conflict_type -Segment_Voronoi_diagram_2:: +template +typename Segment_Voronoi_diagram_2::Conflict_type +Segment_Voronoi_diagram_2:: finite_edge_conflict_type_degenerated(const Weighted_point& p1, const Weighted_point& p2, const Weighted_point& q) const @@ -1961,11 +1916,11 @@ finite_edge_conflict_type_degenerated(const Weighted_point& p1, // methods for disk removal //---------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > +template std::pair< -typename Segment_Voronoi_diagram_2::Vertex_handle, -typename Segment_Voronoi_diagram_2::Vertex_handle > -Segment_Voronoi_diagram_2:: +typename Segment_Voronoi_diagram_2::Vertex_handle, +typename Segment_Voronoi_diagram_2::Vertex_handle > +Segment_Voronoi_diagram_2:: endpoint_vertices(Vertex_handle v) const { CGAL_precondition( v->is_segment() ); @@ -1992,9 +1947,9 @@ endpoint_vertices(Vertex_handle v) const return vertices; } -template< class Gt, class PContainer, class Svdds > +template bool -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: is_endpoint_of_segment(Vertex_handle v) const { if ( v->is_segment() ) { return false; } @@ -2017,25 +1972,25 @@ is_endpoint_of_segment(Vertex_handle v) const } -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_first(Vertex_handle v) { Delaunay_graph::remove_first(v); } -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_second(Vertex_handle v) { Delaunay_graph::remove_second(v); } -template< class Gt, class PContainer, class Svdds > +template unsigned int -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_third(Vertex_handle v, bool remove_endpoints) { if ( is_endpoint_of_segment(v) ) { return 0; } @@ -2070,9 +2025,9 @@ remove_third(Vertex_handle v, bool remove_endpoints) } -template< class Gt, class PContainer, class Svdds > +template unsigned int -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove(Vertex_handle v, bool remove_endpoints) { CGAL_precondition( v != Vertex_handle(NULL) ); @@ -2104,9 +2059,9 @@ remove(Vertex_handle v, bool remove_endpoints) return num_removed; } -template< class Gt, class PContainer, class Svdds > +template unsigned int -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_degree_2(Vertex_handle v, bool remove_endpoints) { // segments are at least of degree 4 @@ -2119,9 +2074,9 @@ remove_degree_2(Vertex_handle v, bool remove_endpoints) } -template< class Gt, class PContainer, class Svdds > +template unsigned int -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_degree_3(Vertex_handle v, bool remove_endpoints) { // segments are at least of degree 4 @@ -2133,9 +2088,9 @@ remove_degree_3(Vertex_handle v, bool remove_endpoints) return 1; } -template< class Gt, class PContainer, class Svdds > +template unsigned int -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_degree_d(Vertex_handle v, bool remove_endpoints) { if ( v->is_segment() && remove_endpoints ) { @@ -2162,7 +2117,7 @@ remove_degree_d(Vertex_handle v, bool remove_endpoints) return remove_degree_2(v, remove_endpoints); } - Segment_Voronoi_diagram_2 svd_small; + Segment_Voronoi_diagram_2 svd_small; std::map vmap; @@ -2273,9 +2228,9 @@ remove_degree_d(Vertex_handle v, bool remove_endpoints) } /* -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: remove_degree_d_vertex(Vertex_handle v) { minimize_degree(v); @@ -2289,7 +2244,7 @@ remove_degree_d_vertex(Vertex_handle v) return; } - Segment_Voronoi_diagram_2 ag_small; + Segment_Voronoi_diagram_2 ag_small; std::map vmap; @@ -2375,9 +2330,9 @@ remove_degree_d_vertex(Vertex_handle v) } */ -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: minimize_degree(Vertex_handle v) { CGAL_precondition ( v->degree() > 3 ); @@ -2416,9 +2371,9 @@ minimize_degree(Vertex_handle v) } while ( found || fc != fc_start ); } #if 0 -template< class Gt, class PContainer, class Svdds > +template void -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2:: find_conflict_region_remove(const Vertex_handle& v, const Vertex_handle& vnearest, List& l, Face_map& fm, @@ -2490,10 +2445,10 @@ find_conflict_region_remove(const Vertex_handle& v, //---------------------------------------------------------------------- -template< class Gt, class PContainer, class Svdds > +template typename -Segment_Voronoi_diagram_2::size_type -Segment_Voronoi_diagram_2:: +Segment_Voronoi_diagram_2::size_type +Segment_Voronoi_diagram_2:: number_of_incident_segments(Vertex_handle v) const { CGAL_precondition( v->is_point() ); diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.h index 7343428b729..52553dd2cb3 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.h +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_2.h @@ -40,7 +40,7 @@ #include #include -#include +#include /* Conventions: @@ -58,21 +58,53 @@ CGAL_BEGIN_NAMESPACE -template< class Gt, class PContainer, class DS > + +namespace CGALi { + + template struct SVD_which_list; + + // use the in-place edge list + template + struct SVD_which_list + { + typedef E Edge; + typedef In_place_edge_list List; + }; + + // do not use the in-place edge list + template + struct SVD_which_list + { + typedef E Edge; + // change the following to Tag_false in order to use + // CGAL's Unique_hash_map + typedef Tag_true Use_stl_map_tag; + typedef Edge_list List; + }; + + +} // namespace CGALi + + + + +template class Segment_Voronoi_diagram_hierarchy_2; + // typename PC = Point_container, + // typename PC = Point_container, -template < class Gt, - class PContainer = Point_container, - class DS = Segment_Voronoi_diagram_data_structure_2 < - Segment_Voronoi_diagram_vertex_base_2, - Segment_Voronoi_diagram_face_base_2 > > +template, + class DS = Segment_Voronoi_diagram_data_structure_2 < + Segment_Voronoi_diagram_vertex_base_2, + Segment_Voronoi_diagram_face_base_2 >, + class LTag = Tag_false > class Segment_Voronoi_diagram_2 : private Triangulation_2< Segment_Voronoi_diagram_traits_wrapper_2, DS > { - friend class Segment_Voronoi_diagram_hierarchy_2; + friend class Segment_Voronoi_diagram_hierarchy_2; protected: bool intersection_flag; @@ -133,6 +165,8 @@ protected: typedef typename DG::Vertex Vertex; typedef typename DG::Face Face; + typedef LTag Use_in_place_edge_list_tag; + public: // TYPES //------ @@ -158,17 +192,16 @@ public: typedef typename DG::All_edges_iterator All_edges_iterator; typedef typename DG::Finite_edges_iterator Finite_edges_iterator; - typedef Point_container Point_container; - typedef typename Point_container::Point_handle Point_handle; + typedef Simple_container_wrapper Point_container; + typedef typename Point_container::iterator Point_handle; - typedef typename DG::size_type size_type; + typedef typename DG::size_type size_type; protected: // some more local types typedef typename DS::Vertex_base Vertex_base; typedef std::map Face_map; - typedef std::map Face_face_map; typedef std::vector Edge_vector; typedef std::list Vertex_list; @@ -179,11 +212,8 @@ protected: typename Data_structure::Vertex_base::Storage_site_2 Storage_site_2; // the in place edge list -#ifdef USE_INPLACE_EDGE_LIST - typedef In_place_edge_list List; -#else - typedef Edge_list List; -#endif + typedef typename + CGALi::SVD_which_list::List List; typedef enum { NO_CONFLICT = -1, INTERIOR, LEFT_VERTEX, RIGHT_VERTEX, BOTH_VERTICES, ENTIRE_EDGE } diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_face_base_2.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_face_base_2.h index ec665ea59f2..1e29ff99778 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_face_base_2.h +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_face_base_2.h @@ -24,49 +24,69 @@ #define CGAL_SEGMENT_VORONOI_DIAGRAM_FACE_BASE_2_H #include +#include +//#include +#include -#ifdef USE_INPLACE_EDGE_LIST -# include -#endif CGAL_BEGIN_NAMESPACE -#ifdef USE_INPLACE_EDGE_LIST -template > -class Segment_Voronoi_diagram_face_base_2 - : public Apollonius_graph_face_base_2 -{}; +namespace CGALi { -#else + template + struct SVDFB2_Which_base; -template > + + template + struct SVDFB2_Which_base + { + // MK::ERROR: replace the Apollonius_graph_face_base_2 class by the + // more generic one: Triangulation_face_base_with_edges_2 + // typedef Triangulation_face_base_with_edges_2 Base; + + typedef Apollonius_graph_face_base_2 Base; + }; + + template + struct SVDFB2_Which_base + { + typedef Triangulation_face_base_2 Base; + }; + +} // namespace CGALi + + + +template, + class ADD_EDGES_Tag = Tag_false> class Segment_Voronoi_diagram_face_base_2 - : public Fb + : public CGALi::SVDFB2_Which_base::Base { protected: // local types - typedef typename Fb::Triangulation_data_structure SVDDS; + typedef typename Fb::Triangulation_data_structure DS; public: // TYPES //------ typedef Gt Geom_traits; - typedef Fb Base; + typedef typename + CGALi::SVDFB2_Which_base::Base Base; + // typedef Fb Base; - typedef SVDDS Segment_Voronoi_diagram_data_structure_2; + typedef DS Segment_Voronoi_diagram_data_structure_2; - typedef typename SVDDS::Vertex_handle Vertex_handle; - typedef typename SVDDS::Face_handle Face_handle; - typedef typename SVDDS::Edge Edge; + typedef typename DS::Vertex_handle Vertex_handle; + typedef typename DS::Face_handle Face_handle; + typedef typename DS::Edge Edge; - template + template struct Rebind_TDS { - typedef typename Fb::template Rebind_TDS::Other Vb2; - typedef Segment_Voronoi_diagram_face_base_2 Other; + typedef typename Fb::template Rebind_TDS::Other Vb2; + typedef Segment_Voronoi_diagram_face_base_2 Other; }; @@ -89,7 +109,6 @@ public: : Base(v0,v1,v2,n0,n1,n2) {} }; -#endif CGAL_END_NAMESPACE diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_filtered_traits_2.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_filtered_traits_2.h index e81f129f2d8..8a177aff70b 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_filtered_traits_2.h +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_filtered_traits_2.h @@ -192,12 +192,9 @@ private: //------------------------------- // Predicates for the filtering kernel - -#ifdef USE_KERNEL_PREDICATES typedef typename FK_traits::Compare_x_2 FK_Compare_x_2; typedef typename FK_traits::Compare_y_2 FK_Compare_y_2; typedef typename FK_traits::Orientation_2 FK_Orientation_2; -#endif typedef typename FK_traits::Are_same_points_2 FK_Are_same_points_2; typedef typename FK_traits::Are_parallel_2 FK_Are_parallel_2; @@ -219,11 +216,9 @@ private: typedef typename FK_traits::Oriented_side_2 FK_Oriented_side_2; // Predicates for the exact kernel -#ifdef USE_KERNEL_PREDICATES typedef typename EK_traits::Compare_x_2 EK_Compare_x_2; typedef typename EK_traits::Compare_y_2 EK_Compare_y_2; typedef typename EK_traits::Orientation_2 EK_Orientation_2; -#endif typedef typename EK_traits::Are_same_points_2 EK_Are_same_points_2; typedef typename EK_traits::Are_parallel_2 EK_Are_parallel_2; @@ -249,7 +244,6 @@ private: public: // PREDICATES //----------- -#ifdef USE_KERNEL_PREDICATES typedef Filtered_predicate Compare_x_2; @@ -261,7 +255,7 @@ public: typedef Filtered_predicate Orientation_2; -#endif + typedef Filtered_predicate @@ -325,7 +319,6 @@ public: // PREDICATES //----------- -#ifdef USE_KERNEL_PREDICATES Compare_x_2 compare_x_2_object() const { return Compare_x_2(); @@ -340,7 +333,7 @@ public: orientation_2_object() const { return Orientation_2(); } -#endif + Are_same_points_2 are_same_points_2_object() const { return Are_same_points_2(); diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_hierarchy_2.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_hierarchy_2.h index 3c200e36429..6e55f4f6eff 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_hierarchy_2.h +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_hierarchy_2.h @@ -49,17 +49,17 @@ const unsigned int svd_hierarchy_2__maxlevel = 5; //-------------------------------------------------------------------- template < class Gt, - class PContainer = Point_container, - class Tds = Segment_Voronoi_diagram_data_structure_2< - Segment_Voronoi_diagram_hierarchy_vertex_base_2< - Segment_Voronoi_diagram_vertex_base_2 >, - Segment_Voronoi_diagram_face_base_2 > > + class PC = std::list, + class DS = Segment_Voronoi_diagram_data_structure_2< + Segment_Voronoi_diagram_hierarchy_vertex_base_2< + Segment_Voronoi_diagram_vertex_base_2 >, + Segment_Voronoi_diagram_face_base_2 >, + class LTag = Tag_false> class Segment_Voronoi_diagram_hierarchy_2 - : public Segment_Voronoi_diagram_2 + : public Segment_Voronoi_diagram_2 { public: - typedef Segment_Voronoi_diagram_2 Base; + typedef Segment_Voronoi_diagram_2 Base; typedef typename Base::Geom_traits Geom_traits; @@ -177,14 +177,15 @@ private: int random_level(); }; -template -const int Segment_Voronoi_diagram_hierarchy_2::UNDEFINED_LEVEL = -1; +template +const int +Segment_Voronoi_diagram_hierarchy_2::UNDEFINED_LEVEL = -1; //************************************************************************** //************************************************************************** -template -Segment_Voronoi_diagram_hierarchy_2:: +template +Segment_Voronoi_diagram_hierarchy_2:: Segment_Voronoi_diagram_hierarchy_2(const Geom_traits& traits) : Base(traits), random((long)0) { @@ -195,10 +196,10 @@ Segment_Voronoi_diagram_hierarchy_2(const Geom_traits& traits) // copy constructor duplicates vertices and faces -template -Segment_Voronoi_diagram_hierarchy_2:: +template +Segment_Voronoi_diagram_hierarchy_2:: Segment_Voronoi_diagram_hierarchy_2 -(const Segment_Voronoi_diagram_hierarchy_2 &svd) +(const Segment_Voronoi_diagram_hierarchy_2 &svd) : Base(), random((long)0) { // create an empty triangulation to be able to delete it ! @@ -210,20 +211,20 @@ Segment_Voronoi_diagram_hierarchy_2 //Assignement -template -Segment_Voronoi_diagram_hierarchy_2 & -Segment_Voronoi_diagram_hierarchy_2:: -operator=(const Segment_Voronoi_diagram_hierarchy_2 &svd) +template +Segment_Voronoi_diagram_hierarchy_2 & +Segment_Voronoi_diagram_hierarchy_2:: +operator=(const Segment_Voronoi_diagram_hierarchy_2 &svd) { copy_triangulation(svd); return *this; } -template +template void -Segment_Voronoi_diagram_hierarchy_2:: +Segment_Voronoi_diagram_hierarchy_2:: copy_triangulation -(const Segment_Voronoi_diagram_hierarchy_2 &svd) +(const Segment_Voronoi_diagram_hierarchy_2 &svd) { std::map< Vertex_handle, Vertex_handle > V; { @@ -258,8 +259,8 @@ copy_triangulation hierarchy[0]->pc_ = svd.hierarchy[0]->pc_; } -template -Segment_Voronoi_diagram_hierarchy_2:: +template +Segment_Voronoi_diagram_hierarchy_2:: ~Segment_Voronoi_diagram_hierarchy_2() { clear(); @@ -268,9 +269,9 @@ Segment_Voronoi_diagram_hierarchy_2:: } } -template +template void -Segment_Voronoi_diagram_hierarchy_2:: +Segment_Voronoi_diagram_hierarchy_2:: clear() { for(unsigned int i = 0; i < svd_hierarchy_2__maxlevel; ++i) { @@ -278,19 +279,19 @@ clear() } } -template +template inline -typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle -Segment_Voronoi_diagram_hierarchy_2:: +typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle +Segment_Voronoi_diagram_hierarchy_2:: insert(const Point& p) { return insert_point(p, UNDEFINED_LEVEL); } -template +template inline -typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle -Segment_Voronoi_diagram_hierarchy_2:: +typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle +Segment_Voronoi_diagram_hierarchy_2:: insert_point(const Point& p, int level) { @@ -305,9 +306,9 @@ insert_point(const Point& p, int level) return vertices[0]; } -template +template void -Segment_Voronoi_diagram_hierarchy_2:: +Segment_Voronoi_diagram_hierarchy_2:: insert_point(const Point& p, int level, Vertex_handle* vertices) { CGAL_precondition( level != UNDEFINED_LEVEL ); @@ -342,19 +343,19 @@ insert_point(const Point& p, int level, Vertex_handle* vertices) } -template +template inline -typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle -Segment_Voronoi_diagram_hierarchy_2:: +typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle +Segment_Voronoi_diagram_hierarchy_2:: insert(const Point& p0, const Point& p1) { return insert_segment(p0, p1, UNDEFINED_LEVEL); } -template -typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle -Segment_Voronoi_diagram_hierarchy_2:: +template +typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle +Segment_Voronoi_diagram_hierarchy_2:: insert_segment(const Point& p0, const Point& p1, int level) { if ( level == UNDEFINED_LEVEL ) { @@ -425,9 +426,9 @@ insert_segment(const Point& p0, const Point& p1, int level) } #if 0 -template +template void -Segment_Voronoi_diagram_hierarchy_2:: +Segment_Voronoi_diagram_hierarchy_2:: remove(Vertex_handle v, bool remove_endpoints) { void* u = v->up(); @@ -442,9 +443,9 @@ remove(Vertex_handle v, bool remove_endpoints) } #endif -template -typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle -Segment_Voronoi_diagram_hierarchy_2:: +template +typename Segment_Voronoi_diagram_hierarchy_2::Vertex_handle +Segment_Voronoi_diagram_hierarchy_2:: nearest_neighbor(const Point& p, bool force_point) const { Vertex_handle vnear[svd_hierarchy_2__maxlevel]; @@ -452,9 +453,9 @@ nearest_neighbor(const Point& p, bool force_point) const return vnear[0]; } -template +template void -Segment_Voronoi_diagram_hierarchy_2:: +Segment_Voronoi_diagram_hierarchy_2:: nearest_neighbor(const Site& p, Vertex_handle vnear[svd_hierarchy_2__maxlevel], bool force_point) const @@ -487,9 +488,9 @@ nearest_neighbor(const Site& p, // at level 0 } -template +template int -Segment_Voronoi_diagram_hierarchy_2:: +Segment_Voronoi_diagram_hierarchy_2:: random_level() { unsigned int l = 0; @@ -503,9 +504,9 @@ random_level() } -template +template bool -Segment_Voronoi_diagram_hierarchy_2:: +Segment_Voronoi_diagram_hierarchy_2:: is_valid(bool verbose, int level) const { bool result(true); diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_traits_2.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_traits_2.h index 5e3eab3ae67..d7a5435eabe 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_traits_2.h +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_traits_2.h @@ -55,9 +55,91 @@ void debug_info(char msg[], const T& t) //*********************************************************************** //----------------------------------------------------------------------- -// are same points +// compare x //----------------------------------------------------------------------- +template< class K > +class Svd_compare_x_2 +{ +public: + typedef typename K::Site_2 Site_2; + typedef typename K::Point_2 Point_2; + + typedef Comparison_result result_type; + + struct Arity {}; + +private: + typedef typename K::Compare_x_2 compare_x_2; + +public: + + result_type operator()(const Site_2& p, const Site_2& q) const + { + CGAL_precondition( p.is_point() && q.is_point() ); + return compare_x_2()( p.point(), q.point() ); + } +}; + +//----------------------------------------------------------------------- +// compare y +//----------------------------------------------------------------------- + +template< class K > +class Svd_compare_y_2 +{ +public: + typedef typename K::Site_2 Site_2; + typedef typename K::Point_2 Point_2; + + typedef Comparison_result result_type; + + struct Arity {}; + +private: + typedef typename K::Compare_y_2 compare_y_2; + +public: + + result_type operator()(const Site_2& p, const Site_2& q) const + { + CGAL_precondition( p.is_point() && q.is_point() ); + return compare_y_2()( p.point(), q.point() ); + } +}; + +//----------------------------------------------------------------------- +// orientation +//----------------------------------------------------------------------- + +template< class K > +class Svd_orientation_2 +{ +public: + typedef typename K::Site_2 Site_2; + typedef typename K::Point_2 Point_2; + + typedef Orientation result_type; + + struct Arity {}; + +private: + typedef typename K::Orientation_2 orientation_2; + +public: + + result_type operator()(const Site_2& p, const Site_2& q, + const Site_2& r) const + { + CGAL_precondition( p.is_point() && q.is_point() && r.is_point() ); + return orientation_2()( p.point(), q.point(), r.point() ); + } +}; + + +//----------------------------------------------------------------------- +// are same points +//----------------------------------------------------------------------- template< class K > class Are_same_points_2 @@ -317,8 +399,6 @@ public: }; -#define USE_KERNEL_PREDICATES - //----------------------------------------------------------------------- // the Traits class @@ -365,11 +445,9 @@ public: // PREDICATES //----------- -#ifdef USE_KERNEL_PREDICATES - typedef typename Kernel::Compare_x_2 Compare_x_2; - typedef typename Kernel::Compare_y_2 Compare_y_2; - typedef typename Kernel::Orientation_2 Orientation_2; -#endif + typedef CGAL::Svd_compare_x_2 Compare_x_2; + typedef CGAL::Svd_compare_y_2 Compare_y_2; + typedef CGAL::Svd_orientation_2 Orientation_2; typedef CGAL::Are_same_points_2 Are_same_points_2; typedef CGAL::Are_parallel_2 Are_parallel_2; typedef CGAL::Svd_oriented_side_of_bisector_2 @@ -405,7 +483,6 @@ public: // PREDICATES //----------- -#ifdef USE_KERNEL_PREDICATES Compare_x_2 compare_x_2_object() const { return Compare_x_2(); @@ -420,7 +497,7 @@ public: orientation_2_object() const { return Orientation_2(); } -#endif + Are_same_points_2 are_same_points_2_object() const { return Are_same_points_2(); diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_vertex_base_2.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_vertex_base_2.h index 81a7f6e7fd0..f1ea2445983 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_vertex_base_2.h +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Segment_Voronoi_diagram_vertex_base_2.h @@ -30,7 +30,7 @@ CGAL_BEGIN_NAMESPACE -template < class Gt, class PointHandle, +template < class Gt, class PC, class Vb = Triangulation_ds_vertex_base_2<> > class Segment_Voronoi_diagram_vertex_base_2 : public Vb @@ -40,10 +40,11 @@ private: public: // TYPES //------ - typedef Gt Geom_traits; - typedef PointHandle Point_handle; - typedef Vb Base; - typedef typename Gt::Site_2 Site_2; + typedef Gt Geom_traits; + typedef PC Point_container; + typedef typename Point_container::iterator Point_handle; + typedef Vb Base; + typedef typename Gt::Site_2 Site_2; typedef Segment_Voronoi_diagram_storage_site_2 @@ -57,9 +58,8 @@ public: template < typename DS2 > struct Rebind_TDS { - typedef typename Vb::template Rebind_TDS::Other Vb2; - typedef - Segment_Voronoi_diagram_vertex_base_2 Other; + typedef typename Vb::template Rebind_TDS::Other Vb2; + typedef Segment_Voronoi_diagram_vertex_base_2 Other; }; diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/Simple_container_wrapper.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Simple_container_wrapper.h new file mode 100644 index 00000000000..78c34be7f1a --- /dev/null +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/Simple_container_wrapper.h @@ -0,0 +1,74 @@ +// Copyright (c) 2003,2004 INRIA Sophia-Antipolis (France) and +// Notre Dame University (U.S.A.). All rights reserved. +// +// This file is part of CGAL (www.cgal.org); you may redistribute it under +// the terms of the Q Public License version 1.0. +// See the file LICENSE.QPL distributed with CGAL. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Source$ +// $Revision$ $Date$ +// $Name$ +// +// Author(s) : Menelaos Karavelas + + +#ifndef CGAL_SIMPLE_CONTAINER_WRAPPER_H +#define CGAL_SIMPLE_CONTAINER_WRAPPER_H + +#include +#include + + +CGAL_BEGIN_NAMESPACE + +template +class Simple_container_wrapper +{ +public: + typedef C Container; + typedef typename Container::value_type value_type; + typedef typename Container::iterator iterator; + typedef typename Container::size_type size_type; + +private: + typedef Simple_container_wrapper Self; + +public: + Simple_container_wrapper() {} + + iterator insert(const value_type& t) + { + c.push_back(t); + return --c.end(); + } + + void remove(iterator it) + { + c.erase(it); + } + + void swap(const Self& other) + { + c.swap(other.c); + } + + void clear() { + c.clear(); + } + + size_type size() const { return c.size(); } + +private: + Container c; +}; + + +CGAL_END_NAMESPACE + +#endif // CGAL_SIMPLE_CONTAINER_WRAPPER_H diff --git a/Packages/Segment_Voronoi_diagram_2/include/CGAL/edge_list.h b/Packages/Segment_Voronoi_diagram_2/include/CGAL/edge_list.h index 89f4eae0cbe..cbf1592f039 100644 --- a/Packages/Segment_Voronoi_diagram_2/include/CGAL/edge_list.h +++ b/Packages/Segment_Voronoi_diagram_2/include/CGAL/edge_list.h @@ -1,5 +1,5 @@ -// Copyright (c) 2003 INRIA Sophia-Antipolis (France). -// All rights reserved. +// Copyright (c) 2003,2004 INRIA Sophia-Antipolis (France) and +// Notre Dame University (U.S.A.). All rights reserved. // // This file is part of CGAL (www.cgal.org); you may redistribute it under // the terms of the Q Public License version 1.0. @@ -28,118 +28,131 @@ CGAL_BEGIN_NAMESPACE -#define USE_BF 0 -#define USE_STD_MAP 1 -#define USE_INIT 0 namespace CGALi { -class Edge_hash_function - : public Handle_hash_function -{ -private: - typedef Handle_hash_function Base; - -public: - typedef Base::result_type result_type; - - template - result_type operator()(const Edge& e) const + class Edge_hash_function + : public Handle_hash_function { - return (Base::operator()(e.first)) << e.second; - } -}; + private: + typedef Handle_hash_function Base; + + public: + typedef Base::result_type result_type; + + template + result_type operator()(const Edge& e) const + { + return (Base::operator()(e.first)) << e.second; + } + }; -template -class Edge_list_item -{ -private: - typedef typename Edge::first_type Face_handle; - typedef Edge_list_item Self; - -private: - Edge prev_; - Edge next_; - -public: - // remove the following method and make SENTINEL_EDGE a static const - // member of the class. - static Edge sentinel_edge() { - static Edge SENTINEL_EDGE = Edge(Face_handle(), sentinel_index()); - return SENTINEL_EDGE; - } -private: - static int sentinel_index() { return -1; } - -private: -#if USE_INIT - void init() { - static Edge SENTINEL_EDGE = sentinel_edge(); - init( SENTINEL_EDGE, SENTINEL_EDGE ); - } - - void init(const Edge& prev, const Edge& next) { - next_ = next; - prev_ = prev; - } -#endif - -public: -#if USE_INIT - Edge_list_item() { init(); } - Edge_list_item(const Edge& prev, const Edge& next) - { init(prev, next); } -#else - Edge_list_item() - : prev_(sentinel_edge()), next_(sentinel_edge()) {} - Edge_list_item(const Edge& prev, const Edge& next) - : prev_(prev), next_(next) {} -#endif - - bool is_in_list() const + template + class Edge_list_item { - return ( next_.second != sentinel_index() || - prev_.second != sentinel_index() ); - } + public: + typedef Edge_t Edge; - void set_next(const Edge& next) + private: + typedef typename Edge::first_type Face_handle; + + private: + Edge prev_; + Edge next_; + + public: + // remove the following method and make SENTINEL_EDGE a static const + // member of the class. + static Edge sentinel_edge() { + static Edge SENTINEL_EDGE = Edge(Face_handle(), sentinel_index()); + return SENTINEL_EDGE; + } + + private: + static int sentinel_index() { return -1; } + + public: + Edge_list_item() + : prev_(sentinel_edge()), next_(sentinel_edge()) {} + Edge_list_item(const Edge& prev, const Edge& next) + : prev_(prev), next_(next) {} + + + bool is_in_list() const + { + return ( next_.second != sentinel_index() || + prev_.second != sentinel_index() ); + } + + void set_next(const Edge& next) + { + next_ = next; + } + + void set_previous(const Edge& prev) + { + prev_ = prev; + } + + const Edge& next() const { return next_; } + const Edge& previous() const { return prev_; } + + void reset() { + Edge SENTINEL_EDGE = sentinel_edge(); + next_ = prev_ = SENTINEL_EDGE; + } + }; + + + + template + struct Edge_list_which_map; + + // use STL's map + template + struct Edge_list_which_map { - next_ = next; - } + typedef E_t Edge; + typedef ListItem List_item; + typedef std::map Edge_map; + }; - void set_previous(const Edge& prev) + // use CGAL's Unique_hash_map + template + struct Edge_list_which_map { - prev_ = prev; - } + typedef E_t Edge; + typedef ListItem List_item; + typedef CGALi::Edge_hash_function Hash_function; + + typedef Unique_hash_map Edge_map; + }; - const Edge& next() const { return next_; } - const Edge& previous() const { return prev_; } - void reset() { - Edge SENTINEL_EDGE = sentinel_edge(); - next_ = prev_ = SENTINEL_EDGE; - } -}; } // namespace CGALi -template + + +template class Edge_list { -private: - typedef CGALi::Edge_list_item List_item; -#if USE_STD_MAP - typedef std::map Edge_map; -#else - typedef - Unique_hash_map Edge_map; -#endif - public: // TYPES //====== - typedef std::size_t size_type; + typedef std::size_t size_type; + typedef Edge_t Edge; + typedef USE_STL_MAP_Tag Use_stl_map_tag; + +private: + typedef CGALi::Edge_list_item List_item; + + typedef + CGALi::Edge_list_which_map + Which_map; + + typedef typename Which_map::Edge_map Edge_map; private: // PRIVATE DATA MEMBERS @@ -160,12 +173,6 @@ private: } void insert_before_nocheck(const Edge& e, const Edge& new_e) { -#if USE_BF - Edge old_front = front_; - front_ = e; - push_back(new_e); - front_ = old_front; -#else List_item& li_e = emap[e]; const Edge& prev_e = li_e.previous(); @@ -175,7 +182,50 @@ private: li_e.set_previous(new_e); li_prev_e.set_next(new_e); increase_size(); -#endif + } + + // check whether the edge is in the list; + // the map used is STL's map + bool is_in_list_with_tag(const Edge& e, const Tag_true&) const + { + if ( emap.find(e) == emap.end() ) { return false; } + return emap.find(e)->second.is_in_list(); + } + + // check whether the edge is in the list; + // the map used is CGAL's Unique_hash_map + bool is_in_list_with_tag(const Edge& e, const Tag_false&) const + { + if ( !emap.is_defined(e) ) { return false; } + return emap[e].is_in_list(); + } + + // return the next edge in the list; + // the map used is STL's map + const Edge& next_with_tag(const Edge& e, const Tag_true&) const + { + return emap.find(e)->second.next(); + } + + // return the next edge in the list; + // the map used is CGAL's Unique_hash_map + const Edge& next_with_tag(const Edge& e, const Tag_false&) const + { + return emap[e].next(); + } + + // return the previous edge in the list; + // the map used is STL's map + const Edge& previous_with_tag(const Edge& e, const Tag_true&) const + { + return emap.find(e)->second.previous(); + } + + // return the previous edge in the list; + // the map used is CGAL's Unique_hash_map + const Edge& previous_with_tag(const Edge& e, const Tag_false&) const + { + return emap[e].previous(); } public: @@ -184,23 +234,17 @@ public: Edge_list(const Edge& e = List_item::sentinel_edge() ) : emap(), front_(e), size_(0) {} -public: + // PREDICATES //=========== bool is_valid() const { return true; } bool is_in_list(const Edge& e) const { -#if USE_STD_MAP - if ( emap.find(e) == emap.end() ) { return false; } - return emap.find(e)->second.is_in_list(); - // return li_e.is_in_list(); -#else - if ( !emap.is_defined(e) ) { return false; } - return emap[e].is_in_list(); -#endif + static Use_stl_map_tag map_tag; + return is_in_list_with_tag(e, map_tag); } -public: + // ACCESS METHODS //=============== size_type size() const { @@ -209,20 +253,14 @@ public: const Edge& next(const Edge& e) const { CGAL_precondition( is_in_list(e) ); -#if USE_STD_MAP - return emap.find(e)->second.next(); -#else - return emap[e].next(); -#endif + static Use_stl_map_tag map_tag; + return next_with_tag(e, map_tag); } const Edge& previous(const Edge& e) const { CGAL_precondition( is_in_list(e) ); -#if USE_STD_MAP - return emap.find(e)->second.previous(); -#else - return emap[e].previous(); -#endif + static Use_stl_map_tag map_tag; + return previous_with_tag(e, map_tag); } const Edge& front() const { @@ -235,7 +273,7 @@ public: return previous(front_); } -public: + // INSERTION //========== void push_front(const Edge& e) { @@ -253,26 +291,13 @@ public: return; } -#if USE_BF - Edge last_edge = back(); - emap[e] = List_item(last_edge, front_); - emap[last_edge].set_next(e); - emap[front_].set_previous(e); - increase_size(); -#else insert_before_nocheck(front_, e); -#endif } void insert_after(const Edge& e, const Edge& new_e) { CGAL_precondition( is_in_list(e) ); CGAL_precondition( !is_in_list(new_e) ); -#if USE_BF - Edge old_front = front_; - front_ = emap[e].next(); - push_front(new_e); - front_ = old_front; -#else + List_item& li_e = emap[e]; const Edge& next_e = li_e.next(); @@ -282,7 +307,6 @@ public: li_e.set_next(new_e); li_next_e.set_previous(new_e); increase_size(); -#endif } void insert_before(const Edge& e, const Edge& new_e) { @@ -291,14 +315,10 @@ public: insert_before_nocheck(e, new_e); } -public: + // REPLACEMENT //============ void replace(const Edge& e, const Edge& new_e) { -#if USE_BF - insert_before(e, new_e); - remove(e); -#else CGAL_precondition( is_in_list(e) ); CGAL_precondition( !is_in_list(new_e) ); @@ -310,13 +330,8 @@ public: li_e.reset(); } -#if USE_BF - Edge next_e = li_e.next(); - Edge prev_e = li_e.previous(); -#else const Edge& next_e = li_e.next(); const Edge& prev_e = li_e.previous(); -#endif emap[prev_e].set_next(new_e); emap[next_e].set_previous(new_e); @@ -328,9 +343,9 @@ public: if ( e == front_ ) { front_ = new_e; } -#endif } + // REMOVAL //======== @@ -345,19 +360,8 @@ public: } List_item& li_e = emap[e]; -#if USE_BF - Edge next_e = li_e.next(); - Edge prev_e = li_e.previous(); -#else const Edge& next_e = li_e.next(); const Edge& prev_e = li_e.previous(); -#endif - - // Edge ne = li_e.next(); - // Edge pe = li_e.previous(); - - // emap[pe].set_next(ne); - // emap[ne].set_previous(pe); emap[prev_e].set_next(next_e); emap[next_e].set_previous(prev_e);