STL_extension: Add parameter for value type to Prevent_deref

This commit is contained in:
Andreas Fabri 2023-04-26 10:55:59 +01:00
parent b3c2bac164
commit 68261eb0f1
6 changed files with 36 additions and 27 deletions

View File

@ -37,19 +37,23 @@
namespace CGAL { namespace CGAL {
template<typename I> template<typename I, typename VT = I>
class Prevent_deref class Prevent_deref
: public boost::iterator_adaptor< : public boost::iterator_adaptor<
Prevent_deref<I> Prevent_deref<I,VT>
, I // base , I // base
, I // value , VT // value
, boost::use_default
, VT // ref
> >
{ {
public: public:
typedef boost::iterator_adaptor< typedef boost::iterator_adaptor<
Prevent_deref<I> Prevent_deref<I,VT>
, I // base , I // base
, I // value , VT // value
, boost::use_default
, VT // ref
> Base; > Base;
typedef typename Base::reference reference; typedef typename Base::reference reference;
typedef typename std::pair<I, I> range; typedef typename std::pair<I, I> range;
@ -58,9 +62,16 @@ public:
Prevent_deref(const I& i) : Base(i) {} Prevent_deref(const I& i) : Base(i) {}
private: private:
friend class boost::iterator_core_access; friend class boost::iterator_core_access;
reference dereference() const { return const_cast<typename boost::remove_reference<reference>::type&>(this->base_reference()); } reference dereference() const {
return this->base_reference();
}
}; };
template<typename I> template<typename I>
Iterator_range<Prevent_deref<I> > make_prevent_deref_range(const Iterator_range<I>& range) Iterator_range<Prevent_deref<I> > make_prevent_deref_range(const Iterator_range<I>& range)
{ {

View File

@ -183,7 +183,7 @@ public:
} }
Face_handles face_handles() const { Face_handles face_handles() const {
return make_prevent_deref_range(faces_begin(),faces_end()); return { faces_begin(),faces_end() };
} }
Vertex_iterator vertices_begin() const { Vertex_iterator vertices_begin() const {
@ -195,7 +195,7 @@ public:
} }
Vertex_handles vertex_handles() const { Vertex_handles vertex_handles() const {
return make_prevent_deref_range(vertices_begin(),vertices_end()); return { vertices_begin(),vertices_end() };
} }
Edge_iterator edges_begin() const { Edge_iterator edges_begin() const {

View File

@ -661,7 +661,7 @@ public:
Cell_handles cell_handles() const Cell_handles cell_handles() const
{ {
return make_prevent_deref_range(cells_begin(), cells_end()); return {cells_begin(), cells_end()};
} }
Cell_iterator raw_cells_begin() const Cell_iterator raw_cells_begin() const
@ -720,7 +720,7 @@ public:
Vertex_handles vertex_handles() const Vertex_handles vertex_handles() const
{ {
return make_prevent_deref_range(vertices_begin(), vertices_end()); return {vertices_begin(), vertices_end()};
} }
// CIRCULATOR METHODS // CIRCULATOR METHODS

View File

@ -183,7 +183,7 @@ public:
operator Vertex_handle() const { return Base::base(); } operator Vertex_handle() const { return Base::base(); }
}; };
typedef Iterator_range<Prevent_deref<Finite_vertices_iterator> > Finite_vertex_handles; typedef Iterator_range<Prevent_deref<Finite_vertices_iterator, Vertex_handle> > Finite_vertex_handles;
class Hidden_vertices_iterator : class Hidden_vertices_iterator :
public Filter_iterator<Finite_vib, Unhidden_tester> public Filter_iterator<Finite_vib, Unhidden_tester>
@ -200,7 +200,7 @@ public:
operator Vertex_handle() const { return Base::base(); } operator Vertex_handle() const { return Base::base(); }
}; };
typedef Iterator_range<Prevent_deref<Hidden_vertices_iterator> > Hidden_vertex_handles; typedef Iterator_range<Prevent_deref<Hidden_vertices_iterator,Vertex_handle> > Hidden_vertex_handles;
//for backward compatibility //for backward compatibility
typedef Finite_faces_iterator Face_iterator; typedef Finite_faces_iterator Face_iterator;
@ -2236,7 +2236,7 @@ typename Regular_triangulation_2<Gt,Tds>::Finite_vertex_handles
Regular_triangulation_2<Gt,Tds>:: Regular_triangulation_2<Gt,Tds>::
finite_vertex_handles() const finite_vertex_handles() const
{ {
return make_prevent_deref_range(finite_vertices_begin(),finite_vertices_end()); return { finite_vertices_begin(),finite_vertices_end() };
} }
template < class Gt, class Tds > template < class Gt, class Tds >
@ -2263,7 +2263,7 @@ typename Regular_triangulation_2<Gt,Tds>::Hidden_vertex_handles
Regular_triangulation_2<Gt,Tds>:: Regular_triangulation_2<Gt,Tds>::
hidden_vertex_handles() const hidden_vertex_handles() const
{ {
return make_prevent_deref_range(hidden_vertices_begin(),hidden_vertices_end()); return { hidden_vertices_begin(),hidden_vertices_end() };
} }
template < class Gt, class Tds > template < class Gt, class Tds >

View File

