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_extended_dcel.h $ 00015 // $Id: Arr_extended_dcel.h 33059 2006-08-06 10:15:34Z wein $ 00016 // 00017 // 00018 // Author(s) : Ron Wein <wein@post.tau.ac.il> 00019 // Efi Fogel <efif@post.tau.ac.il> 00020 00021 #ifndef CGAL_ARR_EXTENDED_DCEL_H 00022 #define CGAL_ARR_EXTENDED_DCEL_H 00023 00028 #include <CGAL/Arr_dcel_base.h> 00029 00030 CGAL_BEGIN_NAMESPACE 00031 00036 template <class VertexBase_, typename VertexData_> 00037 class Arr_extended_vertex : public VertexBase_ 00038 { 00039 typedef Arr_extended_vertex<VertexBase_, VertexData_> Self; 00040 typedef VertexBase_ Base; 00041 00042 public: 00043 typedef VertexData_ Data; 00044 00045 private: 00046 00047 Data m_data; // The auxiliary data field. 00048 00049 public: 00050 00052 const Data& data () const 00053 { 00054 return (m_data); 00055 } 00056 00058 Data& data () 00059 { 00060 return (m_data); 00061 } 00062 00064 void set_data (const Data& data) 00065 { 00066 m_data = data; 00067 } 00068 00070 virtual void assign (const Base& v) 00071 { 00072 Base::assign (v); 00073 00074 const Self& ex_v = static_cast<const Self&>(v); 00075 m_data = ex_v.m_data; 00076 } 00077 }; 00078 00083 template <class HalfedgeBase_, typename HalfedgeData_> 00084 class Arr_extended_halfedge : public HalfedgeBase_ 00085 { 00086 typedef Arr_extended_halfedge<HalfedgeBase_, HalfedgeData_> Self; 00087 typedef HalfedgeBase_ Base; 00088 00089 public: 00090 typedef HalfedgeData_ Data; 00091 00092 private: 00093 00094 Data m_data; // The auxiliary data field. 00095 00096 public: 00097 00099 const Data& data () const 00100 { 00101 return (m_data); 00102 } 00103 00105 Data& data () 00106 { 00107 return (m_data); 00108 } 00109 00111 void set_data (const Data& data) 00112 { 00113 m_data = data; 00114 } 00115 00117 virtual void assign (const Base& he) 00118 { 00119 Base::assign (he); 00120 00121 const Self& ex_he = static_cast<const Self&>(he); 00122 m_data = ex_he.m_data; 00123 } 00124 }; 00125 00130 template <class FaceBase_, typename FaceData_> 00131 class Arr_extended_face : public FaceBase_ 00132 { 00133 typedef Arr_extended_face<FaceBase_, FaceData_> Self; 00134 typedef FaceBase_ Base; 00135 00136 public: 00137 typedef FaceData_ Data; 00138 00139 private: 00140 00141 Data m_data; // The auxiliary data field. 00142 00143 public: 00144 00146 const Data& data () const 00147 { 00148 return (m_data); 00149 } 00150 00152 Data& data () 00153 { 00154 return (m_data); 00155 } 00156 00158 void set_data (const Data& data) 00159 { 00160 m_data = data; 00161 } 00162 00164 virtual void assign (const Base& f) 00165 { 00166 Base::assign (f); 00167 00168 const Self& ex_f = static_cast<const Self&>(f); 00169 m_data = ex_f.m_data; 00170 } 00171 }; 00172 00179 template <class Traits_, typename FaceData_, 00180 class VertexBase_ = Arr_vertex_base<typename Traits_::Point_2>, 00181 class HalfedgeBase_ = 00182 Arr_halfedge_base<typename Traits_::X_monotone_curve_2>, 00183 class FaceBase_ = Arr_face_base> 00184 class Arr_face_extended_dcel : 00185 public Arr_dcel_base<VertexBase_, 00186 HalfedgeBase_, 00187 Arr_extended_face<FaceBase_, FaceData_> > 00188 { 00189 public: 00190 00191 typedef FaceData_ Face_data; 00192 00196 template<typename T> 00197 class rebind 00198 { 00199 typedef typename VertexBase_::template rebind 00200 <typename T::Point_2> Rebind_vertex; 00201 typedef typename Rebind_vertex::other Vertex_base; 00202 typedef typename HalfedgeBase_::template rebind 00203 <typename T::X_monotone_curve_2> Rebind_halfedge; 00204 typedef typename Rebind_halfedge::other Halfedge_base; 00205 00206 public: 00207 00208 typedef Arr_face_extended_dcel<T, 00209 Face_data, 00210 Vertex_base, 00211 Halfedge_base, 00212 FaceBase_> other; 00213 }; 00214 00216 Arr_face_extended_dcel () 00217 {} 00218 00220 virtual ~Arr_face_extended_dcel () 00221 {} 00222 }; 00223 00231 template <class Traits_, 00232 typename VertexData_, typename HalfedgeData_, typename FaceData_, 00233 class VertexBase_ = Arr_vertex_base<typename Traits_::Point_2>, 00234 class HalfedgeBase_ = 00235 Arr_halfedge_base<typename Traits_::X_monotone_curve_2>, 00236 class FaceBase_ = Arr_face_base> 00237 class Arr_extended_dcel : 00238 public Arr_dcel_base<Arr_extended_vertex<VertexBase_, VertexData_>, 00239 Arr_extended_halfedge<HalfedgeBase_, HalfedgeData_>, 00240 Arr_extended_face<FaceBase_, FaceData_> > 00241 { 00242 public: 00243 00244 typedef VertexData_ Vertex_data; 00245 typedef HalfedgeData_ Halfedge_data; 00246 typedef FaceData_ Face_data; 00247 00251 template<typename T> 00252 class rebind 00253 { 00254 typedef typename VertexBase_::template rebind 00255 <typename T::Point_2> Rebind_vertex; 00256 typedef typename Rebind_vertex::other Vertex_base; 00257 typedef typename HalfedgeBase_::template rebind 00258 <typename T::X_monotone_curve_2> Rebind_halfedge; 00259 typedef typename Rebind_halfedge::other Halfedge_base; 00260 00261 public: 00262 00263 typedef Arr_extended_dcel<T, 00264 Vertex_data, 00265 Halfedge_data, 00266 Face_data, 00267 Vertex_base, 00268 Halfedge_base, 00269 FaceBase_> other; 00270 }; 00271 00273 Arr_extended_dcel () 00274 {} 00275 00277 virtual ~Arr_extended_dcel () 00278 {} 00279 }; 00280 00281 CGAL_END_NAMESPACE 00282 00283 #endif