Fixes #240 ("_GLIBCXX_DEBUG detects issues in flat_set/map")

This commit is contained in:
Ion Gaztañaga
2023-02-23 22:16:10 +01:00
parent 5cea4e8718
commit db96d2ad47
2 changed files with 35 additions and 28 deletions

View File

@@ -1413,14 +1413,9 @@ use [*Boost.Container]? There are several reasons for that:
* Fixed bugs/issues: * Fixed bugs/issues:
* [@https://github.com/boostorg/container/issues/232 GitHub #232: ['"Fix using pmr::polymorphic_allocator in pre-main"]]. * [@https://github.com/boostorg/container/issues/232 GitHub #232: ['"Fix using pmr::polymorphic_allocator in pre-main"]].
* [@https://github.com/boostorg/container/issues/236 GitHub #236: ['"flat_tree::erase_unique uses wrong iterator"]].
[endsect]
[section:release_notes_boost_1_82_00 Boost 1.82 Release]
* Fixed bugs/issues:
* [@https://github.com/boostorg/container/issues/238 GitHub #238: ['"Containers should not be using memset to value-initialize POD types"]]. * [@https://github.com/boostorg/container/issues/238 GitHub #238: ['"Containers should not be using memset to value-initialize POD types"]].
* [@https://github.com/boostorg/container/issues/236 GitHub #236: ['"flat_tree::erase_unique uses wrong iterator"]].
* [@https://github.com/boostorg/container/issues/240 GitHub #240: ['"_GLIBCXX_DEBUG detects issues in flat_set/map"]].
[endsect] [endsect]

View File

@@ -139,9 +139,11 @@ BOOST_CONTAINER_FORCEINLINE void flat_tree_container_inplace_merge //is_contiguo
(SequenceContainer& dest, typename SequenceContainer::iterator it, Compare comp , dtl::true_) (SequenceContainer& dest, typename SequenceContainer::iterator it, Compare comp , dtl::true_)
{ {
typedef typename SequenceContainer::value_type value_type; typedef typename SequenceContainer::value_type value_type;
value_type *const braw = boost::movelib::iterator_to_raw_pointer(dest.begin()); value_type *const braw = boost::movelib::to_raw_pointer(dest.data());
value_type *const iraw = boost::movelib::iterator_to_raw_pointer(it); value_type *const iraw = boost::movelib::iterator_to_raw_pointer(it);
value_type *const eraw = boost::movelib::iterator_to_raw_pointer(dest.end()); //Don't use iterator_to_raw_pointer for end as debug iterators can assert when
//"operator ->" is used with the end iterator
value_type *const eraw = braw + dest.size();
boost::movelib::adaptive_merge boost::movelib::adaptive_merge
(braw, iraw, eraw, comp, eraw, back_free_capacity<SequenceContainer>::get(dest)); (braw, iraw, eraw, comp, eraw, back_free_capacity<SequenceContainer>::get(dest));
} }
@@ -164,7 +166,11 @@ BOOST_CONTAINER_FORCEINLINE void flat_tree_container_inplace_sort_ending //is_co
{ {
typedef typename SequenceContainer::value_type value_type; typedef typename SequenceContainer::value_type value_type;
value_type *const iraw = boost::movelib::iterator_to_raw_pointer(it); value_type *const iraw = boost::movelib::iterator_to_raw_pointer(it);
value_type *const eraw = boost::movelib::iterator_to_raw_pointer(dest.end()); //Don't use iterator_to_raw_pointer for end as debug iterators can assert when
//"operator ->" is used with the end iterator
value_type* const eraw = boost::movelib::to_raw_pointer(dest.data()) + dest.size();
boost::movelib::adaptive_sort boost::movelib::adaptive_sort
(iraw, eraw, comp, eraw, back_free_capacity<SequenceContainer>::get(dest)); (iraw, eraw, comp, eraw, back_free_capacity<SequenceContainer>::get(dest));
} }
@@ -192,10 +198,12 @@ template<class SequenceContainer, class Iterator, class Compare>
BOOST_CONTAINER_FORCEINLINE void flat_tree_merge_equal //has_merge_unique == false BOOST_CONTAINER_FORCEINLINE void flat_tree_merge_equal //has_merge_unique == false
(SequenceContainer& dest, Iterator first, Iterator last, Compare comp, dtl::false_) (SequenceContainer& dest, Iterator first, Iterator last, Compare comp, dtl::false_)
{ {
typedef typename SequenceContainer::iterator iterator; if(first != last) {
iterator const it = dest.insert( dest.end(), first, last ); typedef typename SequenceContainer::iterator iterator;
dtl::bool_<is_contiguous_container<SequenceContainer>::value> contiguous_tag; iterator const it = dest.insert( dest.end(), first, last );
(flat_tree_container_inplace_merge)(dest, it, comp, contiguous_tag); dtl::bool_<is_contiguous_container<SequenceContainer>::value> contiguous_tag;
(flat_tree_container_inplace_merge)(dest, it, comp, contiguous_tag);
}
} }
/////////////////////////////////////// ///////////////////////////////////////
@@ -214,16 +222,18 @@ template<class SequenceContainer, class Iterator, class Compare>
BOOST_CONTAINER_FORCEINLINE void flat_tree_merge_unique //has_merge_unique == false BOOST_CONTAINER_FORCEINLINE void flat_tree_merge_unique //has_merge_unique == false
(SequenceContainer& dest, Iterator first, Iterator last, Compare comp, dtl::false_) (SequenceContainer& dest, Iterator first, Iterator last, Compare comp, dtl::false_)
{ {
typedef typename SequenceContainer::iterator iterator; if (first != last) {
typedef typename SequenceContainer::size_type size_type; typedef typename SequenceContainer::iterator iterator;
typedef typename SequenceContainer::difference_type difference_type; typedef typename SequenceContainer::size_type size_type;
typedef typename SequenceContainer::difference_type difference_type;
size_type const old_sz = dest.size(); size_type const old_sz = dest.size();
iterator const first_new = dest.insert(dest.cend(), first, last ); iterator const first_new = dest.insert(dest.cend(), first, last );
iterator e = boost::movelib::inplace_set_unique_difference(first_new, dest.end(), dest.begin(), first_new, comp); iterator e = boost::movelib::inplace_set_unique_difference(first_new, dest.end(), dest.begin(), first_new, comp);
dest.erase(e, dest.end()); dest.erase(e, dest.end());
dtl::bool_<is_contiguous_container<SequenceContainer>::value> contiguous_tag; dtl::bool_<is_contiguous_container<SequenceContainer>::value> contiguous_tag;
(flat_tree_container_inplace_merge)(dest, dest.begin() + difference_type(old_sz), comp, contiguous_tag); (flat_tree_container_inplace_merge)(dest, dest.begin() + difference_type(old_sz), comp, contiguous_tag);
}
} }
/////////////////////////////////////// ///////////////////////////////////////
@@ -931,11 +941,13 @@ class flat_tree
template <class InIt> template <class InIt>
void insert_equal(InIt first, InIt last) void insert_equal(InIt first, InIt last)
{ {
dtl::bool_<is_contiguous_container<container_type>::value> contiguous_tag; if (first != last) {
container_type &seq = this->m_data.m_seq; dtl::bool_<is_contiguous_container<container_type>::value> contiguous_tag;
typename container_type::iterator const it = seq.insert(seq.cend(), first, last); container_type &seq = this->m_data.m_seq;
(flat_tree_container_inplace_sort_ending)(seq, it, this->priv_value_comp(), contiguous_tag); typename container_type::iterator const it = seq.insert(seq.cend(), first, last);
(flat_tree_container_inplace_merge) (seq, it, this->priv_value_comp(), contiguous_tag); (flat_tree_container_inplace_sort_ending)(seq, it, this->priv_value_comp(), contiguous_tag);
(flat_tree_container_inplace_merge) (seq, it, this->priv_value_comp(), contiguous_tag);
}
} }
//Ordered //Ordered