Apply on triangulation_hierarchy_2 the same fix as in 3D

This commit is contained in:
Laurent Rineau 2021-02-04 09:21:36 +01:00
parent 9799879eef
commit b8bb3ffc09
1 changed files with 21 additions and 40 deletions

View File

@ -37,6 +37,7 @@
#include <map> #include <map>
#include <vector> #include <vector>
#include <array> #include <array>
#include <CGAL/array.h>
namespace CGAL { namespace CGAL {
@ -82,7 +83,14 @@ public:
#endif #endif
private: private:
// here is the stack of triangulations which form the hierarchy void init_hierarchy() {
hierarchy[0] = this;
for(int i=1; i<Triangulation_hierarchy_2__maxlevel; ++i)
hierarchy[i] = &hierarchy_triangulations[i-1];
}
// here is the stack of triangulations which form the hierarchy
std::array<Tr_Base,Triangulation_hierarchy_2__maxlevel-1> hierarchy_triangulations;
std::array<Tr_Base*,Triangulation_hierarchy_2__maxlevel> hierarchy; std::array<Tr_Base*,Triangulation_hierarchy_2__maxlevel> hierarchy;
boost::rand48 random; boost::rand48 random;
@ -93,13 +101,10 @@ public:
Triangulation_hierarchy_2(Triangulation_hierarchy_2&& other) Triangulation_hierarchy_2(Triangulation_hierarchy_2&& other)
noexcept( noexcept(Tr_Base(std::move(other))) ) noexcept( noexcept(Tr_Base(std::move(other))) )
: Tr_Base(std::move(other)) : Tr_Base(std::move(other))
, hierarchy_triangulations(std::move(other.hierarchy_triangulations))
, random(std::move(other.random)) , random(std::move(other.random))
{ {
hierarchy[0] = this; init_hierarchy();
for(int i=1; i<Triangulation_hierarchy_2__maxlevel; ++i) {
hierarchy[i] = other.hierarchy[i];
other.hierarchy[i] = nullptr;
}
} }
template<class InputIterator> template<class InputIterator>
@ -107,10 +112,7 @@ public:
const Geom_traits& traits = Geom_traits()) const Geom_traits& traits = Geom_traits())
: Tr_Base(traits) : Tr_Base(traits)
{ {
hierarchy[0] = this; init_hierarchy();
for(int i=1;i<Triangulation_hierarchy_2__maxlevel;++i)
hierarchy[i] = new Tr_Base(traits);
insert (first, beyond); insert (first, beyond);
} }
@ -120,15 +122,11 @@ public:
noexcept( noexcept(Triangulation_hierarchy_2(std::move(other))) ) noexcept( noexcept(Triangulation_hierarchy_2(std::move(other))) )
{ {
static_cast<Tr_Base&>(*this) = std::move(other); static_cast<Tr_Base&>(*this) = std::move(other);
hierarchy[0] = this; hierarchy_triangulations = std::move(other.hierarchy_triangulations);
for(int i=1; i<Triangulation_hierarchy_2__maxlevel; ++i) {
hierarchy[i] = other.hierarchy[i];
other.hierarchy[i] = nullptr;
}
return *this; return *this;
} }
~Triangulation_hierarchy_2(); ~Triangulation_hierarchy_2() = default;
//Helping //Helping
void copy_triangulation(const Triangulation_hierarchy_2 &tr); void copy_triangulation(const Triangulation_hierarchy_2 &tr);
@ -293,10 +291,11 @@ template <class Tr_>
Triangulation_hierarchy_2<Tr_>:: Triangulation_hierarchy_2<Tr_>::
Triangulation_hierarchy_2(const Geom_traits& traits) Triangulation_hierarchy_2(const Geom_traits& traits)
: Tr_Base(traits) : Tr_Base(traits)
, hierarchy_triangulations(
make_filled_array<Triangulation_hierarchy_2__maxlevel-1,
Tr_Base>(traits))
{ {
hierarchy[0] = this; init_hierarchy();
for(int i=1;i<Triangulation_hierarchy_2__maxlevel;++i)
hierarchy[i] = new Tr_Base(traits);
} }
@ -304,12 +303,8 @@ Triangulation_hierarchy_2(const Geom_traits& traits)
template <class Tr_> template <class Tr_>
Triangulation_hierarchy_2<Tr_>:: Triangulation_hierarchy_2<Tr_>::
Triangulation_hierarchy_2(const Triangulation_hierarchy_2<Tr_> &tr) Triangulation_hierarchy_2(const Triangulation_hierarchy_2<Tr_> &tr)
: Tr_Base() : Triangulation_hierarchy_2(tr.geom_traits())
{ {
// create an empty triangulation to be able to delete it !
hierarchy[0] = this;
for(int i=1;i<Triangulation_hierarchy_2__maxlevel;++i)
hierarchy[i] = new Tr_Base(tr.geom_traits());
copy_triangulation(tr); copy_triangulation(tr);
} }
@ -392,23 +387,9 @@ void
Triangulation_hierarchy_2<Tr_>:: Triangulation_hierarchy_2<Tr_>::
swap(Triangulation_hierarchy_2<Tr_> &tr) swap(Triangulation_hierarchy_2<Tr_> &tr)
{ {
Tr_Base* temp;
Tr_Base::swap(tr); Tr_Base::swap(tr);
for(int i= 1; i<Triangulation_hierarchy_2__maxlevel; ++i){ using std::swap;
temp = hierarchy[i]; swap(hierarchy_triangulations, tr.hierarchy_triangulations);
hierarchy[i] = tr.hierarchy[i];
tr.hierarchy[i]= temp;
}
}
template <class Tr_>
Triangulation_hierarchy_2<Tr_>::
~Triangulation_hierarchy_2()
{
clear();
for(int i= 1; i<Triangulation_hierarchy_2__maxlevel; ++i){
delete hierarchy[i];
}
} }
template <class Tr_> template <class Tr_>