Bug fix for compact container with index, when iterating on empty container.

This commit is contained in:
Guillaume Damiand 2025-02-13 17:47:29 +01:00
parent 5190030a73
commit 4a0e20f938
3 changed files with 33 additions and 23 deletions

View File

@ -86,7 +86,8 @@ namespace CGAL {
Tag_true>::value); Tag_true>::value);
CGAL_assertion(amap.is_whole_map_unmarked(mcell_mark_number)); CGAL_assertion(amap.is_whole_map_unmarked(mcell_mark_number));
mark_cell<Map,i,dim>(amap, adart, mcell_mark_number); if(this->cont())
{ mark_cell<Map,i,dim>(amap, adart, mcell_mark_number); }
} }
/// Destructor. /// Destructor.
@ -126,7 +127,8 @@ namespace CGAL {
{ {
unmark_treated_darts(); unmark_treated_darts();
Ite::rewind(); Ite::rewind();
mark_cell<Map,i,dim>(*this->mmap, (*this), mcell_mark_number); if(this->cont())
{ mark_cell<Map,i,dim>(*this->mmap, (*this), mcell_mark_number); }
} }
/// Prefix ++ operator. /// Prefix ++ operator.
@ -199,7 +201,8 @@ namespace CGAL {
static_assert(std::is_same<typename Ite::Basic_iterator, static_assert(std::is_same<typename Ite::Basic_iterator,
Tag_true>::value); Tag_true>::value);
CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number));
mark_cell<Map,i,dim>(amap, adart, mmark_number); if(this->cont())
{ mark_cell<Map,i,dim>(amap, adart, mmark_number); }
} }
/// Destructor. /// Destructor.
@ -234,7 +237,8 @@ namespace CGAL {
{ {
unmark_treated_darts(); unmark_treated_darts();
Ite::rewind(); Ite::rewind();
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); if(this->cont())
{ mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); }
} }
/// Postfix ++ operator. /// Postfix ++ operator.
@ -253,7 +257,7 @@ namespace CGAL {
this->mmap->is_marked((*this), mmark_number)); this->mmap->is_marked((*this), mmark_number));
if (this->cont()) if (this->cont())
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); { mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); }
return *this; return *this;
} }
@ -306,7 +310,8 @@ namespace CGAL {
static_assert(std::is_same<typename Base::Basic_iterator, static_assert(std::is_same<typename Base::Basic_iterator,
Tag_true>::value); Tag_true>::value);
CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number));
mark_cell<Map,i,dim>(amap, (*this), mmark_number); if(this->cont())
{ mark_cell<Map,i,dim>(amap, (*this), mmark_number); }
} }
/// Constructor with a dart in parameter (for end iterator). /// Constructor with a dart in parameter (for end iterator).
@ -314,8 +319,8 @@ namespace CGAL {
Base(amap, adart), Base(amap, adart),
mmark_number(amap.get_new_mark()) mmark_number(amap.get_new_mark())
{ {
if (adart!=this->mmap->null_descriptor) if (this->cont())
mark_cell<Map,i,dim>(amap, (*this), mmark_number); { mark_cell<Map,i,dim>(amap, (*this), mmark_number); }
} }
/// Destructor. /// Destructor.
@ -350,7 +355,8 @@ namespace CGAL {
{ {
unmark_treated_darts(); unmark_treated_darts();
Base::rewind(); Base::rewind();
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); if(this->cont())
{ mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); }
} }
/// Postfix ++ operator. /// Postfix ++ operator.
@ -369,7 +375,7 @@ namespace CGAL {
this->mmap->is_marked((*this), mmark_number)); this->mmap->is_marked((*this), mmark_number));
if (this->cont()) if (this->cont())
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); { mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); }
return *this; return *this;
} }

View File

@ -610,16 +610,16 @@ public:
} }
iterator begin() { return empty()?end():iterator(this, 0, 0); } iterator begin() { return empty()?end():iterator(this, 0, 0); }
iterator end() { return iterator(this, upper_bound()); } iterator end() { return iterator(this, null_descriptor); }
const_iterator begin() const { return empty()?end():const_iterator(this, 0, 0); } const_iterator begin() const { return empty()?end():const_iterator(this, 0, 0); }
const_iterator end() const { return const_iterator(this, upper_bound()); } const_iterator end() const { return const_iterator(this, null_descriptor); }
reverse_iterator rbegin() { return reverse_iterator(end()); } reverse_iterator rbegin() { return reverse_iterator(iterator(this, upper_bound())); }
reverse_iterator rend() { return reverse_iterator(begin()); } reverse_iterator rend() { return reverse_iterator(begin()); }
const_reverse_iterator const_reverse_iterator
rbegin() const { return const_reverse_iterator(end()); } rbegin() const { return const_reverse_iterator(iterator(this, upper_bound())); }
const_reverse_iterator const_reverse_iterator
rend() const { return const_reverse_iterator(begin()); } rend() const { return const_reverse_iterator(begin()); }
@ -878,7 +878,8 @@ namespace internal {
CC_iterator_with_index(const iterator &it): m_ptr_to_cc(it.m_ptr_to_cc), CC_iterator_with_index(const iterator &it): m_ptr_to_cc(it.m_ptr_to_cc),
m_index(it.m_index) m_index(it.m_index)
{ {
CGAL_assertion(m_index<=m_ptr_to_cc->upper_bound()); CGAL_assertion(m_index<=m_ptr_to_cc->upper_bound() ||
m_index==DSC::null_descriptor);
} }
// Same for assignment operator // Same for assignment operator
@ -928,7 +929,8 @@ namespace internal {
// It's either pointing to end(), or valid. // It's either pointing to end(), or valid.
CGAL_assertion_msg(m_ptr_to_cc!=nullptr, CGAL_assertion_msg(m_ptr_to_cc!=nullptr,
"Incrementing a singular iterator or an empty container iterator ?"); "Incrementing a singular iterator or an empty container iterator ?");
CGAL_assertion_msg(m_index<m_ptr_to_cc->upper_bound(), CGAL_assertion_msg(m_index<m_ptr_to_cc->upper_bound() &&
m_index!=DSC::null_descriptor,
"Incrementing end() ?"); "Incrementing end() ?");
// If it's not end(), then it's valid, we can do ++. // If it's not end(), then it's valid, we can do ++.
@ -936,6 +938,7 @@ namespace internal {
{ ++m_index; } { ++m_index; }
while(m_index<m_ptr_to_cc->upper_bound() && while(m_index<m_ptr_to_cc->upper_bound() &&
(!m_ptr_to_cc->is_used(m_index))); (!m_ptr_to_cc->is_used(m_index)));
if(m_index==m_ptr_to_cc->upper_bound()) { m_index=DSC::null_descriptor; }
} }
void decrement() void decrement()
@ -969,7 +972,7 @@ namespace internal {
pointer operator->() const { return &((*m_ptr_to_cc)[m_index]); } pointer operator->() const { return &((*m_ptr_to_cc)[m_index]); }
bool is_end() const { return m_index>=m_ptr_to_cc->upper_bound(); } bool is_end() const { return m_index==DSC::null_descriptor; }
// Can itself be used for bit-squatting. // Can itself be used for bit-squatting.
size_type for_compact_container() const size_type for_compact_container() const

View File

@ -73,7 +73,8 @@ namespace CGAL {
static_assert(std::is_same<typename Base::Basic_iterator, static_assert(std::is_same<typename Base::Basic_iterator,
Tag_true>::value); Tag_true>::value);
CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number));
mark_cell<Map,i,dim>(amap, (*this), mmark_number); if(this->cont())
{ mark_cell<Map,i,dim>(amap, (*this), mmark_number); }
} }
/// Constructor with a dart in parameter (for end iterator). /// Constructor with a dart in parameter (for end iterator).
@ -81,8 +82,8 @@ namespace CGAL {
Base(amap, adart), Base(amap, adart),
mmark_number(amap.get_new_mark()) mmark_number(amap.get_new_mark())
{ {
if (adart!=this->mmap->null_descriptor) if (this->cont())
mark_cell<Map,i,dim>(amap, (*this), mmark_number); { mark_cell<Map,i,dim>(amap, (*this), mmark_number); }
} }
/// Destructor. /// Destructor.
@ -136,7 +137,7 @@ namespace CGAL {
this->mmap->is_marked((*this), mmark_number)); this->mmap->is_marked((*this), mmark_number));
if (this->cont()) if (this->cont())
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); { mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); }
return *this; return *this;
} }
@ -249,7 +250,7 @@ namespace CGAL {
this->mmap->is_marked((*this), mmark_number)); this->mmap->is_marked((*this), mmark_number));
if (this->cont()) if (this->cont())
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); { mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number); }
return *this; return *this;
} }