@ -213,8 +213,8 @@ public:
typedef typename Tds::Vertex_handles All_vertex_handles; typedef typename Tds::Vertex_handles All_vertex_handles;
typedef typename Tds::Edges All_edges; typedef typename Tds::Edges All_edges;
typedef Iterator_range<Prevent_deref<Finite_faces_iterator> > Finite_face_handles; typedef Iterator_range<Prevent_deref<Finite_faces_iterator, Face_handle> > Finite_face_handles;
typedef Iterator_range<Prevent_deref<Finite_vertices_iterator> > Finite_vertex_handles; typedef Iterator_range<Prevent_deref<Finite_vertices_iterator, Vertex_handle> > Finite_vertex_handles;
typedef Iterator_range<Finite_edges_iterator> Finite_edges; typedef Iterator_range<Finite_edges_iterator> Finite_edges;
typedef Iterator_range<Point_iterator> Points; typedef Iterator_range<Point_iterator> Points;
@ -3206,7 +3206,7 @@ typename Triangulation_2<Gt, Tds>::Finite_face_handles
Triangulation_2<Gt, Tds>:: Triangulation_2<Gt, Tds>::
finite_face_handles() const finite_face_handles() const
{ {
return make_prevent_deref_range(finite_faces_begin(),finite_faces_end()); return { finite_faces_begin(),finite_faces_end() };
} }
template <class Gt, class Tds > template <class Gt, class Tds >
@ -3235,7 +3235,7 @@ typename Triangulation_2<Gt, Tds>::Finite_vertex_handles
Triangulation_2<Gt, Tds>:: Triangulation_2<Gt, Tds>::
finite_vertex_handles() const finite_vertex_handles() const
{ {
return make_prevent_deref_range(finite_vertices_begin(),finite_vertices_end()); return { finite_vertices_begin(),finite_vertices_end() };
} }
template <class Gt, class Tds > template <class Gt, class Tds >

View File

@ -517,8 +517,8 @@ public:
operator Vertex_handle() const { return Base::base(); } operator Vertex_handle() const { return Base::base(); }
}; };
typedef Iterator_range<Prevent_deref<Finite_cells_iterator> > Finite_cell_handles; typedef Iterator_range<Prevent_deref<Finite_cells_iterator, Cell_handle> > Finite_cell_handles;
typedef Iterator_range<Prevent_deref<Finite_vertices_iterator> > Finite_vertex_handles; typedef Iterator_range<Prevent_deref<Finite_vertices_iterator,Vertex_handle> > Finite_vertex_handles;
typedef Filter_iterator<Edge_iterator, Infinite_tester> Finite_edges_iterator; typedef Filter_iterator<Edge_iterator, Infinite_tester> Finite_edges_iterator;
typedef Filter_iterator<Facet_iterator, Infinite_tester> Finite_facets_iterator; typedef Filter_iterator<Facet_iterator, Infinite_tester> Finite_facets_iterator;
@ -529,7 +529,7 @@ public:
typedef Triangulation_segment_cell_iterator_3<Self> Segment_cell_iterator; typedef Triangulation_segment_cell_iterator_3<Self> Segment_cell_iterator;
typedef Triangulation_segment_simplex_iterator_3<Self> Segment_simplex_iterator; typedef Triangulation_segment_simplex_iterator_3<Self> Segment_simplex_iterator;
typedef Iterator_range<Prevent_deref<Segment_cell_iterator> > Segment_traverser_cell_handles; typedef Iterator_range<Prevent_deref<Segment_cell_iterator, Cell_handle> > Segment_traverser_cell_handles;
typedef Iterator_range<Segment_simplex_iterator> Segment_traverser_simplices; typedef Iterator_range<Segment_simplex_iterator> Segment_traverser_simplices;
private: private:
@ -1803,7 +1803,7 @@ public:
Finite_cell_handles finite_cell_handles() const Finite_cell_handles finite_cell_handles() const
{ {
return make_prevent_deref_range(finite_cells_begin(), finite_cells_end()); return {finite_cells_begin(), finite_cells_end()};
} }
@ -1833,7 +1833,7 @@ public:
Finite_vertex_handles finite_vertex_handles() const Finite_vertex_handles finite_vertex_handles() const
{ {
return make_prevent_deref_range(finite_vertices_begin(), finite_vertices_end()); return { finite_vertices_begin(), finite_vertices_end()};
} }
Vertex_iterator vertices_begin() const { return _tds.vertices_begin(); } Vertex_iterator vertices_begin() const { return _tds.vertices_begin(); }
@ -2245,15 +2245,13 @@ public:
Segment_traverser_cell_handles segment_traverser_cell_handles(Vertex_handle vs, Segment_traverser_cell_handles segment_traverser_cell_handles(Vertex_handle vs,
Vertex_handle vt) const Vertex_handle vt) const
{ {
return make_prevent_deref_range(segment_traverser_cells_begin(vs, vt), return {segment_traverser_cells_begin(vs, vt),segment_traverser_cells_end()};
segment_traverser_cells_end());
} }
Segment_traverser_cell_handles segment_traverser_cell_handles(const Point& ps, Segment_traverser_cell_handles segment_traverser_cell_handles(const Point& ps,
const Point& pt, const Point& pt,
Cell_handle hint = Cell_handle()) const Cell_handle hint = Cell_handle()) const
{ {
return make_prevent_deref_range(segment_traverser_cells_begin(ps, pt, hint), return { segment_traverser_cells_begin(ps, pt, hint), segment_traverser_cells_end()};
segment_traverser_cells_end());
} }
//// Segment Simplex Iterator //// Segment Simplex Iterator