BWAPI
SPAR/AIModule/BWTA/vendors/CGAL/CGAL/Arr_observer.h
Go to the documentation of this file.
00001 // Copyright (c) 2005  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/Arr_observer.h $
00015 // $Id: Arr_observer.h 41108 2007-12-06 15:26:30Z efif $
00016 // 
00017 //
00018 // Author(s)     : Ron Wein          <wein@post.tau.ac.il>
00019 
00020 #ifndef CGAL_ARR_OBSERVER_H
00021 #define CGAL_ARR_OBSERVER_H
00022 
00023 #include <CGAL/Arr_enums.h>
00024 
00029 CGAL_BEGIN_NAMESPACE
00030 
00035 template <class Arrangement_>
00036 class Arr_observer
00037 {
00038 public:
00039 
00040   typedef Arrangement_                                     Arrangement_2;
00041   typedef Arr_observer<Arrangement_2>                      Self;
00042 
00043   typedef typename Arrangement_2::Point_2                  Point_2;
00044   typedef typename Arrangement_2::X_monotone_curve_2       X_monotone_curve_2;
00045 
00046   typedef typename Arrangement_2::Vertex_handle            Vertex_handle;
00047   typedef typename Arrangement_2::Halfedge_handle          Halfedge_handle;
00048   typedef typename Arrangement_2::Face_handle              Face_handle;
00049   typedef typename Arrangement_2::Ccb_halfedge_circulator  
00050                                                       Ccb_halfedge_circulator;
00051 
00052 private:
00053 
00054   Arrangement_2  *p_arr;           // The associated arrangement.
00055 
00057   Arr_observer (const Self& );
00058 
00060   Self& operator= (const Self& );
00061 
00062 public:
00063 
00065 
00066 
00068   Arr_observer () :
00069     p_arr (NULL)
00070   {}
00071 
00073   Arr_observer (Arrangement_2& arr) :
00074     p_arr (&arr)
00075   {
00076     // Register the observer object in the arrangement.
00077     p_arr->_register_observer (this);
00078   }
00079 
00081   virtual ~Arr_observer ()
00082   {
00083     // Unregister the observer object from the arrangement.
00084     if (p_arr != NULL)
00085       p_arr->_unregister_observer (this);
00086   }
00088 
00090 
00091 
00093   const Arrangement_2* arrangement () const
00094   {
00095     return (p_arr);
00096   }
00097 
00099   Arrangement_2* arrangement ()
00100   {
00101     return (p_arr);
00102   }
00103 
00108   void attach (Arrangement_2& arr)
00109   {
00110     // Do nothing if the associated arrangement is not changed.
00111     if (p_arr == &arr)
00112       return;
00113 
00114     // The observer is not already attached to an arrangement.
00115     CGAL_precondition (p_arr == NULL);
00116 
00117     if (p_arr != NULL)
00118       return;
00119 
00120     // Notify the concrete oberver (the sub-class) about the attachment.
00121     before_attach (arr);
00122 
00123     // Register the observer object in the new arrangement.
00124     p_arr = &arr;
00125     p_arr->_register_observer (this);
00126 
00127     // Notify the concrete oberver that the attachment took place.
00128     after_attach();
00129 
00130     return;
00131   }
00132 
00134   void detach ()
00135   {
00136     if (p_arr == NULL)
00137       return;
00138 
00139     // Notify the concrete oberver (the sub-class) about the detachment.
00140     before_detach ();
00141 
00142     // Unregister the observer object from the current arrangement, and mark
00143     // that the oberver is not attached to an arrangement.
00144     p_arr->_unregister_observer (this);
00145     p_arr = NULL;
00146    
00147     // Notify the concrete oberver that the detachment took place.
00148     after_detach();
00149 
00150     return;
00151   }
00153 
00155 
00156 
00162   virtual void before_assign (const Arrangement_2& /* arr */)
00163   {}
00164 
00169   virtual void after_assign ()
00170   {}
00171 
00173   virtual void before_clear ()
00174   {}
00175 
00179   virtual void after_clear ()
00180   {}
00181 
00183   virtual void before_global_change ()
00184   {}
00185 
00187   virtual void after_global_change ()
00188   {}
00190 
00192 
00193 
00198   virtual void before_attach (const Arrangement_2& /* arr */)
00199   {}
00200 
00204   virtual void after_attach ()
00205   {}
00206 
00210   virtual void before_detach ()
00211   {}
00212 
00216   virtual void after_detach ()
00217 
00218   {}
00220 
00222 
00223 
00229   virtual void before_create_vertex (const Point_2& /* p */)
00230   {}
00231 
00236   virtual void after_create_vertex (Vertex_handle /* v */)
00237   {}
00238 
00246   virtual void before_create_boundary_vertex (const X_monotone_curve_2& /*cv*/,
00247                                               Arr_curve_end /* ind */,
00248                                               Arr_parameter_space /* ps_x */,
00249                                               Arr_parameter_space /* ps_y */)
00250   {}
00251 
00256   virtual void after_create_boundary_vertex (Vertex_handle /* v */)
00257   {}
00258 
00265   virtual void before_create_edge (const X_monotone_curve_2& /* c */,
00266                                    Vertex_handle /* v1 */,
00267                                    Vertex_handle /* v2 */)
00268   {}
00269 
00274   virtual void after_create_edge (Halfedge_handle /* e */)
00275   {}
00276 
00282   virtual void before_modify_vertex (Vertex_handle /* v */,
00283                                      const Point_2& /* p */)
00284   {}
00285 
00290   virtual void after_modify_vertex (Vertex_handle /* v */)
00291   {}
00292 
00298   virtual void before_modify_edge (Halfedge_handle /* e */,
00299                                    const X_monotone_curve_2& /* c */)
00300   {}
00301 
00306   virtual void after_modify_edge (Halfedge_handle /* e */)
00307   {}
00308 
00316   virtual void before_split_edge (Halfedge_handle /* e */,
00317                                   Vertex_handle /* v */,
00318                                   const X_monotone_curve_2& /* c1 */,
00319                                   const X_monotone_curve_2& /* c2 */)
00320   {}
00321 
00327   virtual void after_split_edge (Halfedge_handle /* e1 */,
00328                                  Halfedge_handle /* e2 */)
00329   {}
00330 
00336   virtual void before_split_fictitious_edge (Halfedge_handle /* e */,
00337                                              Vertex_handle /* v */)
00338   {}
00339 
00345   virtual void after_split_fictitious_edge (Halfedge_handle /* e1 */,
00346                                             Halfedge_handle /* e2 */)
00347   {}
00348 
00354   virtual void before_split_face (Face_handle /* f */,
00355                                   Halfedge_handle /* e */)
00356   {}
00357 
00364   virtual void after_split_face (Face_handle /* f */,
00365                                  Face_handle /* new_f */,
00366                                  bool /* is_hole */)
00367   {}
00368 
00375   virtual void before_split_outer_ccb (Face_handle /* f */,
00376                                        Ccb_halfedge_circulator /* h */,
00377                                        Halfedge_handle /* e */)
00378   {}
00379 
00386   virtual void after_split_outer_ccb (Face_handle /* f */,
00387                                       Ccb_halfedge_circulator /* h1 */,
00388                                       Ccb_halfedge_circulator /* h2 */)
00389   {}
00390 
00397   virtual void before_split_inner_ccb (Face_handle /* f */,
00398                                        Ccb_halfedge_circulator /* h */,
00399                                        Halfedge_handle /* e */)
00400   {}
00401 
00408   virtual void after_split_inner_ccb (Face_handle /* f */,
00409                                       Ccb_halfedge_circulator /* h1 */,
00410                                       Ccb_halfedge_circulator /* h2 */)
00411   {}
00412 
00418   virtual void before_add_outer_ccb (Face_handle /* f */,
00419                                      Halfedge_handle /* e */)
00420   {}
00421 
00426   virtual void after_add_outer_ccb (Ccb_halfedge_circulator /* h */)
00427   {}
00428 
00434   virtual void before_add_inner_ccb (Face_handle /* f */,
00435                                      Halfedge_handle /* e */)
00436   {}
00437 
00442   virtual void after_add_inner_ccb (Ccb_halfedge_circulator /* h */)
00443   {}
00444 
00450   virtual void before_add_isolated_vertex (Face_handle /* f */,
00451                                            Vertex_handle /* v */)
00452   {}
00453 
00458   virtual void after_add_isolated_vertex (Vertex_handle /* v */)
00459   {}
00460 
00467   virtual void before_merge_edge (Halfedge_handle /* e1 */,
00468                                   Halfedge_handle /* e2 */,
00469                                   const X_monotone_curve_2& /* c */)
00470   {}
00471 
00476   virtual void after_merge_edge (Halfedge_handle /* e */)
00477   {}
00478 
00484   virtual void before_merge_fictitious_edge (Halfedge_handle /* e1 */,
00485                                              Halfedge_handle /* e2 */)
00486   {}
00487 
00492   virtual void after_merge_fictitious_edge (Halfedge_handle /* e */)
00493   {}
00494 
00501   virtual void before_merge_face (Face_handle /* f1 */,
00502                                   Face_handle /* f2 */,
00503                                   Halfedge_handle /* e */)
00504   {}
00505 
00510   virtual void after_merge_face (Face_handle /* f */)
00511   {}
00512 
00520   virtual void before_merge_outer_ccb (Face_handle /* f */,
00521                                        Ccb_halfedge_circulator /* h1 */,
00522                                        Ccb_halfedge_circulator /* h2 */,
00523                                        Halfedge_handle /* e */)
00524   {}
00525 
00531   virtual void after_merge_outer_ccb (Face_handle /* f */,
00532                                       Ccb_halfedge_circulator /* h */)
00533   {}
00534 
00542   virtual void before_merge_inner_ccb (Face_handle /* f */,
00543                                        Ccb_halfedge_circulator /* h1 */,
00544                                        Ccb_halfedge_circulator /* h2 */,
00545                                        Halfedge_handle /* e */)
00546   {}
00547 
00553   virtual void after_merge_inner_ccb (Face_handle /* f */,
00554                                       Ccb_halfedge_circulator /* h */)
00555   {}
00556 
00563   virtual void before_move_outer_ccb (Face_handle /* from_f */,
00564                                       Face_handle /* to_f */,
00565                                       Ccb_halfedge_circulator /* h */)
00566   {}
00567 
00572   virtual void after_move_outer_ccb (Ccb_halfedge_circulator /* h */)
00573   {}
00574 
00575 
00582   virtual void before_move_inner_ccb (Face_handle /* from_f */,
00583                                       Face_handle /* to_f */,
00584                                       Ccb_halfedge_circulator /* h */)
00585   {}
00586 
00591   virtual void after_move_inner_ccb (Ccb_halfedge_circulator /* h */)
00592   {}
00593 
00600   virtual void before_move_isolated_vertex (Face_handle /* from_f */,
00601                                             Face_handle /* to_f */,
00602                                             Vertex_handle /* v */)
00603   {}
00604 
00609   virtual void after_move_isolated_vertex (Vertex_handle /* v */)
00610   {}
00611 
00616   virtual void before_remove_vertex (Vertex_handle /* v */)
00617   {}
00618 
00622   virtual void after_remove_vertex ()
00623   {}
00624 
00629   virtual void before_remove_edge (Halfedge_handle /* e */)
00630   {}
00631 
00635   virtual void after_remove_edge ()
00636   {}
00637 
00643   virtual void before_remove_outer_ccb (Face_handle /* f */,
00644                                         Ccb_halfedge_circulator /* h */)
00645   {}
00646 
00651   virtual void after_remove_outer_ccb (Face_handle /* f */)
00652   {}
00653 
00659   virtual void before_remove_inner_ccb (Face_handle /* f */,
00660                                         Ccb_halfedge_circulator /* h */)
00661   {}
00662 
00667   virtual void after_remove_inner_ccb (Face_handle /* f */)
00668   {}
00669 
00671 
00672 };
00673 
00674 CGAL_END_NAMESPACE
00675 
00676 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines