BWAPI
|
00001 // Copyright (c) 1997 Utrecht University (The Netherlands), 00002 // ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany), 00003 // INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg 00004 // (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria), 00005 // and Tel-Aviv University (Israel). All rights reserved. 00006 // 00007 // This file is part of CGAL (www.cgal.org); you can redistribute it and/or 00008 // modify it under the terms of the GNU Lesser General Public License as 00009 // published by the Free Software Foundation; version 2.1 of the License. 00010 // See the file LICENSE.LGPL distributed with CGAL. 00011 // 00012 // Licensees holding a valid commercial license may use this file in 00013 // accordance with the commercial license agreement provided with the software. 00014 // 00015 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00016 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00017 // 00018 // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.5-branch/HalfedgeDS/include/CGAL/HalfedgeDS_halfedge_base.h $ 00019 // $Id: HalfedgeDS_halfedge_base.h 35794 2007-01-24 18:00:30Z spion $ 00020 // 00021 // 00022 // Author(s) : Lutz Kettner <kettner@mpi-sb.mpg.de> 00023 00024 #ifndef CGAL_HALFEDGEDS_HALFEDGE_BASE_H 00025 #define CGAL_HALFEDGEDS_HALFEDGE_BASE_H 1 00026 00027 #include <CGAL/basic.h> 00028 00029 CGAL_BEGIN_NAMESPACE 00030 00031 template < class Refs, class TP, class TV, class TF> 00032 struct HalfedgeDS_halfedge_base_base { 00033 // Base_base will be used to access set_opposite(), which is 00034 // made private in the normal halfedge bases. Since halfedges 00035 // come always in pairs, managed by the HDS, the set_opposite() 00036 // member function is protected from the user. 00037 typedef Refs HalfedgeDS; 00038 typedef HalfedgeDS_halfedge_base_base<Refs,TP,TV,TF> Base_base; 00039 typedef TP Supports_halfedge_prev; 00040 typedef TV Supports_halfedge_vertex; 00041 typedef TF Supports_halfedge_face; 00042 typedef typename Refs::Vertex_handle Vertex_handle; 00043 typedef typename Refs::Vertex_const_handle Vertex_const_handle; 00044 typedef typename Refs::Halfedge_handle Halfedge_handle; 00045 typedef typename Refs::Halfedge_const_handle Halfedge_const_handle; 00046 typedef typename Refs::Face_handle Face_handle; 00047 typedef typename Refs::Face_const_handle Face_const_handle; 00048 typedef typename Refs::Vertex Vertex; 00049 typedef typename Refs::Face Face; 00050 private: 00051 Halfedge_handle opp; 00052 Halfedge_handle nxt; 00053 public: 00054 Halfedge_handle opposite() { return opp;} 00055 Halfedge_const_handle opposite() const { return opp;} 00056 void set_opposite( Halfedge_handle h) { opp = h;} 00057 Halfedge_handle next() { return nxt;} 00058 Halfedge_const_handle next() const { return nxt;} 00059 void set_next( Halfedge_handle h) { nxt = h;} 00060 00061 bool is_border() const { return false;} 00062 // is always false as long as faces are not supported. 00063 }; 00064 00065 template < class Refs, class TP = Tag_true, 00066 class TV = Tag_true, 00067 class TF = Tag_true> 00068 class HalfedgeDS_halfedge_base; 00069 00070 template < class Refs > 00071 class HalfedgeDS_halfedge_base< Refs, 00072 Tag_false, // prev 00073 Tag_false, // vertex 00074 Tag_false> // face 00075 : public HalfedgeDS_halfedge_base_base< 00076 Refs, Tag_false, Tag_false, Tag_false> 00077 { 00078 public: 00079 typedef typename Refs::Halfedge_handle Halfedge_handle; 00080 typedef HalfedgeDS_halfedge_base<Refs, Tag_false,Tag_false,Tag_false> 00081 Base; 00082 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_false,Tag_false,Tag_false> 00083 Base_base; 00084 private: 00085 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00086 }; 00087 00088 template < class Refs > 00089 class HalfedgeDS_halfedge_base< Refs, 00090 Tag_true, // prev 00091 Tag_false, // vertex 00092 Tag_false> // face 00093 : public HalfedgeDS_halfedge_base_base< 00094 Refs, Tag_true, Tag_false, Tag_false> 00095 { 00096 public: 00097 typedef typename Refs::Halfedge_handle Halfedge_handle; 00098 typedef typename Refs::Halfedge_const_handle Halfedge_const_handle; 00099 typedef HalfedgeDS_halfedge_base<Refs, Tag_true,Tag_false,Tag_false> 00100 Base; 00101 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_true,Tag_false,Tag_false> 00102 Base_base; 00103 private: 00104 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00105 Halfedge_handle prv; 00106 public: 00107 // the previous halfedge along the face. 00108 Halfedge_handle prev() { return prv; } 00109 Halfedge_const_handle prev() const { return prv; } 00110 void set_prev( Halfedge_handle h) { prv = h; } 00111 }; 00112 00113 template < class Refs > 00114 class HalfedgeDS_halfedge_base< Refs, 00115 Tag_false, // prev 00116 Tag_true, // vertex 00117 Tag_false> // face 00118 : public HalfedgeDS_halfedge_base_base< 00119 Refs, Tag_false, Tag_true, Tag_false> 00120 { 00121 public: 00122 typedef typename Refs::Halfedge_handle Halfedge_handle; 00123 typedef typename Refs::Vertex_handle Vertex_handle; 00124 typedef typename Refs::Vertex_const_handle Vertex_const_handle; 00125 typedef HalfedgeDS_halfedge_base<Refs, Tag_false,Tag_true,Tag_false> 00126 Base; 00127 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_false,Tag_true,Tag_false> 00128 Base_base; 00129 private: 00130 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00131 Vertex_handle v; 00132 public: 00133 // the incident vertex. 00134 Vertex_handle vertex() { return v; } 00135 Vertex_const_handle vertex() const { return v; } 00136 void set_vertex( Vertex_handle w) { v = w; } 00137 }; 00138 00139 template < class Refs > 00140 class HalfedgeDS_halfedge_base< Refs, 00141 Tag_false, // prev 00142 Tag_false, // vertex 00143 Tag_true> // face 00144 : public HalfedgeDS_halfedge_base_base< 00145 Refs, Tag_false, Tag_false, Tag_true> 00146 { 00147 public: 00148 typedef typename Refs::Halfedge_handle Halfedge_handle; 00149 typedef typename Refs::Face_handle Face_handle; 00150 typedef typename Refs::Face_const_handle Face_const_handle; 00151 typedef HalfedgeDS_halfedge_base<Refs, Tag_false,Tag_false,Tag_true> 00152 Base; 00153 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_false,Tag_false,Tag_true> 00154 Base_base; 00155 private: 00156 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00157 Face_handle f; 00158 public: 00159 // Explicit initialization of f to denote border halfedges 00160 // is needed if Face_handle is a C style pointer. 00161 HalfedgeDS_halfedge_base() : f( Face_handle()) {} 00162 00163 // the face to the left. 00164 Face_handle face() { return f; } 00165 Face_const_handle face() const { return f; } 00166 void set_face( Face_handle g) { f = g; } 00167 00168 bool is_border() const { return f == Face_handle();} 00169 // is true if `h' is a border halfedge. 00170 }; 00171 00172 template < class Refs > 00173 class HalfedgeDS_halfedge_base< Refs, 00174 Tag_true, // prev 00175 Tag_true, // vertex 00176 Tag_false> // face 00177 : public HalfedgeDS_halfedge_base_base< 00178 Refs, Tag_true, Tag_true, Tag_false> 00179 { 00180 public: 00181 typedef typename Refs::Halfedge_handle Halfedge_handle; 00182 typedef typename Refs::Halfedge_const_handle Halfedge_const_handle; 00183 typedef typename Refs::Vertex_handle Vertex_handle; 00184 typedef typename Refs::Vertex_const_handle Vertex_const_handle; 00185 typedef HalfedgeDS_halfedge_base<Refs, Tag_true,Tag_true,Tag_false> 00186 Base; 00187 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_true,Tag_true,Tag_false> 00188 Base_base; 00189 private: 00190 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00191 Halfedge_handle prv; 00192 Vertex_handle v; 00193 public: 00194 // the previous halfedge along the face. 00195 Halfedge_handle prev() { return prv; } 00196 Halfedge_const_handle prev() const { return prv; } 00197 void set_prev( Halfedge_handle h) { prv = h; } 00198 00199 // the incident vertex. 00200 Vertex_handle vertex() { return v; } 00201 Vertex_const_handle vertex() const { return v; } 00202 void set_vertex( Vertex_handle w) { v = w; } 00203 }; 00204 00205 template < class Refs > 00206 class HalfedgeDS_halfedge_base< Refs, 00207 Tag_true, // prev 00208 Tag_false, // vertex 00209 Tag_true> // face 00210 : public HalfedgeDS_halfedge_base_base< 00211 Refs, Tag_true, Tag_false, Tag_true> 00212 { 00213 public: 00214 typedef typename Refs::Halfedge_handle Halfedge_handle; 00215 typedef typename Refs::Halfedge_const_handle Halfedge_const_handle; 00216 typedef typename Refs::Face_handle Face_handle; 00217 typedef typename Refs::Face_const_handle Face_const_handle; 00218 typedef HalfedgeDS_halfedge_base<Refs, Tag_true,Tag_false,Tag_true> 00219 Base; 00220 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_true,Tag_false,Tag_true> 00221 Base_base; 00222 private: 00223 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00224 Halfedge_handle prv; 00225 Face_handle f; 00226 public: 00227 // Explicit initialization of f to denote border halfedges 00228 // is needed if Face_handle is a C style pointer. 00229 HalfedgeDS_halfedge_base() : f( Face_handle()) {} 00230 00231 // the previous halfedge along the face. 00232 Halfedge_handle prev() { return prv; } 00233 Halfedge_const_handle prev() const { return prv; } 00234 void set_prev( Halfedge_handle h) { prv = h; } 00235 00236 // the face to the left. 00237 Face_handle face() { return f; } 00238 Face_const_handle face() const { return f; } 00239 void set_face( Face_handle g) { f = g; } 00240 00241 bool is_border() const { return f == Face_handle();} 00242 // is true if `h' is a border halfedge. 00243 }; 00244 00245 template < class Refs > 00246 class HalfedgeDS_halfedge_base< Refs, 00247 Tag_false, // prev 00248 Tag_true, // vertex 00249 Tag_true> // face 00250 : public HalfedgeDS_halfedge_base_base< 00251 Refs, Tag_false, Tag_true, Tag_true> 00252 { 00253 public: 00254 typedef typename Refs::Halfedge_handle Halfedge_handle; 00255 typedef typename Refs::Vertex_handle Vertex_handle; 00256 typedef typename Refs::Vertex_const_handle Vertex_const_handle; 00257 typedef typename Refs::Face_handle Face_handle; 00258 typedef typename Refs::Face_const_handle Face_const_handle; 00259 typedef HalfedgeDS_halfedge_base<Refs, Tag_false,Tag_true,Tag_true> 00260 Base; 00261 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_false,Tag_true,Tag_true> 00262 Base_base; 00263 private: 00264 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00265 Vertex_handle v; 00266 Face_handle f; 00267 public: 00268 // Explicit initialization of f to denote border halfedges 00269 // is needed if Face_handle is a C style pointer. 00270 HalfedgeDS_halfedge_base() : f( Face_handle()) {} 00271 00272 // the incident vertex. 00273 Vertex_handle vertex() { return v; } 00274 Vertex_const_handle vertex() const { return v; } 00275 void set_vertex( Vertex_handle w) { v = w; } 00276 00277 // the face to the left. 00278 Face_handle face() { return f; } 00279 Face_const_handle face() const { return f; } 00280 void set_face( Face_handle g) { f = g; } 00281 00282 bool is_border() const { return f == Face_handle();} 00283 // is true if `h' is a border halfedge. 00284 }; 00285 00286 template < class Refs > 00287 class HalfedgeDS_halfedge_base< Refs, 00288 Tag_true, // prev 00289 Tag_true, // vertex 00290 Tag_true> // face 00291 : public HalfedgeDS_halfedge_base_base< 00292 Refs, Tag_true, Tag_true, Tag_true> 00293 { 00294 public: 00295 typedef typename Refs::Halfedge_handle Halfedge_handle; 00296 typedef typename Refs::Halfedge_const_handle Halfedge_const_handle; 00297 typedef typename Refs::Vertex_handle Vertex_handle; 00298 typedef typename Refs::Vertex_const_handle Vertex_const_handle; 00299 typedef typename Refs::Face_handle Face_handle; 00300 typedef typename Refs::Face_const_handle Face_const_handle; 00301 typedef HalfedgeDS_halfedge_base<Refs, Tag_true,Tag_true,Tag_true> 00302 Base; 00303 typedef HalfedgeDS_halfedge_base_base<Refs, Tag_true,Tag_true,Tag_true> 00304 Base_base; 00305 private: 00306 void set_opposite( Halfedge_handle h) { Base_base::set_opposite(h);} 00307 Halfedge_handle prv; 00308 Vertex_handle v; 00309 Face_handle f; 00310 public: 00311 // Explicit initialization of f to denote border halfedges 00312 // is needed if Face_handle is a C style pointer. 00313 HalfedgeDS_halfedge_base() : f( Face_handle()) {} 00314 00315 // the previous halfedge along the face. 00316 Halfedge_handle prev() { return prv; } 00317 Halfedge_const_handle prev() const { return prv; } 00318 void set_prev( Halfedge_handle h) { prv = h; } 00319 00320 // the incident vertex. 00321 Vertex_handle vertex() { return v; } 00322 Vertex_const_handle vertex() const { return v; } 00323 void set_vertex( Vertex_handle w) { v = w; } 00324 00325 // the face to the left. 00326 Face_handle face() { return f; } 00327 Face_const_handle face() const { return f; } 00328 void set_face( Face_handle g) { f = g; } 00329 00330 bool is_border() const { return f == Face_handle();} 00331 // is true if `h' is a border halfedge. 00332 }; 00333 00334 CGAL_END_NAMESPACE 00335 00336 #endif // CGAL_HALFEDGEDS_HALFEDGE_BASE_H // 00337 // EOF //