BWAPI
SPAR/AIModule/BWTA/vendors/CGAL/CGAL/HalfedgeDS_halfedge_base.h
Go to the documentation of this file.
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 //
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines