iterator_adaptors.h
来自「很多二维 三维几何计算算法 C++ 类库」· C头文件 代码 · 共 408 行
H
408 行
// Copyright (c) 2006 Foundation for Research and Technology-Hellas (Greece).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Voronoi_diagram_2/include/CGAL/Voronoi_diagram_2/Iterator_adaptors.h $// $Id: Iterator_adaptors.h 37429 2007-03-23 19:17:37Z spion $// //// Author(s) : Menelaos Karavelas <mkaravel@iacm.forth.gr>#ifndef CGAL_VORONOI_DIAGRAM_2_ITERATOR_ADAPTORS_H#define CGAL_VORONOI_DIAGRAM_2_ITERATOR_ADAPTORS_H 1#include <CGAL/Voronoi_diagram_2/basic.h>#include <iterator>#include <CGAL/Unique_hash_map.h>#include <CGAL/Triangulation_utils_2.h>CGAL_BEGIN_NAMESPACECGAL_VORONOI_DIAGRAM_2_BEGIN_NAMESPACEtemplate<class VDA, class Iterator, class Base_iterator, class Value_type>class Iterator_adaptor_base{ private: typedef Iterator_adaptor_base<VDA,Iterator,Base_iterator,Value_type> Self; public: typedef Value_type value_type; typedef Value_type& reference; typedef Value_type* pointer; typedef typename Base_iterator::size_type size_type; typedef typename Base_iterator::difference_type difference_type; typedef typename Base_iterator::iterator_category iterator_category; Iterator_adaptor_base(const VDA* vda = NULL) : vda_(vda), value_() {} Iterator_adaptor_base(const VDA* vda, const Base_iterator& cur) : vda_(vda), value_(), cur_(cur) {} Iterator_adaptor_base(const Self& other) { copy_from(other); } Self& operator=(const Self& other) { copy_from(other); return *this; } pointer operator->() const { const Iterator* ptr = static_cast<const Iterator*>(this); ptr->eval_pointer(); return &value_; } reference operator*() const { const Iterator* ptr = static_cast<const Iterator*>(this); ptr->eval_reference(); return value_; } Iterator& operator++() { Iterator* ptr = static_cast<Iterator*>(this); ptr->increment(); return *ptr; } Iterator& operator--() { Iterator* ptr = static_cast<Iterator*>(this); ptr->decrement(); return *ptr; } Iterator operator++(int) { Iterator tmp(*this); (static_cast<Iterator*>(this))->operator++(); return tmp; } Iterator operator--(int) { Iterator tmp(*this); (static_cast<Iterator*>(this))->operator--(); return tmp; } bool operator==(const Iterator& other) const { if ( vda_ == NULL ) { return other.vda_ == NULL; } if ( other.vda_ == NULL ) { return vda_ == NULL; } return ( vda_ == other.vda_ && cur_ == other.cur_ ); } bool operator!=(const Iterator& other) const { return !(*this == other); } protected: void copy_from(const Self& other) { vda_ = other.vda_; value_ = other.value_; if ( vda_ != NULL ) { cur_ = other.cur_; } } protected: const VDA* vda_; mutable value_type value_; Base_iterator cur_;};//=========================================================================//=========================================================================template<class VDA, class Base_it, class Tag = CGAL::Tag_true>class Edge_iterator_adaptor : public Iterator_adaptor_base<VDA, Edge_iterator_adaptor<VDA,Base_it,Tag>, Base_it, typename VDA::Halfedge>{ protected: typedef Triangulation_cw_ccw_2 CW_CCW_2; private: typedef Edge_iterator_adaptor<VDA,Base_it,Tag> Self; // Base_it is essentially VDA::Non_degenerate_edges_iterator typedef Base_it Base_iterator; typedef typename VDA::Halfedge Halfedge; typedef typename VDA::Halfedge_handle Halfedge_handle; typedef Halfedge Value; typedef Iterator_adaptor_base<VDA,Self,Base_iterator,Value> Base; friend class Iterator_adaptor_base<VDA,Self,Base_iterator,Value>; public: Edge_iterator_adaptor(const VDA* vda = NULL) : Base(vda) {} Edge_iterator_adaptor(const VDA* vda, const Base_iterator& cur) : Base(vda, cur) {} operator Halfedge_handle() const { eval_reference(); return Halfedge_handle(this->value_); } private: Edge_iterator_adaptor(const Base& base) : Base(base) {} void eval_pointer() const { eval_pointer(Tag()); } void eval_pointer(const Tag_false&) const { this->value_ = *this->cur_; } void eval_pointer(const Tag_true&) const { if ( this->vda_->dual().dimension() == 1 ) { int cw_i = CW_CCW_2::cw( this->cur_->second ); int ccw_i = CW_CCW_2::ccw( this->cur_->second ); this->value_ = Halfedge(this->vda_, this->cur_->first->vertex(ccw_i), this->cur_->first->vertex(cw_i)); return; } this->value_ = Halfedge(this->vda_, this->cur_->first, this->cur_->second); typename VDA::Delaunay_graph::Edge e = this->value_.dual(); int j = CW_CCW_2::ccw( e.second ); typename VDA::Delaunay_graph::Vertex_handle v = e.first->vertex(j); if ( this->vda_->face_rejector()(this->vda_->dual(), v) ) { this->value_ = *this->value_.opposite(); } } void eval_reference() const { eval_pointer(); } void increment() { ++this->cur_; } void decrement() { --this->cur_; }};//=========================================================================//=========================================================================template<class VDA, class Base_it>class Halfedge_iterator_adaptor : public Iterator_adaptor_base<VDA, Halfedge_iterator_adaptor<VDA,Base_it>, Base_it, typename VDA::Halfedge>{private: typedef Halfedge_iterator_adaptor<VDA,Base_it> Self; typedef typename VDA::Halfedge_handle Halfedge_handle; typedef typename VDA::Halfedge Halfedge; typedef Halfedge Value; // this is essentially VDA::Edge_iterator typedef Base_it Base_iterator; typedef Iterator_adaptor_base<VDA,Self,Base_iterator,Value> Base; friend class Iterator_adaptor_base<VDA,Self,Base_iterator,Value>; public: Halfedge_iterator_adaptor(const VDA* vda = NULL) : Base(vda) {} Halfedge_iterator_adaptor(const VDA* vda, Base_iterator cur) : Base(vda, cur), is_first_(true) {} Halfedge_iterator_adaptor(const Self& other) : Base(other) { copy_from(other); } operator Halfedge_handle() const { eval_reference(); return Halfedge_handle(this->value_); } Self& operator=(const Self& other) { copy_from(other); return *this; } bool operator==(const Self& other) const { return Base::operator==(other) && is_first_ == other.is_first_; } bool operator!=(const Self& other) const { return !(*this == other); } private: Halfedge_iterator_adaptor(const Base& base) : Base(base), is_first_(true) {} private: void increment() { if ( is_first_ ) { is_first_ = false; return; } is_first_ = true; ++this->cur_; } void decrement() { if ( is_first_ ) { is_first_ = false; --this->cur_; return; } is_first_ = true; } void eval_pointer() const { this->value_ = *this->cur_; if ( !is_first_ ) { this->value_ = *this->value_.opposite(); } } void eval_reference() const { eval_pointer(); } void copy_from(const Self& other) { this->vda_ = other.vda_; this->value_ = other.value_; is_first_ = other.is_first_; if ( this->vda_ != NULL ) { this->cur_ = other.cur_; } }private: bool is_first_;};//=========================================================================//=========================================================================template<class VDA, class Base_it>class Face_iterator_adaptor : public Iterator_adaptor_base<VDA, Face_iterator_adaptor<VDA,Base_it>, Base_it, typename VDA::Face>{ private: typedef Face_iterator_adaptor<VDA,Base_it> Self; // Base_it is essentially VDA::Delaunay_vertices_iterator typedef Base_it Base_iterator; typedef typename VDA::Face Face; typedef typename VDA::Face_handle Face_handle; typedef Face Value; typedef Iterator_adaptor_base<VDA,Self,Base_iterator,Value> Base; friend class Iterator_adaptor_base<VDA,Self,Base_iterator,Value>; public: Face_iterator_adaptor(const VDA* vda = NULL) : Base(vda) {} Face_iterator_adaptor(const VDA* vda, const Base_iterator& cur) : Base(vda, cur) {} operator Face_handle() const { eval_reference(); return Face_handle(this->value_); } private: Face_iterator_adaptor(const Base& base) : Base(base) {} void increment() { ++this->cur_; } void decrement() { --this->cur_; } void eval_pointer() const { this->value_ = Face(this->vda_, this->cur_.base()); } void eval_reference() const { eval_pointer(); }};//=========================================================================//=========================================================================template<class VDA, class Base_it>class Vertex_iterator_adaptor : public Iterator_adaptor_base<VDA, Vertex_iterator_adaptor<VDA,Base_it>, Base_it, typename VDA::Vertex>{ private: typedef Vertex_iterator_adaptor<VDA,Base_it> Self; // Base_it is essentially VDA::Non_degenerate_vertices_iterator typedef Base_it Base_iterator; typedef typename VDA::Vertex Vertex; typedef typename VDA::Vertex_handle Vertex_handle; typedef Vertex Value; typedef Iterator_adaptor_base<VDA,Self,Base_iterator,Value> Base; friend class Iterator_adaptor_base<VDA,Self,Base_iterator,Value>; public: Vertex_iterator_adaptor(const VDA* vda = NULL) : Base(vda) {} Vertex_iterator_adaptor(const VDA* vda, const Base_iterator& cur) : Base(vda, cur) {} operator Vertex_handle() const { eval_reference(); return Vertex_handle(this->value_); } private: Vertex_iterator_adaptor(const Base& base) : Base(base) {} void increment() { ++this->cur_; } void decrement() { --this->cur_; } void eval_pointer() const { this->value_ = Vertex(this->vda_, this->cur_.base()); } void eval_reference() const { eval_pointer(); }};//=========================================================================//=========================================================================CGAL_VORONOI_DIAGRAM_2_END_NAMESPACECGAL_END_NAMESPACE#endif // CGAL_VORONOI_DIAGRAM_2_ITERATOR_ADAPTORS_H
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?