mirror of https://github.com/CGAL/cgal
Get rid of index using pointer squatting + before/after functions
This commit is contained in:
parent
caf5b31af6
commit
acb96cba86
|
|
@ -90,6 +90,11 @@ public:
|
|||
/*! Destructor. */
|
||||
virtual ~Arr_vertex_base() {}
|
||||
|
||||
// Access/modification for pointer squatting
|
||||
void* inc() const { return p_inc; }
|
||||
void set_inc(void * inc) const
|
||||
{ const_cast<Arr_vertex_base&>(*this).p_inc = inc; }
|
||||
|
||||
/*! Check if the point pointer is nullptr. */
|
||||
bool has_null_point() const { return (p_pt == nullptr); }
|
||||
|
||||
|
|
@ -287,8 +292,6 @@ public:
|
|||
typedef Arr_halfedge<V,H,F> Halfedge;
|
||||
typedef Arr_isolated_vertex<V,H,F> Isolated_vertex;
|
||||
|
||||
mutable std::size_t index;
|
||||
|
||||
/*! Default constructor. */
|
||||
Arr_vertex() {}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,24 +40,31 @@
|
|||
|
||||
namespace CGAL {
|
||||
|
||||
template <typename Curve>
|
||||
template <typename Arr1, typename Arr2, typename Curve>
|
||||
class Indexed_sweep_accessor
|
||||
{
|
||||
std::size_t nbv;
|
||||
const Arr1& arr1;
|
||||
const Arr2& arr2;
|
||||
mutable std::vector<void*> backup_inc;
|
||||
|
||||
public:
|
||||
Indexed_sweep_accessor (std::size_t nbv) : nbv(nbv) { }
|
||||
|
||||
std::size_t nb_vertices() const { return nbv; }
|
||||
Indexed_sweep_accessor (const Arr1& arr1, const Arr2& arr2)
|
||||
: arr1(arr1), arr2(arr2) { }
|
||||
|
||||
std::size_t nb_vertices() const
|
||||
{
|
||||
return arr1.number_of_vertices() + arr2.number_of_vertices();
|
||||
}
|
||||
|
||||
std::size_t source_index (const Curve& c) const
|
||||
{
|
||||
return halfedge(c)->target()->index;
|
||||
return reinterpret_cast<std::size_t>(halfedge(c)->target()->inc());
|
||||
}
|
||||
|
||||
std::size_t target_index (const Curve& c) const
|
||||
{
|
||||
return halfedge(c)->source()->index;
|
||||
return reinterpret_cast<std::size_t>(halfedge(c)->source()->inc());
|
||||
}
|
||||
|
||||
const Curve& curve (const Curve& c) const
|
||||
|
|
@ -65,6 +72,35 @@ public:
|
|||
return c;
|
||||
}
|
||||
|
||||
void before_init() const
|
||||
{
|
||||
std::size_t idx = 0;
|
||||
backup_inc.reserve (nb_vertices());
|
||||
for (typename Arr1::Vertex_const_iterator vit = arr1.vertices_begin();
|
||||
vit != arr1.vertices_end(); ++vit, ++idx)
|
||||
{
|
||||
backup_inc[idx] = vit->inc();
|
||||
vit->set_inc (reinterpret_cast<void*>(idx));
|
||||
}
|
||||
for (typename Arr2::Vertex_const_iterator vit = arr2.vertices_begin();
|
||||
vit != arr2.vertices_end(); ++vit, ++idx)
|
||||
{
|
||||
backup_inc[idx] = vit->inc();
|
||||
vit->set_inc (reinterpret_cast<void*>(idx));
|
||||
}
|
||||
}
|
||||
|
||||
void after_init() const
|
||||
{
|
||||
std::size_t idx = 0;
|
||||
for (typename Arr1::Vertex_const_iterator vit = arr1.vertices_begin();
|
||||
vit != arr1.vertices_end(); ++vit, ++idx)
|
||||
vit->set_inc (backup_inc[idx]);
|
||||
for (typename Arr2::Vertex_const_iterator vit = arr2.vertices_begin();
|
||||
vit != arr2.vertices_end(); ++vit, ++idx)
|
||||
vit->set_inc (backup_inc[idx]);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
typename Curve::Halfedge_handle halfedge (const Curve& c) const
|
||||
|
|
@ -168,15 +204,6 @@ overlay(const Arrangement_on_surface_2<GeometryTraitsA_2, TopologyTraitsA>& arr1
|
|||
CGAL_precondition(((void*)(&arr) != (void*)(&arr1)) &&
|
||||
((void*)(&arr) != (void*)(&arr2)));
|
||||
|
||||
// Index vertices for indexed sweep
|
||||
std::size_t idx = 0;
|
||||
for (typename Arr_a::Vertex_const_iterator vit = arr1.vertices_begin();
|
||||
vit != arr1.vertices_end(); ++vit, ++idx)
|
||||
vit->index = idx;
|
||||
for (typename Arr_b::Vertex_const_iterator vit = arr2.vertices_begin();
|
||||
vit != arr2.vertices_end(); ++vit, ++idx)
|
||||
vit->index = idx;
|
||||
|
||||
// Prepare a vector of extended x-monotone curves that represent all edges
|
||||
// in both input arrangements. Each curve is associated with a halfedge
|
||||
// directed from right to left.
|
||||
|
|
@ -231,7 +258,10 @@ overlay(const Arrangement_on_surface_2<GeometryTraitsA_2, TopologyTraitsA>& arr1
|
|||
if (total_iso_verts == 0) {
|
||||
// Clear the result arrangement and perform the sweep to construct it.
|
||||
arr.clear();
|
||||
surface_sweep.indexed_sweep (xcvs_vec, Indexed_sweep_accessor<Ovl_x_monotone_curve_2>(idx));
|
||||
surface_sweep.indexed_sweep (xcvs_vec,
|
||||
Indexed_sweep_accessor
|
||||
<Arr_a, Arr_b, Ovl_x_monotone_curve_2>
|
||||
(arr1, arr2));
|
||||
xcvs_vec.clear();
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -314,7 +314,9 @@ public:
|
|||
const Accessor& accessor)
|
||||
{
|
||||
m_visitor->before_sweep();
|
||||
accessor.before_init();
|
||||
_init_indexed_sweep(edges, accessor);
|
||||
accessor.after_init();
|
||||
_sweep();
|
||||
_complete_sweep();
|
||||
m_visitor->after_sweep();
|
||||
|
|
|
|||
Loading…
Reference in New Issue