BWAPI
SPAR/AIModule/BWTA/vendors/CGAL/CGAL/Arrangement_on_surface_2.h
Go to the documentation of this file.
00001 // Copyright (c) 2005-2009 Tel-Aviv University (Israel).
00002 // All rights reserved.
00003 //
00004 // This file is part of CGAL (www.cgal.org); you may redistribute it under
00005 // the terms of the Q Public License version 1.0.
00006 // See the file LICENSE.QPL distributed with CGAL.
00007 //
00008 // Licensees holding a valid commercial license may use this file in
00009 // accordance with the commercial license agreement provided with the software.
00010 //
00011 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00012 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00013 //
00014 // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.5-branch/Arrangement_on_surface_2/include/CGAL/Arrangement_on_surface_2.h $
00015 // $Id: Arrangement_on_surface_2.h 50781 2009-07-23 12:28:10Z efif $
00016 // 
00017 //
00018 // Author(s): Ron Wein          <wein@post.tau.ac.il>
00019 //            Efi Fogel         <efif@post.tau.ac.il>
00020 //            Eric Berberich    <ericb@post.tau.ac.il>
00021 //            (based on old version by: Iddo Hanniel,
00022 //                                      Eyal Flato,
00023 //                                      Oren Nechushtan,
00024 //                                      Ester Ezra,
00025 //                                      Shai Hirsch,
00026 //                                      and Eugene Lipovetsky)
00027 #ifndef CGAL_ARRANGEMENT_ON_SURFACE_2_H
00028 #define CGAL_ARRANGEMENT_ON_SURFACE_2_H
00029 
00034 #include <boost/mpl/assert.hpp>
00035 #include <CGAL/Arr_tags.h>
00036 #include <CGAL/Arr_enums.h>
00037 #include <CGAL/HalfedgeDS_iterator.h>
00038 #include <CGAL/Arrangement_2/Arrangement_2_iterators.h>
00039 #include <CGAL/In_place_list.h>
00040 #include <CGAL/Arr_default_dcel.h>
00041 #include <CGAL/Arr_observer.h>
00042 #include <CGAL/Arr_accessor.h>
00043 #include <CGAL/Arrangement_2/Arr_traits_adaptor_2.h>
00044 #include <CGAL/function_objects.h>
00045 #include <CGAL/Iterator_project.h>
00046 #include <CGAL/Iterator_transform.h>
00047 #include <map>
00048 #include <vector>
00049 #include <algorithm>
00050 
00051 CGAL_BEGIN_NAMESPACE
00052 
00064 template <class GeomTraits_, class TopTraits_> 
00065 class Arrangement_on_surface_2
00066 {
00067 public:
00068 
00069   typedef GeomTraits_                                     Geometry_traits_2;
00070   typedef TopTraits_                                      Topology_traits;
00071 
00072   // first define adaptor ...
00073   typedef Arr_traits_basic_adaptor_2<Geometry_traits_2>   Traits_adaptor_2;
00074   
00075   // .. as it completes (potentially) missing side tags
00076   typedef typename Traits_adaptor_2::Arr_left_side_tag    Arr_left_side_tag;
00077   typedef typename Traits_adaptor_2::Arr_bottom_side_tag  Arr_bottom_side_tag;
00078   typedef typename Traits_adaptor_2::Arr_top_side_tag     Arr_top_side_tag;
00079   typedef typename Traits_adaptor_2::Arr_right_side_tag   Arr_right_side_tag;
00080   
00081   BOOST_MPL_ASSERT(
00082       (typename 
00083        Arr_sane_identified_tagging< Arr_left_side_tag, Arr_bottom_side_tag, 
00084        Arr_top_side_tag, Arr_right_side_tag >::result)
00085   );
00086 
00087 public:
00088   
00089   typedef Arrangement_on_surface_2<Geometry_traits_2,
00090                                    Topology_traits>       Self;
00091 
00092   typedef typename Geometry_traits_2::Point_2             Point_2;
00093   typedef typename Geometry_traits_2::X_monotone_curve_2  X_monotone_curve_2;
00094 
00095   // maybe remove this in a future version (that supports complete handling
00096   // of all sides)
00097   typedef typename Arr_are_all_sides_oblivious_tag< 
00098     Arr_left_side_tag, Arr_bottom_side_tag, 
00099     Arr_top_side_tag, Arr_right_side_tag >::result
00100   Are_all_sides_oblivious_tag;
00101   
00102 public:
00103 
00104   typedef typename Topology_traits::Dcel                  Dcel;
00105   typedef typename Dcel::Size                             Size;
00106 
00107 protected:
00108 
00109   friend class Arr_observer<Self>;
00110   friend class Arr_accessor<Self>;
00111   
00112   // Internal DCEL types:
00113   typedef typename Dcel::Vertex                     DVertex;
00114   typedef typename Dcel::Halfedge                   DHalfedge;
00115   typedef typename Dcel::Face                       DFace;
00116   typedef typename Dcel::Outer_ccb                  DOuter_ccb;
00117   typedef typename Dcel::Inner_ccb                  DInner_ccb;
00118   typedef typename Dcel::Isolated_vertex            DIso_vertex;
00119 
00120   typedef typename Dcel::difference_type            DDifference;  
00121   typedef typename Dcel::iterator_category          DIterator_category;
00122 
00123   typedef typename Dcel::Vertex_iterator            DVertex_iter;
00124   typedef typename Dcel::Vertex_const_iterator      DVertex_const_iter;
00125 
00126   typedef typename Dcel::Halfedge_iterator          DHalfedge_iter;
00127   typedef typename Dcel::Halfedge_const_iterator    DHalfedge_const_iter;
00128 
00129   typedef typename Dcel::Edge_iterator              DEdge_iter;
00130   typedef typename Dcel::Edge_const_iterator        DEdge_const_iter;
00131 
00132   typedef typename Dcel::Face_iterator              DFace_iter;
00133   typedef typename Dcel::Face_const_iterator        DFace_const_iter;
00134 
00135   typedef typename DFace::Outer_ccb_iterator        DOuter_ccb_iter;
00136   typedef typename DFace::Outer_ccb_const_iterator  DOuter_ccb_const_iter;
00137 
00138   typedef typename DFace::Inner_ccb_iterator        DInner_ccb_iter;
00139   typedef typename DFace::Inner_ccb_const_iterator  DInner_ccb_const_iter;
00140 
00141   typedef typename DFace::Isolated_vertex_iterator
00142                                                     DIso_vertex_iter;
00143   typedef typename DFace::Isolated_vertex_const_iterator
00144                                                     DIso_vertex_const_iter;
00145 
00146 protected:
00147 
00151   class _Is_concrete_vertex
00152   {
00153   private:
00154 
00155     const Topology_traits  *m_topol_traits;
00156 
00157   public:
00158 
00159     _Is_concrete_vertex () :
00160       m_topol_traits (NULL)
00161     {}
00162 
00163     _Is_concrete_vertex (const Topology_traits * topol_traits) :
00164       m_topol_traits (topol_traits)
00165     {}
00166 
00167     bool operator() (const DVertex& v) const
00168     {
00169       if (m_topol_traits == NULL)
00170         return (true);
00171 
00172       return (m_topol_traits->is_concrete_vertex (&v));
00173     }
00174   };
00175 
00179   class _Is_valid_vertex
00180   {
00181   private:
00182 
00183     const Topology_traits * m_topol_traits;
00184 
00185   public:
00186 
00187     _Is_valid_vertex () :
00188       m_topol_traits (NULL)
00189     {}
00190 
00191     _Is_valid_vertex (const Topology_traits * topol_traits) :
00192       m_topol_traits (topol_traits)
00193     {}
00194 
00195     bool operator() (const DVertex& v) const
00196     {
00197       if (m_topol_traits == NULL)
00198         return (true);
00199 
00200       return (m_topol_traits->is_valid_vertex (&v));
00201     }
00202   };
00203 
00207   class _Is_valid_halfedge
00208   {
00209   private:
00210 
00211     const Topology_traits  *m_topol_traits;
00212 
00213   public:
00214 
00215     _Is_valid_halfedge () :
00216       m_topol_traits (NULL)
00217     {}
00218 
00219     _Is_valid_halfedge (const Topology_traits * topol_traits) :
00220       m_topol_traits (topol_traits)
00221     {}
00222 
00223     bool operator() (const DHalfedge& he) const
00224     {
00225       if (m_topol_traits == NULL)
00226         return (true);
00227 
00228       return (m_topol_traits->is_valid_halfedge (&he));
00229     }
00230   };
00231 
00235   class _Is_valid_face
00236   {
00237   private:
00238 
00239     const Topology_traits  *m_topol_traits;
00240 
00241   public:
00242 
00243     _Is_valid_face () :
00244       m_topol_traits (NULL)
00245     {}
00246 
00247     _Is_valid_face (const Topology_traits * topol_traits) :
00248       m_topol_traits (topol_traits)
00249     {}
00250 
00251     bool operator() (const DFace& f) const
00252     {
00253       if (m_topol_traits == NULL)
00254         return (true);
00255 
00256       return (m_topol_traits->is_valid_face (&f));
00257     }
00258   };
00259 
00263   class _Is_unbounded_face
00264   {
00265   private:
00266 
00267     const Topology_traits * m_topol_traits;
00268 
00269   public:
00270 
00271     _Is_unbounded_face () :
00272       m_topol_traits (NULL)
00273     {}
00274 
00275     _Is_unbounded_face (const Topology_traits * topol_traits) :
00276       m_topol_traits (topol_traits)
00277     {}
00278 
00279     const Topology_traits * topology_traits() const { return m_topol_traits; }
00280 
00281     bool operator() (const DFace& f) const
00282     {
00283       return (m_topol_traits->is_valid_face (&f) &&
00284               m_topol_traits->is_unbounded (&f));
00285     }
00286   };
00287 
00288 public:
00289 
00290   // Forward declerations:
00291   class Vertex;
00292   class Halfedge;
00293   class Face;
00294 
00295   // Definition of the halfedge data-structure itereators and circulators:
00296   typedef I_Filtered_iterator
00297     <DVertex_iter, _Is_concrete_vertex,
00298      Vertex, DDifference,
00299      DIterator_category>                          Vertex_iterator;
00300   
00301   typedef I_Filtered_const_iterator
00302     <DVertex_const_iter, _Is_concrete_vertex,
00303      DVertex_iter, Vertex,
00304      DDifference, DIterator_category>             Vertex_const_iterator;
00305   
00306   typedef I_Filtered_iterator
00307     <DHalfedge_iter, _Is_valid_halfedge, 
00308      Halfedge, DDifference,
00309      DIterator_category>                          Halfedge_iterator;
00310   
00311   typedef I_Filtered_const_iterator
00312     <DHalfedge_const_iter, _Is_valid_halfedge,
00313      DHalfedge_iter, Halfedge, DDifference,
00314      DIterator_category>                          Halfedge_const_iterator;
00315 
00320   class Edge_iterator :
00321     public I_Filtered_iterator<DEdge_iter, _Is_valid_halfedge,
00322                                Halfedge, DDifference,
00323                                DIterator_category>
00324   {
00325     typedef I_Filtered_iterator<DEdge_iter, 
00326                                 _Is_valid_halfedge,
00327                                 Halfedge, DDifference,
00328                                 DIterator_category>          Base;
00329 
00330   public:
00331  
00332     Edge_iterator ()
00333     {}
00334 
00335     Edge_iterator (DEdge_iter iter, DEdge_iter iend,
00336                    const _Is_valid_halfedge& pred) :
00337       Base (iter, iend, pred)
00338     {}
00339 
00340     // Casting to a halfedge iterator.
00341     operator Halfedge_iterator () const
00342     {
00343       return (Halfedge_iterator (DHalfedge_iter (this->current_iterator())));
00344     }
00345 
00346     operator Halfedge_const_iterator () const
00347     {
00348       return (Halfedge_const_iterator 
00349               (DHalfedge_const_iter (this->current_iterator())));
00350     }    
00351   };
00352 
00353   class Edge_const_iterator :
00354     public I_Filtered_const_iterator<DEdge_const_iter,
00355                                      _Is_valid_halfedge,
00356                                      DEdge_iter,
00357                                      Halfedge, DDifference,
00358                                      DIterator_category>
00359   {
00360     typedef I_Filtered_const_iterator<DEdge_const_iter,
00361                                       _Is_valid_halfedge,
00362                                       DEdge_iter,
00363                                       Halfedge, DDifference,
00364                                       DIterator_category>    Base;
00365 
00366   public:
00367  
00368     Edge_const_iterator ()
00369     {}
00370 
00371     Edge_const_iterator (Edge_iterator iter) :
00372       Base (iter.current_iterator(),
00373             iter.past_the_end(),
00374             iter.filter())
00375     {}
00376 
00377     Edge_const_iterator (DEdge_const_iter iter, DEdge_const_iter iend,
00378                          const _Is_valid_halfedge& pred) :
00379       Base (iter, iend, pred)
00380     {}
00381 
00382     // Casting to a halfedge iterator.
00383     operator Halfedge_const_iterator () const
00384     {
00385       return (Halfedge_const_iterator 
00386               (DHalfedge_const_iter (this->current_iterator())));
00387     }
00388   };
00389   
00390   typedef I_Filtered_iterator
00391     <DFace_iter, _Is_valid_face,
00392      Face, DDifference,
00393      DIterator_category>                          Face_iterator;
00394   
00395   typedef I_Filtered_const_iterator
00396     <DFace_const_iter, _Is_valid_face, 
00397      DFace_iter, Face,
00398      DDifference, DIterator_category>             Face_const_iterator;
00399 
00400   typedef _HalfedgeDS_vertex_circ
00401     <Halfedge, Halfedge_iterator,
00402      Bidirectional_circulator_tag>    Halfedge_around_vertex_circulator;
00403 
00404   typedef _HalfedgeDS_vertex_const_circ
00405     <Halfedge,
00406      Halfedge_const_iterator,
00407      Bidirectional_circulator_tag>    Halfedge_around_vertex_const_circulator;
00408 
00409   typedef _HalfedgeDS_facet_circ
00410     <Halfedge,
00411      Halfedge_iterator,
00412      Bidirectional_circulator_tag>    Ccb_halfedge_circulator;
00413 
00414   typedef _HalfedgeDS_facet_const_circ
00415     <Halfedge,
00416      Halfedge_const_iterator,
00417      Bidirectional_circulator_tag>    Ccb_halfedge_const_circulator;
00418 
00423   class Unbounded_face_iterator :
00424     public I_Filtered_iterator<DFace_iter, _Is_unbounded_face,
00425                                Face, DDifference,
00426                                DIterator_category>
00427   {
00428     typedef I_Filtered_iterator<DFace_iter,
00429                                 _Is_unbounded_face,
00430                                 Face, DDifference,
00431                                 DIterator_category>         Base;
00432 
00433   public:
00434  
00435     Unbounded_face_iterator ()
00436     {}
00437 
00438     Unbounded_face_iterator (DFace_iter iter, DFace_iter iend,
00439                              const _Is_unbounded_face & is_unbounded) :
00440       Base (iter, iend, is_unbounded)
00441     {}
00442 
00443     // Casting to a face iterator.
00444     operator Face_iterator () const
00445     {
00446       return (Face_iterator (DFace_iter (this->current_iterator()),
00447                              DFace_iter (this->past_the_end()),
00448                              _Is_valid_face(this->filter().topology_traits())));
00449     }
00450 
00451     operator Face_const_iterator () const
00452     {
00453       return (Face_const_iterator
00454               (DFace_const_iter (this->current_iterator()),
00455                DFace_const_iter (this->past_the_end()),
00456                _Is_valid_face(this->filter().topology_traits())));
00457     }    
00458   };
00459 
00460   class Unbounded_face_const_iterator :
00461     public I_Filtered_const_iterator<DFace_const_iter,
00462                                      _Is_unbounded_face, 
00463                                      DFace_iter, Face,
00464                                      DDifference,
00465                                      DIterator_category>
00466   {
00467     typedef I_Filtered_const_iterator<DFace_const_iter,
00468                                       _Is_unbounded_face, 
00469                                       DFace_iter, Face,
00470                                       DDifference,
00471                                       DIterator_category>   Base;
00472 
00473   public:
00474  
00475     Unbounded_face_const_iterator ()
00476     {}
00477 
00478     Unbounded_face_const_iterator (Unbounded_face_iterator iter) :
00479       Base (iter)
00480     {}
00481 
00482     Unbounded_face_const_iterator (DFace_const_iter iter,
00483                                    DFace_const_iter iend,
00484                                    const _Is_unbounded_face & is_unbounded) :
00485       Base (iter, iend, is_unbounded)
00486     {}
00487 
00488     // Casting to a face iterator.
00489     operator Face_const_iterator () const
00490     {
00491       return (Face_const_iterator (DFace_const_iter(this->current_iterator()),
00492                                    DFace_const_iter(this->past_the_end())));
00493     }
00494   };
00495 
00496 protected:
00497 
00498   struct _Halfedge_to_ccb_circulator
00499   {
00500     typedef DHalfedge*               argument_type;
00501     typedef Ccb_halfedge_circulator  result_type;
00502  
00503     result_type operator() (argument_type s) const
00504     {
00505       return Ccb_halfedge_circulator (Halfedge_iterator (s));
00506     }
00507   };
00508 
00509   struct _Const_halfedge_to_ccb_circulator
00510   {
00511     typedef const DHalfedge*               argument_type;
00512     typedef Ccb_halfedge_const_circulator  result_type;
00513  
00514     result_type operator() (argument_type s) const
00515     {
00516       return Ccb_halfedge_const_circulator (Halfedge_const_iterator (s));
00517     }
00518   };
00519 
00520   typedef Cast_function_object<DVertex, Vertex>   _Vertex_to_vertex;
00521 
00522 public:
00523   
00524   typedef Iterator_transform<DOuter_ccb_iter,
00525                              _Halfedge_to_ccb_circulator>
00526                                       Outer_ccb_iterator;
00527 
00528   typedef Iterator_transform<DOuter_ccb_const_iter,
00529                              _Const_halfedge_to_ccb_circulator> 
00530                                       Outer_ccb_const_iterator;
00531 
00532   typedef Iterator_transform<DInner_ccb_iter,
00533                              _Halfedge_to_ccb_circulator>
00534                                       Inner_ccb_iterator;
00535 
00536   typedef Iterator_transform<DInner_ccb_const_iter,
00537                              _Const_halfedge_to_ccb_circulator> 
00538                                       Inner_ccb_const_iterator;
00539 
00544   class Isolated_vertex_iterator :
00545     public Iterator_project<DIso_vertex_iter,
00546                             _Vertex_to_vertex>
00547   {
00548     typedef Iterator_project<DIso_vertex_iter,
00549                              _Vertex_to_vertex>         Base;
00550 
00551   public:
00552 
00553     Isolated_vertex_iterator ()
00554     {}
00555 
00556     Isolated_vertex_iterator (DIso_vertex_iter iter) :
00557       Base (iter)
00558     {}
00559 
00560     // Casting to a vertex iterator.
00561     operator Vertex_iterator () const
00562     {
00563       return (Vertex_iterator (DVertex_iter (this->ptr())));
00564     }
00565 
00566     operator Vertex_const_iterator () const
00567     {
00568       return (Vertex_const_iterator (DVertex_const_iter (this->ptr())));
00569     }
00570   };
00571   
00572   class Isolated_vertex_const_iterator :
00573     public Iterator_project<DIso_vertex_const_iter,
00574                             _Vertex_to_vertex>
00575   {
00576     typedef Iterator_project<DIso_vertex_const_iter,
00577                              _Vertex_to_vertex>          Base;
00578 
00579   public:
00580 
00581     Isolated_vertex_const_iterator ()
00582     {}
00583 
00584     Isolated_vertex_const_iterator (Isolated_vertex_iterator iter) :
00585       Base (iter)
00586     {}
00587 
00588     Isolated_vertex_const_iterator (DIso_vertex_const_iter iter) :
00589       Base (iter)
00590     {}
00591 
00592     // Casting to a vertex iterator.
00593     operator Vertex_const_iterator () const
00594     {
00595       return (Vertex_const_iterator (DVertex_const_iter (this->ptr())));
00596     }
00597   };
00598 
00599 protected:
00600 
00601   class _Valid_vertex_iterator :
00602     public I_Filtered_iterator<DVertex_iter,
00603                                _Is_valid_vertex, Vertex,
00604                                DDifference,
00605                                DIterator_category>
00606   {
00607     typedef I_Filtered_iterator<DVertex_iter,
00608                                 _Is_valid_vertex, Vertex,
00609                                 DDifference,
00610                                 DIterator_category>               Base;
00611 
00612    public:
00613   
00614     _Valid_vertex_iterator ()
00615     {}
00616 
00617     _Valid_vertex_iterator (DVertex_iter iter, DVertex_iter iend,
00618                             const _Is_valid_vertex& pred) :
00619       Base (iter, iend, pred)
00620     {}
00621 
00622     // Casting to a vertex iterator.
00623     operator Vertex_iterator () const
00624     {
00625       return (Vertex_iterator (DVertex_iter (this->current_iterator())));
00626     }
00627 
00628     operator Vertex_const_iterator () const
00629     {
00630       return (Vertex_const_iterator (DVertex_const_iter
00631                                      (this->current_iterator())));
00632     }
00633   };
00634 
00635 public:
00636 
00637   // Definition of handles (equivalent to iterators):
00638   typedef Vertex_iterator              Vertex_handle;
00639   typedef Halfedge_iterator            Halfedge_handle;
00640   typedef Face_iterator                Face_handle;
00641 
00642   typedef Vertex_const_iterator        Vertex_const_handle;
00643   typedef Halfedge_const_iterator      Halfedge_const_handle;
00644   typedef Face_const_iterator          Face_const_handle;
00645 
00649   class Vertex : public DVertex
00650   {
00651     typedef DVertex               Base;
00652 
00653   public:
00654 
00656     Vertex()
00657     {}
00658 
00660     CGAL_DEPRECATED bool is_at_infinity() const
00661     { return (Base::has_null_point()); }
00662 
00664     bool is_at_open_boundary () const
00665     {
00666       return (Base::has_null_point());
00667     }
00668 
00670     Size degree () const
00671     {
00672       if (this->is_isolated())
00673         return (0);
00674 
00675       // Go around the vertex and count the incident halfedges.
00676       const DHalfedge  *he_first = Base::halfedge();
00677       const DHalfedge  *he_curr = he_first;
00678       Size              n = 0;
00679 
00680       if (he_curr != NULL)
00681       {
00682         do
00683         {
00684           n++;
00685           he_curr = he_curr->next()->opposite();
00686         } while (he_curr != he_first);
00687       }
00688       return (n);
00689     }
00690 
00695     Halfedge_around_vertex_circulator incident_halfedges() 
00696     {
00697       CGAL_precondition (! this->is_isolated());
00698 
00699       return Halfedge_around_vertex_circulator
00700         (DHalfedge_iter (Base::halfedge()));
00701     }
00702 
00707     Halfedge_around_vertex_const_circulator incident_halfedges() const 
00708     {
00709       CGAL_precondition (! this->is_isolated());
00710 
00711       return Halfedge_around_vertex_const_circulator
00712         (DHalfedge_const_iter (Base::halfedge())); 
00713     }
00714 
00719     Face_handle face()
00720     {
00721       CGAL_precondition (this->is_isolated());
00722 
00723       return (DFace_iter (Base::isolated_vertex()->face()));
00724     }
00725 
00730     Face_const_handle face() const
00731     {
00732       CGAL_precondition (this->is_isolated());
00733 
00734       return (DFace_const_iter (Base::isolated_vertex()->face()));
00735     }
00736 
00737   private:
00738 
00739     // Blocking access to inherited functions from the Dcel::Vertex.
00740     bool has_null_point () const;
00741     void set_point (Point_2* );
00742     void set_boundary (Arr_parameter_space , Arr_parameter_space );
00743     const DHalfedge* halfedge () const;
00744     DHalfedge* halfedge ();
00745     void set_halfedge (DHalfedge* );
00746     const DIso_vertex* isolated_vertex () const;
00747     DIso_vertex* isolated_vertex ();
00748     void set_isolated_vertex (DIso_vertex* );
00749   };
00750 
00754   class Halfedge : public DHalfedge
00755   {
00756     typedef DHalfedge             Base;
00757 
00758   public:
00759 
00761     Halfedge ()
00762     {}
00763 
00765     bool is_fictitious () const
00766     {
00767       return (Base::has_null_curve());
00768     }
00769 
00771     Vertex_handle source ()
00772     {
00773       return (DVertex_iter (Base::opposite()->vertex()));
00774     }
00775 
00777     Vertex_const_handle source () const
00778     {
00779       return (DVertex_const_iter (Base::opposite()->vertex()));
00780     }
00781     
00783     Vertex_handle target ()
00784     {
00785       return (DVertex_iter (Base::vertex()));
00786     }
00787 
00789     Vertex_const_handle target () const
00790     {
00791       return (DVertex_const_iter (Base::vertex()));
00792     }
00793     
00795     Face_handle face()
00796     {
00797       if (! Base::is_on_inner_ccb())
00798         return (DFace_iter (Base::outer_ccb()->face()));
00799       else
00800         return (DFace_iter (Base::inner_ccb()->face()));
00801     }
00802 
00804     Face_const_handle face() const
00805     {
00806       if (! Base::is_on_inner_ccb())
00807         return (DFace_const_iter (Base::outer_ccb()->face()));
00808       else
00809         return (DFace_const_iter (Base::inner_ccb()->face()));
00810     }
00811 
00813     Halfedge_handle twin()
00814     {
00815       return (DHalfedge_iter (Base::opposite()));
00816     }
00817 
00819     Halfedge_const_handle twin() const 
00820     {
00821       return (DHalfedge_const_iter (Base::opposite()));
00822     }
00823 
00825     Halfedge_handle prev () 
00826     { 
00827       return (DHalfedge_iter (Base::prev()));
00828     }
00829 
00831     Halfedge_const_handle prev () const 
00832     { 
00833       return (DHalfedge_const_iter (Base::prev()));
00834     }
00835 
00837     Halfedge_handle next () 
00838     { 
00839       return (DHalfedge_iter (Base::next()));
00840     }
00841 
00843     Halfedge_const_handle next () const 
00844     { 
00845       return (DHalfedge_const_iter (Base::next()));
00846     }
00847 
00849     Ccb_halfedge_circulator ccb ()
00850     { 
00851       return Ccb_halfedge_circulator (DHalfedge_iter (this));
00852     }
00853 
00855     Ccb_halfedge_const_circulator ccb () const
00856     { 
00857       return Ccb_halfedge_const_circulator (DHalfedge_const_iter (this));
00858     }
00859 
00860   private:
00861 
00862     // Blocking access to inherited functions from the Dcel::Halfedge.
00863     bool has_null_curve () const;
00864     void set_curve (X_monotone_curve_2* );
00865     const DHalfedge* opposite () const;
00866     DHalfedge* opposite ();
00867     void set_opposite (DHalfedge* );
00868     void set_direction (Arr_halfedge_direction );
00869     void set_prev (DHalfedge* );
00870     void set_next (DHalfedge* );
00871     const DVertex* vertex () const ;
00872     DVertex* vertex ();
00873     void set_vertex (DVertex* );
00874     const DOuter_ccb* outer_ccb () const;
00875     DOuter_ccb* outer_ccb ();
00876     void set_outer_ccb (DOuter_ccb* );
00877     const DInner_ccb* inner_ccb () const;
00878     DInner_ccb* inner_ccb ();
00879     void set_inner_ccb (DInner_ccb* );
00880   };
00881 
00885   class Face : public DFace
00886   {
00887     typedef DFace                 Base;
00888 
00889   public:
00890 
00892     Face()
00893     {}
00894 
00896     Outer_ccb_iterator outer_ccbs_begin() 
00897     {
00898       return (DOuter_ccb_iter (Base::outer_ccbs_begin()));
00899     }
00900 
00902     Outer_ccb_const_iterator outer_ccbs_begin() const
00903     {
00904       return (DOuter_ccb_const_iter (Base::outer_ccbs_begin()));
00905     }
00906     
00908     Outer_ccb_iterator outer_ccbs_end() 
00909     {
00910       return (DOuter_ccb_iter (Base::outer_ccbs_end()));
00911     }
00912 
00914     Outer_ccb_const_iterator outer_ccbs_end() const 
00915     {
00916       return (DOuter_ccb_const_iter (Base::outer_ccbs_end()));
00917     }
00918 
00919 
00921     Inner_ccb_iterator inner_ccbs_begin() 
00922     {
00923       return (DInner_ccb_iter (Base::inner_ccbs_begin()));
00924     }
00925 
00927     Inner_ccb_const_iterator inner_ccbs_begin() const
00928     {
00929       return (DInner_ccb_const_iter (Base::inner_ccbs_begin()));
00930     }
00931     
00933     Inner_ccb_iterator inner_ccbs_end() 
00934     {
00935       return (DInner_ccb_iter (Base::inner_ccbs_end()));
00936     }
00937 
00939     Inner_ccb_const_iterator inner_ccbs_end() const 
00940     {
00941       return (DInner_ccb_const_iter (Base::inner_ccbs_end()));
00942     }
00943 
00944 
00947     Isolated_vertex_iterator isolated_vertices_begin ()
00948     {
00949       return (DIso_vertex_iter (Base::isolated_vertices_begin()));
00950     }
00951 
00954     Isolated_vertex_const_iterator isolated_vertices_begin () const
00955     {
00956       return (DIso_vertex_const_iter (Base::isolated_vertices_begin()));
00957     }
00958     
00961     Isolated_vertex_iterator isolated_vertices_end () 
00962     {
00963       return (DIso_vertex_iter (Base::isolated_vertices_end()));
00964     }
00965 
00968     Isolated_vertex_const_iterator isolated_vertices_end () const 
00969     {
00970       return (DIso_vertex_const_iter (Base::isolated_vertices_end()));
00971     }
00972 
00974 
00975 
00980     Ccb_halfedge_circulator outer_ccb () 
00981     {
00982       CGAL_precondition (Base::number_of_outer_ccbs() == 1);
00983       
00984       DOuter_ccb_iter     iter = Base::outer_ccbs_begin();
00985       DHalfedge          *he = *iter;
00986 
00987       return Ccb_halfedge_circulator (DHalfedge_iter (he));
00988     }
00989 
00994     Ccb_halfedge_const_circulator outer_ccb () const
00995     {
00996       CGAL_precondition (Base::number_of_outer_ccbs() == 1);
00997 
00998       DOuter_ccb_const_iter  iter = Base::outer_ccbs_begin();
00999       const DHalfedge       *he = *iter;
01000  
01001       return Ccb_halfedge_const_circulator (DHalfedge_const_iter (he));
01002     }
01003 
01005     Size number_of_holes () const
01006     {
01007       return (Base::number_of_inner_ccbs());
01008     }
01009 
01011     Inner_ccb_iterator holes_begin() 
01012     {
01013       return (this->inner_ccbs_begin());
01014     }
01015 
01017     Inner_ccb_const_iterator holes_begin() const
01018     {
01019       return (this->inner_ccbs_begin());
01020     }
01021     
01023     Inner_ccb_iterator holes_end() 
01024     {
01025       return (this->inner_ccbs_end());
01026     }
01027 
01029     Inner_ccb_const_iterator holes_end() const 
01030     {
01031       return (this->inner_ccbs_end());
01032     }
01034 
01035   private:
01036 
01037     // Blocking access to inherited functions from the Dcel::Face.
01038     void set_unbounded (bool );
01039     void set_fictitious (bool );
01040     void add_outer_ccb (DOuter_ccb*, Halfedge* );
01041     void erase_outer_ccb (DOuter_ccb* );
01042     void add_inner_ccb (DInner_ccb*, Halfedge* );
01043     void erase_inner_ccb (DInner_ccb* );
01044     void add_isolated_vertex (DIso_vertex*, DVertex* );
01045     void erase_isolated_vertex (DIso_vertex* );
01046   };
01047 
01048 protected:
01049 
01050   typedef CGAL_ALLOCATOR(Point_2)                 Points_alloc;
01051   typedef CGAL_ALLOCATOR(X_monotone_curve_2)      Curves_alloc;
01052 
01053   typedef Arr_observer<Self>                      Observer;
01054   typedef std::list<Observer*>                    Observers_container;
01055   typedef typename Observers_container::iterator  Observers_iterator;
01056 
01057   typedef typename Observers_container::reverse_iterator  
01058                                                   Observers_rev_iterator;
01059 
01060   // Data members:
01061   Topology_traits          m_topol_traits;  // the topology traits.
01062   Points_alloc             m_points_alloc;  // allocator for the points.
01063   Curves_alloc             m_curves_alloc;  // allocator for the curves.
01064   Observers_container      m_observers;     // pointers to existing observers.
01065   const Traits_adaptor_2 * m_geom_traits;   // the geometry-traits adaptor.
01066   bool                     m_own_traits;    // inidicates whether the geometry
01067                                             // traits should be freed up.
01068   Arr_boundary_type        m_boundary_types[4];   
01069 
01070 public:
01071   
01073 
01074 
01076   Arrangement_on_surface_2 ();
01077 
01079   Arrangement_on_surface_2 (const Self & arr);
01080 
01082   Arrangement_on_surface_2 (const Geometry_traits_2 * geom_traits);
01084 
01086 
01087 
01089   Self& operator= (const Self & arr);
01090 
01092   void assign (const Self & arr);
01094 
01096 
01097 
01099   virtual ~Arrangement_on_surface_2 ();
01100 
01102   virtual void clear();
01104 
01106 
01107 
01109   inline const Traits_adaptor_2 * traits_adaptor () const
01110   {
01111     return (m_geom_traits);
01112   }
01113 
01115   inline const Geometry_traits_2 * geometry_traits () const
01116   {
01117     return (m_geom_traits);
01118   }
01119 
01121   inline Topology_traits * topology_traits ()
01122   {
01123     return (&m_topol_traits);
01124   }
01125   
01127   inline const Topology_traits * topology_traits () const
01128   {
01129     return (&m_topol_traits);
01130   }
01132 
01134 
01135 
01137   bool is_empty () const
01138   {
01139     return (m_topol_traits.is_empty_dcel());
01140   }
01141 
01147   bool is_valid() const;
01148   
01150   Size number_of_vertices () const
01151   {
01152     return (m_topol_traits.number_of_concrete_vertices());
01153   }
01154 
01156   Size number_of_isolated_vertices () const
01157   {
01158     return (_dcel().size_of_isolated_vertices());
01159   }
01160 
01162   Size number_of_halfedges () const
01163   {
01164     return (m_topol_traits.number_of_valid_halfedges());
01165   }
01166 
01168   Size number_of_edges () const
01169   {
01170     return (m_topol_traits.number_of_valid_halfedges() / 2);
01171   }
01172 
01174   Size number_of_faces () const
01175   {
01176     return (m_topol_traits.number_of_valid_faces());
01177   }
01178 
01180   Size number_of_unbounded_faces () const
01181   {
01182     Unbounded_face_const_iterator    iter = unbounded_faces_begin();
01183     Unbounded_face_const_iterator    end = unbounded_faces_end();
01184     Size                             n_unb = 0;
01185 
01186     while (iter != end)
01187     {
01188       n_unb++;
01189       ++iter;
01190     }
01191 
01192     return (n_unb);
01193   }
01195 
01197 
01198 
01200   Vertex_iterator vertices_begin() 
01201   { 
01202     return (Vertex_iterator (_dcel().vertices_begin(),
01203                              _dcel().vertices_end(),
01204                              _Is_concrete_vertex (&m_topol_traits))); 
01205   }
01206 
01208   Vertex_iterator vertices_end()
01209   {
01210     return (Vertex_iterator (_dcel().vertices_end(),
01211                              _dcel().vertices_end(),
01212                              _Is_concrete_vertex (&m_topol_traits))); 
01213   }
01214 
01216   Vertex_const_iterator vertices_begin() const
01217   { 
01218     return (Vertex_const_iterator (_dcel().vertices_begin(),
01219                                    _dcel().vertices_end(),
01220                                    _Is_concrete_vertex (&m_topol_traits))); 
01221   }
01222   
01224   Vertex_const_iterator vertices_end() const
01225   {
01226     return (Vertex_const_iterator (_dcel().vertices_end(),
01227                                    _dcel().vertices_end(),
01228                                    _Is_concrete_vertex (&m_topol_traits))); 
01229   }
01231 
01233 
01234 
01236   Halfedge_iterator halfedges_begin() 
01237   { 
01238     return (Halfedge_iterator (_dcel().halfedges_begin(),
01239                                _dcel().halfedges_end(),
01240                                _Is_valid_halfedge (&m_topol_traits))); 
01241   }
01242 
01244   Halfedge_iterator halfedges_end()
01245   {
01246     return (Halfedge_iterator (_dcel().halfedges_end(),
01247                                _dcel().halfedges_end(),
01248                                _Is_valid_halfedge (&m_topol_traits))); 
01249   }
01250 
01252   Halfedge_const_iterator halfedges_begin() const
01253   { 
01254     return (Halfedge_const_iterator (_dcel().halfedges_begin(),
01255                                      _dcel().halfedges_end(),
01256                                      _Is_valid_halfedge (&m_topol_traits))); 
01257   }
01258   
01260   Halfedge_const_iterator halfedges_end() const
01261   {
01262     return (Halfedge_const_iterator (_dcel().halfedges_end(),
01263                                      _dcel().halfedges_end(),
01264                                      _Is_valid_halfedge (&m_topol_traits))); 
01265   }
01267 
01269 
01270 
01272   Edge_iterator edges_begin() 
01273   { 
01274     return (Edge_iterator (_dcel().edges_begin(),
01275                            _dcel().edges_end(),
01276                            _Is_valid_halfedge (&m_topol_traits))); 
01277   }
01278 
01280   Edge_iterator edges_end()
01281   {
01282     return (Edge_iterator (_dcel().edges_end(),
01283                            _dcel().edges_end(),
01284                            _Is_valid_halfedge (&m_topol_traits))); 
01285   }
01286 
01288   Edge_const_iterator edges_begin() const
01289   { 
01290     return (Edge_const_iterator (_dcel().edges_begin(),
01291                                  _dcel().edges_end(),
01292                                  _Is_valid_halfedge (&m_topol_traits))); 
01293   }
01294   
01296   Edge_const_iterator edges_end() const
01297   {
01298     return (Edge_const_iterator (_dcel().edges_end(),
01299                                  _dcel().edges_end(),
01300                                  _Is_valid_halfedge (&m_topol_traits))); 
01301   }
01303 
01305 
01306 
01308   Face_iterator faces_begin() 
01309   { 
01310     return (Face_iterator (_dcel().faces_begin(),
01311                            _dcel().faces_end(),
01312                            _Is_valid_face (&m_topol_traits))); 
01313   }
01314 
01316   Face_iterator faces_end()
01317   {
01318     return (Face_iterator (_dcel().faces_end(),
01319                            _dcel().faces_end(),
01320                            _Is_valid_face (&m_topol_traits))); 
01321   }
01322 
01324   Face_const_iterator faces_begin() const
01325   { 
01326     return (Face_const_iterator (_dcel().faces_begin(),
01327                                  _dcel().faces_end(),
01328                                  _Is_valid_face (&m_topol_traits))); 
01329   }
01330   
01332   Face_const_iterator faces_end() const
01333   {
01334     return (Face_const_iterator (_dcel().faces_end(),
01335                                  _dcel().faces_end(),
01336                                  _Is_valid_face (&m_topol_traits))); 
01337   }
01338 
01340 
01345   Face_const_handle reference_face() const
01346   {
01347     return _const_handle_for(this->topology_traits()->reference_face());
01348   }
01349   
01351 
01356   Face_handle reference_face()
01357   {
01358     return _handle_for(this->topology_traits()->reference_face());
01359   }
01360 
01362 
01364 
01365 
01367   Unbounded_face_iterator unbounded_faces_begin() 
01368   { 
01369     return Unbounded_face_iterator(_dcel().faces_begin(),
01370                                    _dcel().faces_end(),
01371                                    _Is_unbounded_face (&m_topol_traits)); 
01372   }
01373 
01375   Unbounded_face_iterator unbounded_faces_end()
01376   {
01377     return Unbounded_face_iterator(_dcel().faces_end(),
01378                                    _dcel().faces_end(),
01379                                    _Is_unbounded_face (&m_topol_traits)); 
01380   }
01381 
01383   Unbounded_face_const_iterator unbounded_faces_begin() const
01384   { 
01385     return Unbounded_face_const_iterator(_dcel().faces_begin(),
01386                                          _dcel().faces_end(),
01387                                          _Is_unbounded_face (&m_topol_traits));
01388   }
01389   
01391   Unbounded_face_const_iterator unbounded_faces_end() const
01392   {
01393     return Unbounded_face_const_iterator(_dcel().faces_end(),
01394                                          _dcel().faces_end(),
01395                                          _Is_unbounded_face (&m_topol_traits));
01396   }
01398   
01400 
01401   Vertex_handle non_const_handle (Vertex_const_handle vh)
01402   {
01403     DVertex    *p_v = (DVertex*) &(*vh);
01404     return (Vertex_handle (p_v));
01405   }
01406 
01407   Halfedge_handle non_const_handle (Halfedge_const_handle hh)
01408   {
01409     DHalfedge  *p_he = (DHalfedge*) &(*hh);
01410     return (Halfedge_handle (p_he));
01411   }
01412 
01413   Face_handle non_const_handle (Face_const_handle fh)
01414   {
01415     DFace      *p_f = (DFace*) &(*fh);
01416     return (Face_handle (p_f));
01417   }
01419 
01421 
01422 
01430   Vertex_handle insert_in_face_interior (const Point_2& p,
01431                                          Face_handle f);
01432 
01441   Halfedge_handle insert_in_face_interior (const X_monotone_curve_2& cv, 
01442                                            Face_handle f);
01443 
01454   Halfedge_handle insert_from_left_vertex (const X_monotone_curve_2& cv, 
01455                                            Vertex_handle v,
01456                                            Face_handle f = Face_handle());
01457 
01469   Halfedge_handle insert_from_left_vertex (const X_monotone_curve_2& cv,
01470                                            Halfedge_handle prev);
01471 
01482   Halfedge_handle insert_from_right_vertex (const X_monotone_curve_2& cv, 
01483                                             Vertex_handle v,
01484                                             Face_handle f = Face_handle());
01485 
01498   Halfedge_handle insert_from_right_vertex (const X_monotone_curve_2& cv,
01499                                             Halfedge_handle prev);
01500   
01513   Halfedge_handle insert_at_vertices (const X_monotone_curve_2& cv, 
01514                                       Vertex_handle v1, 
01515                                       Vertex_handle v2,
01516                                       Face_handle f = Face_handle());
01517 
01529   Halfedge_handle insert_at_vertices (const X_monotone_curve_2& cv, 
01530                                       Halfedge_handle h1, 
01531                                       Vertex_handle v2);
01532 
01544   Halfedge_handle insert_at_vertices (const X_monotone_curve_2 & cv,
01545                                       Halfedge_handle prev1, 
01546                                       Halfedge_handle prev2);
01547 
01549 
01551 
01552 
01561   Vertex_handle modify_vertex (Vertex_handle v,
01562                                const Point_2& p);
01563 
01570   Face_handle remove_isolated_vertex (Vertex_handle v);
01571   
01573 
01575 
01576 
01585   Halfedge_handle modify_edge (Halfedge_handle e, 
01586                                const X_monotone_curve_2& cv);
01587 
01601   Halfedge_handle split_edge (Halfedge_handle e,
01602                               const X_monotone_curve_2& cv1, 
01603                               const X_monotone_curve_2& cv2);
01604 
01613   Halfedge_handle merge_edge (Halfedge_handle e1, 
01614                               Halfedge_handle e2, 
01615                               const X_monotone_curve_2& cv);              
01616 
01626   Face_handle remove_edge (Halfedge_handle e,
01627                            bool remove_source = true,
01628                            bool remove_target = true);
01629   
01631 
01632 protected:
01633 
01635 
01636 
01643   inline bool is_open(Arr_parameter_space ps_x, Arr_parameter_space ps_y)
01644     const
01645   {
01646     return
01647       (((ps_x != ARR_INTERIOR) && (m_boundary_types[ps_x] == ARR_OPEN)) ||
01648        ((ps_y != ARR_INTERIOR) && (m_boundary_types[ps_y] == ARR_OPEN)));
01649   }
01650   
01652   inline void init_boundary_types()
01653   {
01654     init_boundary_side(ARR_LEFT_BOUNDARY, Arr_left_side_tag());
01655     init_boundary_side(ARR_BOTTOM_BOUNDARY, Arr_bottom_side_tag());
01656     init_boundary_side(ARR_TOP_BOUNDARY, Arr_top_side_tag());
01657     init_boundary_side(ARR_RIGHT_BOUNDARY, Arr_right_side_tag());
01658   }
01659 
01661   void init_boundary_side(Arr_parameter_space ps, Arr_oblivious_side_tag)
01662   {
01663     m_boundary_types[ps] = ARR_OBLIVIOUS;
01664   }
01665     
01667   void init_boundary_side(Arr_parameter_space ps, Arr_open_side_tag)
01668   {
01669     m_boundary_types[ps] = ARR_OPEN;
01670   }
01671 
01673   void init_boundary_side(Arr_parameter_space ps, Arr_closed_side_tag)
01674   {
01675     m_boundary_types[ps] = ARR_CLOSED;
01676   }
01677 
01679   void init_boundary_side(Arr_parameter_space ps, Arr_contracted_side_tag)
01680   {
01681     m_boundary_types[ps] = ARR_CONTRACTION;
01682   }
01683 
01685   void init_boundary_side(Arr_parameter_space ps, 
01686                           Arr_identified_side_tag)
01687   {
01688     m_boundary_types[ps] = ARR_IDENTIFICATION;
01689   }
01690 
01692   Point_2 *_new_point (const Point_2& pt)
01693   {
01694     Point_2   *p_pt = m_points_alloc.allocate (1);
01695 
01696     m_points_alloc.construct (p_pt, pt);
01697     return (p_pt);
01698   }
01699 
01701   void _delete_point (Point_2& pt)
01702   {
01703     Point_2   *p_pt = &pt;
01704 
01705     m_points_alloc.destroy (p_pt);
01706     m_points_alloc.deallocate (p_pt, 1);
01707   }
01708 
01710   X_monotone_curve_2 *_new_curve (const X_monotone_curve_2& cv)
01711   {
01712     X_monotone_curve_2   *p_cv = m_curves_alloc.allocate (1);
01713 
01714     m_curves_alloc.construct (p_cv, cv);
01715     return (p_cv);
01716   }
01717 
01719   void _delete_curve (X_monotone_curve_2& cv)
01720   {
01721     X_monotone_curve_2   *p_cv = &cv;
01722 
01723     m_curves_alloc.destroy (p_cv);
01724     m_curves_alloc.deallocate (p_cv, 1);
01725   }
01727 
01729 
01730 
01732   inline Dcel& _dcel ()
01733   {
01734     return (m_topol_traits.dcel());
01735   }
01736 
01738   inline const Dcel& _dcel () const
01739   {
01740     return (m_topol_traits.dcel());
01741   }
01742 
01744   inline DVertex* _vertex (Vertex_handle vh) const
01745   {
01746     return (&(*vh));
01747   }
01748 
01750   inline const DVertex* _vertex (Vertex_const_handle vh) const
01751   {
01752     return (&(*vh));
01753   }
01754 
01756   inline DHalfedge* _halfedge (Halfedge_handle hh) const
01757   {
01758     return (&(*hh));
01759   }
01760 
01762   inline const DHalfedge* _halfedge (Halfedge_const_handle hh) const
01763   {
01764     return (&(*hh));
01765   }
01766 
01768   inline DFace* _face (Face_handle fh) const
01769   {
01770     return (&(*fh));
01771   }
01772 
01774   inline const DFace* _face (Face_const_handle fh) const
01775   {
01776     return (&(*fh));
01777   }
01779 
01781 
01782 
01784   Vertex_handle _handle_for (DVertex *v)
01785   {
01786     return (Vertex_handle (v));
01787   }
01788 
01790   Vertex_const_handle _const_handle_for (const DVertex *v) const
01791   {
01792     return (Vertex_const_handle (v));
01793   }
01794 
01796   Halfedge_handle _handle_for (DHalfedge *he)
01797   {
01798     return (Halfedge_handle (he));
01799   }
01800 
01801 
01803   Halfedge_const_handle _const_handle_for (const DHalfedge *he) const
01804   {
01805     return (Halfedge_const_handle (he));
01806   }
01807 
01809   Face_handle _handle_for (DFace *f)
01810   {
01811     return (Face_handle (f));
01812   }
01813 
01815   Face_const_handle _const_handle_for (const DFace *f) const
01816   {
01817     return (Face_const_handle (f));
01818   }
01820 
01822 
01823    
01834   DHalfedge* _locate_around_vertex (DVertex *v,
01835                                     const X_monotone_curve_2& cv,
01836                                     Arr_curve_end ind) const;
01837 
01846   unsigned int _halfedge_distance (const DHalfedge *e1,
01847                                    const DHalfedge *e2) const;
01848 
01857   Comparison_result _compare_vertices_xy (const DVertex *v1,
01858                                           const DVertex *v2) const
01859   {
01860     return (_compare_vertices_xy_impl(v1, v2, Are_all_sides_oblivious_tag()));
01861 
01862   }
01863 
01864   Comparison_result
01865   _compare_vertices_xy_impl (const DVertex *v1,
01866                              const DVertex *v2,
01867                              Arr_all_sides_oblivious_tag) const
01868   {
01869     return (m_geom_traits->compare_xy_2_object() (v1->point(), v2->point()));
01870   }
01871 
01872   Comparison_result
01873   _compare_vertices_xy_impl (const DVertex *v1,
01874                              const DVertex *v2,
01875                              Arr_not_all_sides_oblivious_tag) const;
01876   
01892   std::pair <const DVertex*, const DHalfedge*>
01893   _find_leftmost_vertex_on_open_loop (const DHalfedge *he_before,
01894                                       const DHalfedge *he_after,
01895                                       const X_monotone_curve_2& cv,
01896                                       bool& is_perimetric) const;
01897 
01909   std::pair<int, const DVertex*>
01910   _find_leftmost_vertex_on_closed_loop (const DHalfedge *he_anchor,
01911                                         bool& is_perimetric,
01912                                         bool& at_infinity) const;
01913 
01929   bool _is_inside_new_face (const DHalfedge *prev1,
01930                             const DHalfedge *prev2,
01931                             const X_monotone_curve_2& cv) const;
01932 
01939   void _move_outer_ccb (DFace *from_face, DFace *to_face, DHalfedge *he);
01940 
01947   void _move_inner_ccb (DFace *from_face, DFace *to_face, DHalfedge *he);
01948 
01954   void _insert_isolated_vertex (DFace *f, DVertex *v);
01955 
01962   void _move_isolated_vertex (DFace *from_face, DFace *to_face, DVertex *v);
01963 
01969   DVertex* _create_vertex (const Point_2& p);
01970 
01980   DVertex* _create_boundary_vertex (const X_monotone_curve_2& cv,
01981                                     Arr_curve_end ind,
01982                                     Arr_parameter_space bx,
01983                                     Arr_parameter_space by);
01984 
01997   DVertex* _place_and_set_curve_end (DFace *f,
01998                                      const X_monotone_curve_2& cv,
01999                                      Arr_curve_end ind,
02000                                      Arr_parameter_space bx,
02001                                      Arr_parameter_space by,
02002                                      DHalfedge **p_pred);
02003   
02017   DHalfedge* _insert_in_face_interior (const X_monotone_curve_2& cv,
02018                                        DFace *f,
02019                                        DVertex *v1, DVertex *v2,
02020                                        Comparison_result res);
02021 
02037   DHalfedge* _insert_from_vertex (const X_monotone_curve_2& cv,
02038                                   DHalfedge *prev,
02039                                   DVertex *v,
02040                                   Comparison_result res);
02041 
02059   DHalfedge* _insert_at_vertices (const X_monotone_curve_2& cv,
02060                                   DHalfedge *prev1, 
02061                                   DHalfedge *prev2,
02062                                   Comparison_result res,
02063                                   bool& new_face);
02064 
02071   void _relocate_in_new_face (DHalfedge *new_he);
02072 
02079   void _relocate_inner_ccbs_in_new_face (DHalfedge *new_he);
02080 
02087   void _relocate_isolated_vertices_in_new_face (DHalfedge *new_he);
02088 
02094   void _modify_vertex (DVertex *v, 
02095                        const Point_2& p);
02096 
02102   void _modify_edge (DHalfedge *he, 
02103                      const X_monotone_curve_2& cv);
02104 
02112   bool _are_equal (const DVertex *v,
02113                    const X_monotone_curve_2& cv, Arr_curve_end ind) const;
02114 
02127   DHalfedge* _split_edge (DHalfedge *e,
02128                           const Point_2& p,
02129                           const X_monotone_curve_2& cv1, 
02130                           const X_monotone_curve_2& cv2);
02131 
02144   DHalfedge* _split_edge (DHalfedge *e,
02145                           DVertex *v,
02146                           const X_monotone_curve_2& cv1,
02147                           const X_monotone_curve_2& cv2);
02148 
02160   DFace *_remove_edge (DHalfedge *e,
02161                        bool remove_source, bool remove_target);
02162 
02169   void _remove_vertex_if_redundant (DVertex *v, DFace *f);
02170 
02176   void _remove_isolated_vertex (DVertex* v);
02178 
02180 
02181 
02183   bool _is_valid (Vertex_const_handle v) const;
02184 
02186   bool _is_valid (Halfedge_const_handle he) const;
02187 
02189   bool _is_valid (Face_const_handle f) const;
02190 
02192   bool _is_outer_ccb_valid (const DOuter_ccb *oc,
02193                             const DHalfedge *first) const;
02194 
02196   bool _is_inner_ccb_valid (const DInner_ccb *ic,
02197                             const DHalfedge *first) const;
02198 
02203   bool _are_vertices_unique() const;
02204   
02206   bool _are_curves_ordered_cw_around_vertrex (Vertex_const_handle v) const;
02207   
02209 
02210 protected:
02211 
02213 
02214 
02219   void _register_observer (Observer *p_obs)
02220   {
02221     m_observers.push_back (p_obs);
02222   }
02223 
02229   bool _unregister_observer (Observer *p_obs)
02230   {
02231     Observers_iterator   iter;
02232     Observers_iterator   end = m_observers.end();
02233 
02234     for (iter = m_observers.begin(); iter != end; ++iter)
02235     {
02236       if ((*iter) == p_obs)
02237       {
02238         // Remove the p_ob pointer from the list of observers.
02239         m_observers.erase (iter);
02240         return (true);
02241       }
02242     }
02243 
02244     // If we reached here, the observer was not registered.
02245     return (false);
02246   }
02247 
02248 protected:
02249 
02250   /* Notify the observers on global arrangement operations: */
02251 
02252   void _notify_before_assign (const Self& arr)
02253   {
02254     Observers_iterator   iter;
02255     Observers_iterator   end = m_observers.end();
02256 
02257     for (iter = m_observers.begin(); iter != end; ++iter)
02258       (*iter)->before_assign (arr);
02259   }
02260 
02261   void _notify_after_assign ()
02262   {
02263     Observers_rev_iterator   iter;
02264     Observers_rev_iterator   end = m_observers.rend();
02265 
02266     for (iter = m_observers.rbegin(); iter != end; ++iter)
02267       (*iter)->after_assign();
02268   }
02269 
02270   void _notify_before_clear ()
02271   {
02272     Observers_iterator   iter;
02273     Observers_iterator   end = m_observers.end();
02274 
02275     for (iter = m_observers.begin(); iter != end; ++iter)
02276       (*iter)->before_clear();
02277   }
02278 
02279   void _notify_after_clear ()
02280   {
02281     Observers_rev_iterator   iter;
02282     Observers_rev_iterator   end = m_observers.rend();
02283 
02284     for (iter = m_observers.rbegin(); iter != end; ++iter)
02285       (*iter)->after_clear ();
02286   }
02287 
02288   void _notify_before_global_change ()
02289   {
02290     Observers_iterator   iter;
02291 
02292     Observers_iterator   end = m_observers.end();
02293 
02294     for (iter = m_observers.begin(); iter != end; ++iter)
02295       (*iter)->before_global_change();
02296 
02297   }
02298 
02299   void _notify_after_global_change ()
02300   {
02301     Observers_rev_iterator   iter;
02302     Observers_rev_iterator   end = m_observers.rend();
02303 
02304     for (iter = m_observers.rbegin(); iter != end; ++iter)
02305       (*iter)->after_global_change();
02306   }
02307 
02308   /* Notify the observers on local changes in the arrangement: */
02309 
02310   void _notify_before_create_vertex (const Point_2& p)
02311   {
02312     Observers_iterator   iter;
02313     Observers_iterator   end = m_observers.end();
02314 
02315     for (iter = m_observers.begin(); iter != end; ++iter)
02316       (*iter)->before_create_vertex (p);
02317   }
02318 
02319   void _notify_after_create_vertex (Vertex_handle v)
02320   {
02321     Observers_rev_iterator   iter;
02322     Observers_rev_iterator   end = m_observers.rend();
02323 
02324     for (iter = m_observers.rbegin(); iter != end; ++iter)
02325       (*iter)->after_create_vertex (v);
02326   }
02327 
02328   void _notify_before_create_boundary_vertex (const X_monotone_curve_2& cv,
02329                                               Arr_curve_end ind,
02330                                               Arr_parameter_space bx,
02331                                               Arr_parameter_space by)
02332   {
02333     Observers_iterator   iter;
02334     Observers_iterator   end = m_observers.end();
02335 
02336     for (iter = m_observers.begin(); iter != end; ++iter)
02337       (*iter)->before_create_boundary_vertex (cv, ind, bx, by);
02338   }
02339 
02340   void _notify_after_create_boundary_vertex (Vertex_handle v)
02341   {
02342     Observers_rev_iterator   iter;
02343     Observers_rev_iterator   end = m_observers.rend();
02344 
02345     for (iter = m_observers.rbegin(); iter != end; ++iter)
02346       (*iter)->after_create_boundary_vertex (v);
02347   }
02348 
02349   void _notify_before_create_edge (const X_monotone_curve_2& c,
02350                                    Vertex_handle v1, Vertex_handle v2)
02351   {
02352     Observers_iterator   iter;
02353     Observers_iterator   end = m_observers.end();
02354 
02355     for (iter = m_observers.begin(); iter != end; ++iter)
02356       (*iter)->before_create_edge (c, v1, v2);
02357   }
02358 
02359   void _notify_after_create_edge (Halfedge_handle e)
02360   {
02361     Observers_rev_iterator   iter;
02362     Observers_rev_iterator   end = m_observers.rend();
02363 
02364     for (iter = m_observers.rbegin(); iter != end; ++iter)
02365       (*iter)->after_create_edge (e);
02366   }
02367 
02368   void _notify_before_modify_vertex (Vertex_handle v,
02369                                      const Point_2& p)
02370   {
02371     Observers_iterator   iter;
02372     Observers_iterator   end = m_observers.end();
02373 
02374     for (iter = m_observers.begin(); iter != end; ++iter)
02375       (*iter)->before_modify_vertex (v, p);
02376   }
02377 
02378   void _notify_after_modify_vertex (Vertex_handle v)
02379   {
02380     Observers_rev_iterator   iter;
02381     Observers_rev_iterator   end = m_observers.rend();
02382 
02383     for (iter = m_observers.rbegin(); iter != end; ++iter)
02384       (*iter)->after_modify_vertex (v);
02385   }
02386 
02387   void _notify_before_modify_edge (Halfedge_handle e,
02388                                    const X_monotone_curve_2& c)
02389   {
02390     Observers_iterator   iter;
02391     Observers_iterator   end = m_observers.end();
02392 
02393     for (iter = m_observers.begin(); iter != end; ++iter)
02394       (*iter)->before_modify_edge (e, c);
02395   }
02396 
02397   void _notify_after_modify_edge (Halfedge_handle e)
02398   {
02399     Observers_rev_iterator   iter;
02400     Observers_rev_iterator   end = m_observers.rend();
02401 
02402     for (iter = m_observers.rbegin(); iter != end; ++iter)
02403       (*iter)->after_modify_edge (e);
02404   }
02405 
02406   void _notify_before_split_edge (Halfedge_handle e,
02407                                   Vertex_handle v,
02408                                   const X_monotone_curve_2& c1,
02409                                   const X_monotone_curve_2& c2)
02410   {
02411     Observers_iterator   iter;
02412     Observers_iterator   end = m_observers.end();
02413 
02414     for (iter = m_observers.begin(); iter != end; ++iter)
02415       (*iter)->before_split_edge (e, v, c1, c2);
02416   }
02417 
02418   void _notify_after_split_edge (Halfedge_handle e1,
02419                                  Halfedge_handle e2)
02420   {
02421     Observers_rev_iterator   iter;
02422     Observers_rev_iterator   end = m_observers.rend();
02423 
02424     for (iter = m_observers.rbegin(); iter != end; ++iter)
02425       (*iter)->after_split_edge (e1, e2);
02426   }
02427 
02428   void _notify_before_split_fictitious_edge (Halfedge_handle e,
02429                                              Vertex_handle v)
02430   {
02431     Observers_iterator   iter;
02432     Observers_iterator   end = m_observers.end();
02433 
02434     for (iter = m_observers.begin(); iter != end; ++iter)
02435       (*iter)->before_split_fictitious_edge (e, v);
02436   }
02437 
02438   void _notify_after_split_fictitious_edge (Halfedge_handle e1,
02439                                             Halfedge_handle e2)
02440   {
02441     Observers_rev_iterator   iter;
02442     Observers_rev_iterator   end = m_observers.rend();
02443 
02444     for (iter = m_observers.rbegin(); iter != end; ++iter)
02445       (*iter)->after_split_fictitious_edge (e1, e2);
02446   }
02447 
02448   void _notify_before_split_face (Face_handle f,
02449                                   Halfedge_handle e)
02450   {
02451     Observers_iterator   iter;
02452     Observers_iterator   end = m_observers.end();
02453 
02454     for (iter = m_observers.begin(); iter != end; ++iter)
02455       (*iter)->before_split_face (f, e);
02456   }
02457 
02458   void _notify_after_split_face (Face_handle f,
02459                                  Face_handle new_f,
02460                                  bool is_hole)
02461   {
02462     Observers_rev_iterator   iter;
02463     Observers_rev_iterator   end = m_observers.rend();
02464 
02465     for (iter = m_observers.rbegin(); iter != end; ++iter)
02466       (*iter)->after_split_face (f, new_f, is_hole);
02467   }
02468 
02469   void _notify_before_split_outer_ccb (Face_handle f,
02470                                        Ccb_halfedge_circulator h,
02471                                        Halfedge_handle e)
02472   {
02473     Observers_iterator   iter;
02474     Observers_iterator   end = m_observers.end();
02475 
02476     for (iter = m_observers.begin(); iter != end; ++iter)
02477       (*iter)->before_split_outer_ccb (f, h, e);
02478   }
02479 
02480   void _notify_after_split_outer_ccb (Face_handle f,
02481                                       Ccb_halfedge_circulator h1,
02482                                       Ccb_halfedge_circulator h2)
02483   {
02484     Observers_rev_iterator   iter;
02485     Observers_rev_iterator   end = m_observers.rend();
02486 
02487     for (iter = m_observers.rbegin(); iter != end; ++iter)
02488       (*iter)->after_split_outer_ccb (f, h1, h2);
02489   }
02490 
02491   void _notify_before_split_inner_ccb (Face_handle f,
02492                                        Ccb_halfedge_circulator h,
02493                                        Halfedge_handle e)
02494   {
02495     Observers_iterator   iter;
02496     Observers_iterator   end = m_observers.end();
02497 
02498     for (iter = m_observers.begin(); iter != end; ++iter)
02499       (*iter)->before_split_inner_ccb (f, h, e);
02500   }
02501 
02502   void _notify_after_split_inner_ccb (Face_handle f,
02503                                       Ccb_halfedge_circulator h1,
02504                                       Ccb_halfedge_circulator h2)
02505   {
02506     Observers_rev_iterator   iter;
02507     Observers_rev_iterator   end = m_observers.rend();
02508 
02509     for (iter = m_observers.rbegin(); iter != end; ++iter)
02510       (*iter)->after_split_inner_ccb (f, h1, h2);
02511   }
02512 
02513   void _notify_before_add_outer_ccb (Face_handle f,
02514                                      Halfedge_handle e)
02515   {
02516     Observers_iterator   iter;
02517     Observers_iterator   end = m_observers.end();
02518 
02519     for (iter = m_observers.begin(); iter != end; ++iter)
02520       (*iter)->before_add_outer_ccb (f, e);
02521   }
02522 
02523   void _notify_after_add_outer_ccb (Ccb_halfedge_circulator h)
02524   {
02525     Observers_rev_iterator   iter;
02526     Observers_rev_iterator   end = m_observers.rend();
02527 
02528     for (iter = m_observers.rbegin(); iter != end; ++iter)
02529       (*iter)->after_add_outer_ccb (h);
02530   }
02531 
02532   void _notify_before_add_inner_ccb (Face_handle f,
02533                                      Halfedge_handle e)
02534   {
02535     Observers_iterator   iter;
02536     Observers_iterator   end = m_observers.end();
02537 
02538     for (iter = m_observers.begin(); iter != end; ++iter)
02539       (*iter)->before_add_inner_ccb (f, e);
02540   }
02541 
02542   void _notify_after_add_inner_ccb (Ccb_halfedge_circulator h)
02543   {
02544     Observers_rev_iterator   iter;
02545     Observers_rev_iterator   end = m_observers.rend();
02546 
02547     for (iter = m_observers.rbegin(); iter != end; ++iter)
02548       (*iter)->after_add_inner_ccb (h);
02549   }
02550 
02551   void _notify_before_add_isolated_vertex (Face_handle f,
02552                                            Vertex_handle v)
02553   {
02554     Observers_iterator   iter;
02555     Observers_iterator   end = m_observers.end();
02556 
02557     for (iter = m_observers.begin(); iter != end; ++iter)
02558       (*iter)->before_add_isolated_vertex (f, v);
02559   }
02560 
02561   void _notify_after_add_isolated_vertex (Vertex_handle v)
02562   {
02563     Observers_rev_iterator   iter;
02564     Observers_rev_iterator   end = m_observers.rend();
02565 
02566     for (iter = m_observers.rbegin(); iter != end; ++iter)
02567       (*iter)->after_add_isolated_vertex (v);
02568   }
02569 
02570   void _notify_before_merge_edge (Halfedge_handle e1,
02571                                   Halfedge_handle e2,
02572                                   const X_monotone_curve_2& c)
02573   {
02574     Observers_iterator   iter;
02575     Observers_iterator   end = m_observers.end();
02576 
02577     for (iter = m_observers.begin(); iter != end; ++iter)
02578       (*iter)->before_merge_edge (e1, e2, c);
02579   }
02580 
02581   void _notify_after_merge_edge (Halfedge_handle e)
02582   {
02583     Observers_rev_iterator   iter;
02584     Observers_rev_iterator   end = m_observers.rend();
02585 
02586     for (iter = m_observers.rbegin(); iter != end; ++iter)
02587       (*iter)->after_merge_edge (e);
02588   }
02589 
02590   void _notify_before_merge_fictitious_edge (Halfedge_handle e1,
02591                                              Halfedge_handle e2)
02592   {
02593     Observers_iterator   iter;
02594     Observers_iterator   end = m_observers.end();
02595 
02596     for (iter = m_observers.begin(); iter != end; ++iter)
02597       (*iter)->before_merge_fictitious_edge (e1, e2);
02598   }
02599 
02600   void _notify_after_merge_fictitious_edge (Halfedge_handle e)
02601   {
02602     Observers_rev_iterator   iter;
02603     Observers_rev_iterator   end = m_observers.rend();
02604 
02605     for (iter = m_observers.rbegin(); iter != end; ++iter)
02606       (*iter)->after_merge_fictitious_edge (e);
02607   }
02608 
02609   void _notify_before_merge_face (Face_handle f1,
02610                                   Face_handle f2,
02611                                   Halfedge_handle e)
02612   {
02613     Observers_iterator   iter;
02614     Observers_iterator   end = m_observers.end();
02615 
02616     for (iter = m_observers.begin(); iter != end; ++iter)
02617       (*iter)->before_merge_face (f1, f2, e);
02618   }
02619 
02620   void _notify_after_merge_face (Face_handle f)
02621   {
02622     Observers_rev_iterator   iter;
02623     Observers_rev_iterator   end = m_observers.rend();
02624 
02625     for (iter = m_observers.rbegin(); iter != end; ++iter)
02626       (*iter)->after_merge_face (f);
02627   }
02628 
02629   void _notify_before_merge_outer_ccb (Face_handle f,
02630                                        Ccb_halfedge_circulator h1,
02631                                        Ccb_halfedge_circulator h2,
02632                                        Halfedge_handle e)
02633   {
02634     Observers_iterator   iter;
02635     Observers_iterator   end = m_observers.end();
02636 
02637     for (iter = m_observers.begin(); iter != end; ++iter)
02638       (*iter)->before_merge_outer_ccb (f, h1, h2, e);
02639   }
02640 
02641   void _notify_after_merge_outer_ccb (Face_handle f,
02642                                       Ccb_halfedge_circulator h)
02643   {
02644     Observers_rev_iterator   iter;
02645     Observers_rev_iterator   end = m_observers.rend();
02646 
02647     for (iter = m_observers.rbegin(); iter != end; ++iter)
02648       (*iter)->after_merge_outer_ccb (f, h);
02649   }
02650 
02651   void _notify_before_merge_inner_ccb (Face_handle f,
02652                                        Ccb_halfedge_circulator h1,
02653                                        Ccb_halfedge_circulator h2,
02654                                        Halfedge_handle e)
02655   {
02656     Observers_iterator   iter;
02657     Observers_iterator   end = m_observers.end();
02658 
02659     for (iter = m_observers.begin(); iter != end; ++iter)
02660       (*iter)->before_merge_inner_ccb (f, h1, h2, e);
02661   }
02662 
02663   void _notify_after_merge_inner_ccb (Face_handle f,
02664                                       Ccb_halfedge_circulator h)
02665   {
02666     Observers_rev_iterator   iter;
02667     Observers_rev_iterator   end = m_observers.rend();
02668 
02669     for (iter = m_observers.rbegin(); iter != end; ++iter)
02670       (*iter)->after_merge_inner_ccb (f, h);
02671   }
02672 
02673   void _notify_before_move_outer_ccb (Face_handle from_f,
02674                                       Face_handle to_f,
02675                                       Ccb_halfedge_circulator h)
02676   {
02677     Observers_iterator   iter;
02678     Observers_iterator   end = m_observers.end();
02679 
02680     for (iter = m_observers.begin(); iter != end; ++iter)
02681       (*iter)->before_move_outer_ccb (from_f, to_f, h);
02682   }
02683 
02684   void _notify_after_move_outer_ccb (Ccb_halfedge_circulator h)
02685   {
02686     Observers_rev_iterator   iter;
02687     Observers_rev_iterator   end = m_observers.rend();
02688 
02689     for (iter = m_observers.rbegin(); iter != end; ++iter)
02690       (*iter)->after_move_outer_ccb (h);
02691   }
02692 
02693   void _notify_before_move_inner_ccb (Face_handle from_f,
02694                                       Face_handle to_f,
02695                                       Ccb_halfedge_circulator h)
02696   {
02697     Observers_iterator   iter;
02698     Observers_iterator   end = m_observers.end();
02699 
02700     for (iter = m_observers.begin(); iter != end; ++iter)
02701       (*iter)->before_move_inner_ccb (from_f, to_f, h);
02702   }
02703 
02704   void _notify_after_move_inner_ccb (Ccb_halfedge_circulator h)
02705   {
02706     Observers_rev_iterator   iter;
02707     Observers_rev_iterator   end = m_observers.rend();
02708 
02709     for (iter = m_observers.rbegin(); iter != end; ++iter)
02710       (*iter)->after_move_inner_ccb (h);
02711   }
02712 
02713   void _notify_before_move_isolated_vertex (Face_handle from_f,
02714                                             Face_handle to_f,
02715                                             Vertex_handle v)
02716   {
02717     Observers_iterator   iter;
02718     Observers_iterator   end = m_observers.end();
02719 
02720     for (iter = m_observers.begin(); iter != end; ++iter)
02721       (*iter)->before_move_isolated_vertex (from_f, to_f, v);
02722   }
02723 
02724 
02725   void _notify_after_move_isolated_vertex (Vertex_handle v)
02726   {
02727     Observers_rev_iterator   iter;
02728     Observers_rev_iterator   end = m_observers.rend();
02729 
02730     for (iter = m_observers.rbegin(); iter != end; ++iter)
02731       (*iter)->after_move_isolated_vertex (v);
02732   }
02733 
02734   void _notify_before_remove_vertex (Vertex_handle v)
02735   {
02736     Observers_iterator   iter;
02737     Observers_iterator   end = m_observers.end();
02738 
02739     for (iter = m_observers.begin(); iter != end; ++iter)
02740       (*iter)->before_remove_vertex (v);
02741   }
02742 
02743   void _notify_after_remove_vertex ()
02744   {
02745     Observers_rev_iterator   iter;
02746     Observers_rev_iterator   end = m_observers.rend();
02747 
02748     for (iter = m_observers.rbegin(); iter != end; ++iter)
02749       (*iter)->after_remove_vertex ();
02750   }
02751 
02752   void _notify_before_remove_edge (Halfedge_handle e)
02753   {
02754     Observers_iterator   iter;
02755     Observers_iterator   end = m_observers.end();
02756 
02757     for (iter = m_observers.begin(); iter != end; ++iter)
02758       (*iter)->before_remove_edge (e);
02759   }
02760 
02761   void _notify_after_remove_edge ()
02762   {
02763     Observers_rev_iterator   iter;
02764     Observers_rev_iterator   end = m_observers.rend();
02765 
02766     for (iter = m_observers.rbegin(); iter != end; ++iter)
02767       (*iter)->after_remove_edge ();
02768   }
02769 
02770   void _notify_before_remove_outer_ccb (Face_handle f,
02771                                         Ccb_halfedge_circulator h)
02772   {
02773     Observers_iterator   iter;
02774     Observers_iterator   end = m_observers.end();
02775 
02776     for (iter = m_observers.begin(); iter != end; ++iter)
02777       (*iter)->before_remove_outer_ccb (f, h);
02778   }
02779 
02780   void _notify_after_remove_outer_ccb (Face_handle f)
02781   {
02782     Observers_rev_iterator   iter;
02783     Observers_rev_iterator   end = m_observers.rend();
02784 
02785     for (iter = m_observers.rbegin(); iter != end; ++iter)
02786       (*iter)->after_remove_outer_ccb (f);
02787   }
02788 
02789   void _notify_before_remove_inner_ccb (Face_handle f,
02790                                         Ccb_halfedge_circulator h)
02791   {
02792     Observers_iterator   iter;
02793     Observers_iterator   end = m_observers.end();
02794 
02795     for (iter = m_observers.begin(); iter != end; ++iter)
02796       (*iter)->before_remove_inner_ccb (f, h);
02797   }
02798 
02799   void _notify_after_remove_inner_ccb (Face_handle f)
02800   {
02801     Observers_rev_iterator   iter;
02802     Observers_rev_iterator   end = m_observers.rend();
02803 
02804     for (iter = m_observers.rbegin(); iter != end; ++iter)
02805       (*iter)->after_remove_inner_ccb (f);
02806   }
02808 
02809 };
02810 
02811 //-----------------------------------------------------------------------------
02812 // Declarations of the various global insertion and removal functions.
02813 //-----------------------------------------------------------------------------
02814 
02815 // In some compilers there is a template deduction disambiguity between this
02816 // function and the following function receiving two InputIterator.
02817 // For now the solution is to add a dummy variable at the end (referring
02818 // to point-location). Maybe the proper solution is to use boost::enable_if
02819 // together with appropriate tag.
02829 template <class GeomTraits, class TopTraits, class Curve, class PointLocation>
02830 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02831              const Curve& c, const PointLocation& pl,
02832              typename PointLocation::Point_2* = 0);
02833 
02843 template <class GeomTraits, class TopTraits, class Curve>
02844 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02845                    const Curve& c);
02846 
02857 template <class GeomTraits, class TopTraits, class InputIterator>
02858 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02859                     InputIterator begin, InputIterator end);
02860 
02872 template <class GeomTraits, class TopTraits>
02873 void insert (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02874              const typename GeomTraits::X_monotone_curve_2& c,
02875              const Object& obj);
02876 
02888 template <class GeomTraits, class TopTraits, class PointLocation>
02889 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Halfedge_handle
02890 insert_non_intersecting_curve
02891 (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02892  const typename GeomTraits::X_monotone_curve_2& c,
02893  const PointLocation& pl);
02894 
02907 template <class GeomTraits, class TopTraits>
02908 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Halfedge_handle
02909 insert_non_intersecting_curve
02910 (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02911  const typename GeomTraits::X_monotone_curve_2& c);
02912 
02924 template <class GeomTraits, class TopTraits, class InputIterator>
02925 void insert_non_intersecting_curves 
02926 (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02927  InputIterator begin, InputIterator end);
02928 
02937 template <class GeomTraits, class TopTraits>
02938 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Face_handle
02939 remove_edge (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02940              typename Arrangement_on_surface_2<GeomTraits,
02941                                                TopTraits>::Halfedge_handle e);
02942 
02951 template <class GeomTraits, class TopTraits, class PointLocation>
02952 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Vertex_handle
02953 insert_point (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02954               const typename GeomTraits::Point_2& p,
02955               const PointLocation& pl);
02956 
02964 template <class GeomTraits, class TopTraits>
02965 typename Arrangement_on_surface_2<GeomTraits, TopTraits>::Vertex_handle
02966 insert_point (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02967               const typename GeomTraits::Point_2& p);
02968 
02975 template <class GeomTraits, class TopTraits>
02976 bool
02977 remove_vertex (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr,
02978                typename Arrangement_on_surface_2<GeomTraits,
02979                                                  TopTraits>::Vertex_handle v);
02980 
02981 
02989 template <class GeomTraits, class TopTraits>
02990 bool is_valid (const Arrangement_on_surface_2<GeomTraits, TopTraits>& arr);
02991 
03003 template <class GeomTraits, class TopTraits, 
03004   class OutputIterator, class PointLocation>
03005 OutputIterator zone (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 
03006                      const typename GeomTraits::X_monotone_curve_2& c,
03007                      OutputIterator oi,
03008                      const PointLocation& pl);
03009 
03019 template <class GeomTraits, class TopTraits, class OutputIterator>
03020 OutputIterator zone (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 
03021                      const typename GeomTraits::X_monotone_curve_2& c,
03022                      OutputIterator oi);
03023 
03032 template <class GeomTraits, class TopTraits, class Curve, class PointLocation>
03033 bool do_intersect (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 
03034                    const Curve& c, const PointLocation& pl);
03035 
03044 template <class GeomTraits, class TopTraits, class Curve>
03045 bool do_intersect (Arrangement_on_surface_2<GeomTraits, TopTraits>& arr, 
03046                    const Curve& c);
03047 
03048 
03049 CGAL_END_NAMESPACE
03050 
03051 // The function definitions can be found under:
03052 #include <CGAL/Arrangement_2/Arrangement_on_surface_2_impl.h>
03053 #include <CGAL/Arrangement_2/Arrangement_on_surface_2_global.h>
03054 
03055 #endif
03056 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines