BWAPI
|
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