diff --git a/Combinatorial_map/include/CGAL/Cell_iterators.h b/Combinatorial_map/include/CGAL/Cell_iterators.h index 93104ba01e2..9f73b23f232 100644 --- a/Combinatorial_map/include/CGAL/Cell_iterators.h +++ b/Combinatorial_map/include/CGAL/Cell_iterators.h @@ -86,7 +86,8 @@ namespace CGAL { Tag_true>::value); CGAL_assertion(amap.is_whole_map_unmarked(mcell_mark_number)); - mark_cell(amap, adart, mcell_mark_number); + if(this->cont()) + { mark_cell(amap, adart, mcell_mark_number); } } /// Destructor. @@ -126,7 +127,8 @@ namespace CGAL { { unmark_treated_darts(); Ite::rewind(); - mark_cell(*this->mmap, (*this), mcell_mark_number); + if(this->cont()) + { mark_cell(*this->mmap, (*this), mcell_mark_number); } } /// Prefix ++ operator. @@ -199,7 +201,8 @@ namespace CGAL { static_assert(std::is_same::value); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); - mark_cell(amap, adart, mmark_number); + if(this->cont()) + { mark_cell(amap, adart, mmark_number); } } /// Destructor. @@ -234,7 +237,8 @@ namespace CGAL { { unmark_treated_darts(); Ite::rewind(); - mark_cell(*this->mmap, (*this), mmark_number); + if(this->cont()) + { mark_cell(*this->mmap, (*this), mmark_number); } } /// Postfix ++ operator. @@ -253,7 +257,7 @@ namespace CGAL { this->mmap->is_marked((*this), mmark_number)); if (this->cont()) - mark_cell(*this->mmap, (*this), mmark_number); + { mark_cell(*this->mmap, (*this), mmark_number); } return *this; } @@ -306,7 +310,8 @@ namespace CGAL { static_assert(std::is_same::value); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); - mark_cell(amap, (*this), mmark_number); + if(this->cont()) + { mark_cell(amap, (*this), mmark_number); } } /// Constructor with a dart in parameter (for end iterator). @@ -314,8 +319,8 @@ namespace CGAL { Base(amap, adart), mmark_number(amap.get_new_mark()) { - if (adart!=this->mmap->null_descriptor) - mark_cell(amap, (*this), mmark_number); + if (this->cont()) + { mark_cell(amap, (*this), mmark_number); } } /// Destructor. @@ -350,7 +355,8 @@ namespace CGAL { { unmark_treated_darts(); Base::rewind(); - mark_cell(*this->mmap, (*this), mmark_number); + if(this->cont()) + { mark_cell(*this->mmap, (*this), mmark_number); } } /// Postfix ++ operator. @@ -369,7 +375,7 @@ namespace CGAL { this->mmap->is_marked((*this), mmark_number)); if (this->cont()) - mark_cell(*this->mmap, (*this), mmark_number); + { mark_cell(*this->mmap, (*this), mmark_number); } return *this; } diff --git a/Combinatorial_map/include/CGAL/Compact_container_with_index.h b/Combinatorial_map/include/CGAL/Compact_container_with_index.h index b14fe21083a..7395743edb0 100644 --- a/Combinatorial_map/include/CGAL/Compact_container_with_index.h +++ b/Combinatorial_map/include/CGAL/Compact_container_with_index.h @@ -610,16 +610,16 @@ public: } 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 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()); } const_reverse_iterator - rbegin() const { return const_reverse_iterator(end()); } + rbegin() const { return const_reverse_iterator(iterator(this, upper_bound())); } const_reverse_iterator 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), 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 @@ -928,14 +929,16 @@ namespace internal { // It's either pointing to end(), or valid. CGAL_assertion_msg(m_ptr_to_cc!=nullptr, "Incrementing a singular iterator or an empty container iterator ?"); - CGAL_assertion_msg(m_indexupper_bound(), - "Incrementing end() ?"); + CGAL_assertion_msg(m_indexupper_bound() && + m_index!=DSC::null_descriptor, + "Incrementing end() ?"); // If it's not end(), then it's valid, we can do ++. do { ++m_index; } while(m_indexupper_bound() && (!m_ptr_to_cc->is_used(m_index))); + if(m_index==m_ptr_to_cc->upper_bound()) { m_index=DSC::null_descriptor; } } void decrement() @@ -969,7 +972,7 @@ namespace internal { 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. size_type for_compact_container() const diff --git a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt index 271451857f9..028f26c9d93 100644 --- a/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt +++ b/Combinatorial_map/test/Combinatorial_map/CMakeLists.txt @@ -12,6 +12,8 @@ set(hfiles Combinatorial_map_2_test.h Combinatorial_map_3_test.h # create a target per cppfile create_single_source_cgal_program(Combinatorial_map_test.cpp ${hfiles}) create_single_source_cgal_program(Combinatorial_map_copy_test.cpp ${hfiles}) +create_single_source_cgal_program(cmap_test_split_attribute.cpp) +create_single_source_cgal_program(Combinatorial_map_empty_it_test.cpp) # Same targets, defining USE_COMPACT_CONTAINER_WITH_INDEX to test index version add_executable(Combinatorial_map_test_index Combinatorial_map_test.cpp ${hfiles}) @@ -24,7 +26,10 @@ target_compile_definitions(Combinatorial_map_copy_test_index PRIVATE USE_COMPACT target_link_libraries(Combinatorial_map_copy_test_index PRIVATE CGAL::CGAL CGAL::Data) cgal_add_compilation_test(Combinatorial_map_copy_test_index) -create_single_source_cgal_program(cmap_test_split_attribute.cpp) +add_executable(Combinatorial_map_empty_it_test_index Combinatorial_map_empty_it_test.cpp) +target_compile_definitions(Combinatorial_map_empty_it_test_index PRIVATE USE_COMPACT_CONTAINER_WITH_INDEX) +target_link_libraries(Combinatorial_map_empty_it_test_index PRIVATE CGAL::CGAL CGAL::Data) +cgal_add_compilation_test(Combinatorial_map_empty_it_test_index) # Link with OpenMesh if possible find_package(OpenMesh QUIET) diff --git a/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_empty_it_test.cpp b/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_empty_it_test.cpp new file mode 100644 index 00000000000..a7364439192 --- /dev/null +++ b/Combinatorial_map/test/Combinatorial_map/Combinatorial_map_empty_it_test.cpp @@ -0,0 +1,53 @@ +#include + +struct Map_3_dart_items_3: public CGAL::Generic_map_min_items +{ +#ifdef USE_COMPACT_CONTAINER_WITH_INDEX + typedef CGAL::Tag_true Use_index; +#endif +}; + +using Map3=CGAL::Combinatorial_map<3, Map_3_dart_items_3>; +Map3 m; + +template +bool test_empty_it(const Range& r, const std::string& txt) +{ + bool res=true; + if(r.size()!=0) + { + std::cout<<"[ERROR "<(m.darts(), "Dart_range"); + res=res && test_empty_it + (const_cast(m).darts(), "Dart_const_range"); + + res=res && test_empty_it> + (m.one_dart_per_cell<3>(), "One_dart_per_cell_range<0>"); + + res=res && test_empty_it> + (const_cast(m).one_dart_per_cell<3>(), + "One_dart_per_cell_const_range<0>"); + + if(!res) + { return(EXIT_FAILURE); } + + std::cout<<"ALL SUCCESS."<::value); CGAL_assertion(amap.is_whole_map_unmarked(mmark_number)); - mark_cell(amap, (*this), mmark_number); + if(this->cont()) + { mark_cell(amap, (*this), mmark_number); } } /// Constructor with a dart in parameter (for end iterator). @@ -81,8 +82,8 @@ namespace CGAL { Base(amap, adart), mmark_number(amap.get_new_mark()) { - if (adart!=this->mmap->null_descriptor) - mark_cell(amap, (*this), mmark_number); + if (this->cont()) + { mark_cell(amap, (*this), mmark_number); } } /// Destructor. @@ -136,7 +137,7 @@ namespace CGAL { this->mmap->is_marked((*this), mmark_number)); if (this->cont()) - mark_cell(*this->mmap, (*this), mmark_number); + { mark_cell(*this->mmap, (*this), mmark_number); } return *this; } @@ -249,7 +250,7 @@ namespace CGAL { this->mmap->is_marked((*this), mmark_number)); if (this->cont()) - mark_cell(*this->mmap, (*this), mmark_number); + { mark_cell(*this->mmap, (*this), mmark_number); } return *this; }