mirror of https://github.com/CGAL/cgal
Restore erase counter after destroy/creation (6.0.x) (#8898)
6.0.x version of #8820
This commit is contained in:
commit
b18866d30a
|
|
@ -177,6 +177,8 @@ namespace internal {
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
static void set_erase_counter(Element &, unsigned int) {}
|
static void set_erase_counter(Element &, unsigned int) {}
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
|
static void restore_erase_counter(Element*, unsigned int) {}
|
||||||
|
template <typename Element>
|
||||||
static void increment_erase_counter(Element &) {}
|
static void increment_erase_counter(Element &) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -192,12 +194,24 @@ namespace internal {
|
||||||
return e.erase_counter();
|
return e.erase_counter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Element>
|
||||||
|
static unsigned int erase_counter(Element* e)
|
||||||
|
{
|
||||||
|
return e->erase_counter();
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
static void set_erase_counter(Element &e, unsigned int c)
|
static void set_erase_counter(Element &e, unsigned int c)
|
||||||
{
|
{
|
||||||
e.set_erase_counter(c);
|
e.set_erase_counter(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Element>
|
||||||
|
static void restore_erase_counter(Element* e, unsigned int c)
|
||||||
|
{
|
||||||
|
e->set_erase_counter(c);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
static void increment_erase_counter(Element &e)
|
static void increment_erase_counter(Element &e)
|
||||||
{
|
{
|
||||||
|
|
@ -392,13 +406,18 @@ public:
|
||||||
iterator
|
iterator
|
||||||
emplace(const Args&... args)
|
emplace(const Args&... args)
|
||||||
{
|
{
|
||||||
|
typedef internal::Erase_counter_strategy<
|
||||||
|
internal::has_increment_erase_counter<T>::value> EraseCounterStrategy;
|
||||||
|
|
||||||
if (free_list == nullptr)
|
if (free_list == nullptr)
|
||||||
allocate_new_block();
|
allocate_new_block();
|
||||||
|
|
||||||
pointer ret = free_list;
|
pointer ret = free_list;
|
||||||
free_list = clean_pointee(ret);
|
free_list = clean_pointee(ret);
|
||||||
std::size_t ts;
|
std::size_t ts;
|
||||||
|
const auto ec = EraseCounterStrategy::erase_counter(ret);
|
||||||
CGAL_USE(ts);
|
CGAL_USE(ts);
|
||||||
|
|
||||||
if constexpr (Time_stamper::has_timestamp) {
|
if constexpr (Time_stamper::has_timestamp) {
|
||||||
ts = ret->time_stamp();
|
ts = ret->time_stamp();
|
||||||
}
|
}
|
||||||
|
|
@ -407,6 +426,7 @@ public:
|
||||||
ret->set_time_stamp(ts);
|
ret->set_time_stamp(ts);
|
||||||
}
|
}
|
||||||
Time_stamper::set_time_stamp(ret, time_stamp);
|
Time_stamper::set_time_stamp(ret, time_stamp);
|
||||||
|
EraseCounterStrategy::restore_erase_counter(ret, ec);
|
||||||
CGAL_assertion(type(ret) == USED);
|
CGAL_assertion(type(ret) == USED);
|
||||||
++size_;
|
++size_;
|
||||||
return iterator(ret, 0);
|
return iterator(ret, 0);
|
||||||
|
|
@ -414,6 +434,9 @@ public:
|
||||||
|
|
||||||
iterator insert(const T &t)
|
iterator insert(const T &t)
|
||||||
{
|
{
|
||||||
|
typedef internal::Erase_counter_strategy<
|
||||||
|
internal::has_increment_erase_counter<T>::value> EraseCounterStrategy;
|
||||||
|
|
||||||
if (free_list == nullptr)
|
if (free_list == nullptr)
|
||||||
allocate_new_block();
|
allocate_new_block();
|
||||||
|
|
||||||
|
|
@ -421,6 +444,8 @@ public:
|
||||||
free_list = clean_pointee(ret);
|
free_list = clean_pointee(ret);
|
||||||
std::size_t ts;
|
std::size_t ts;
|
||||||
CGAL_USE(ts);
|
CGAL_USE(ts);
|
||||||
|
const auto ec = EraseCounterStrategy::erase_counter(ret);
|
||||||
|
|
||||||
if constexpr (Time_stamper::has_timestamp) {
|
if constexpr (Time_stamper::has_timestamp) {
|
||||||
ts = ret->time_stamp();
|
ts = ret->time_stamp();
|
||||||
}
|
}
|
||||||
|
|
@ -429,6 +454,8 @@ public:
|
||||||
ret->set_time_stamp(ts);
|
ret->set_time_stamp(ts);
|
||||||
}
|
}
|
||||||
Time_stamper::set_time_stamp(ret, time_stamp);
|
Time_stamper::set_time_stamp(ret, time_stamp);
|
||||||
|
EraseCounterStrategy::restore_erase_counter(ret, ec);
|
||||||
|
|
||||||
CGAL_assertion(type(ret) == USED);
|
CGAL_assertion(type(ret) == USED);
|
||||||
++size_;
|
++size_;
|
||||||
return iterator(ret, 0);
|
return iterator(ret, 0);
|
||||||
|
|
@ -455,6 +482,7 @@ public:
|
||||||
|
|
||||||
CGAL_precondition(type(&*x) == USED);
|
CGAL_precondition(type(&*x) == USED);
|
||||||
EraseCounterStrategy::increment_erase_counter(*x);
|
EraseCounterStrategy::increment_erase_counter(*x);
|
||||||
|
const auto ec = EraseCounterStrategy::erase_counter(*x);
|
||||||
std::size_t ts;
|
std::size_t ts;
|
||||||
CGAL_USE(ts);
|
CGAL_USE(ts);
|
||||||
if constexpr (Time_stamper::has_timestamp) {
|
if constexpr (Time_stamper::has_timestamp) {
|
||||||
|
|
@ -464,6 +492,8 @@ public:
|
||||||
if constexpr (Time_stamper::has_timestamp) {
|
if constexpr (Time_stamper::has_timestamp) {
|
||||||
x->set_time_stamp(ts);
|
x->set_time_stamp(ts);
|
||||||
}
|
}
|
||||||
|
EraseCounterStrategy::restore_erase_counter(&*x, ec);
|
||||||
|
|
||||||
|
|
||||||
put_on_free_list(&*x);
|
put_on_free_list(&*x);
|
||||||
--size_;
|
--size_;
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,8 @@ namespace CCC_internal {
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
static void set_erase_counter(Element &, unsigned int) {}
|
static void set_erase_counter(Element &, unsigned int) {}
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
|
static void restore_erase_counter(Element*, unsigned int) {}
|
||||||
|
template <typename Element>
|
||||||
static void increment_erase_counter(Element &) {}
|
static void increment_erase_counter(Element &) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -95,12 +97,30 @@ namespace CCC_internal {
|
||||||
return e.erase_counter();
|
return e.erase_counter();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Element>
|
||||||
|
static unsigned int erase_counter(Element* e)
|
||||||
|
{
|
||||||
|
return e->erase_counter();
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
static void set_erase_counter(Element &e, unsigned int c)
|
static void set_erase_counter(Element &e, unsigned int c)
|
||||||
{
|
{
|
||||||
e.set_erase_counter(c);
|
e.set_erase_counter(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Element>
|
||||||
|
static void set_erase_counter(Element* e, unsigned int c)
|
||||||
|
{
|
||||||
|
e->set_erase_counter(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Element>
|
||||||
|
static void restore_erase_counter(Element* e, unsigned int c)
|
||||||
|
{
|
||||||
|
e->set_erase_counter(c);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Element>
|
template <typename Element>
|
||||||
static void increment_erase_counter(Element &e)
|
static void increment_erase_counter(Element &e)
|
||||||
{
|
{
|
||||||
|
|
@ -350,7 +370,7 @@ public:
|
||||||
CCC_internal::has_increment_erase_counter<T>::value> EraseCounterStrategy;
|
CCC_internal::has_increment_erase_counter<T>::value> EraseCounterStrategy;
|
||||||
FreeList * fl = get_free_list();
|
FreeList * fl = get_free_list();
|
||||||
pointer ret = init_insert(fl);
|
pointer ret = init_insert(fl);
|
||||||
auto erase_counter = EraseCounterStrategy::erase_counter(*ret);;
|
auto erase_counter = EraseCounterStrategy::erase_counter(*ret);
|
||||||
new (ret) value_type(args...);
|
new (ret) value_type(args...);
|
||||||
EraseCounterStrategy::set_erase_counter(*ret, erase_counter);
|
EraseCounterStrategy::set_erase_counter(*ret, erase_counter);
|
||||||
return finalize_insert(ret, fl);
|
return finalize_insert(ret, fl);
|
||||||
|
|
@ -390,9 +410,10 @@ private:
|
||||||
|
|
||||||
CGAL_precondition(type(x) == USED);
|
CGAL_precondition(type(x) == USED);
|
||||||
EraseCounterStrategy::increment_erase_counter(*x);
|
EraseCounterStrategy::increment_erase_counter(*x);
|
||||||
|
auto erase_counter = EraseCounterStrategy::erase_counter(*x);
|
||||||
|
auto ptr = &*x;
|
||||||
std::allocator_traits<allocator_type>::destroy(m_alloc, &*x);
|
std::allocator_traits<allocator_type>::destroy(m_alloc, &*x);
|
||||||
|
EraseCounterStrategy::set_erase_counter(ptr, erase_counter);
|
||||||
put_on_free_list(&*x, fl);
|
put_on_free_list(&*x, fl);
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue