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:
* [@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/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]

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_)
{
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 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
(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;
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
(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
(SequenceContainer& dest, Iterator first, Iterator last, Compare comp, dtl::false_)
{
if(first != last) {
typedef typename SequenceContainer::iterator iterator;
iterator const it = dest.insert( dest.end(), first, last );
dtl::bool_<is_contiguous_container<SequenceContainer>::value> contiguous_tag;
(flat_tree_container_inplace_merge)(dest, it, comp, contiguous_tag);
}
}
///////////////////////////////////////
@@ -214,6 +222,7 @@ template<class SequenceContainer, class Iterator, class Compare>
BOOST_CONTAINER_FORCEINLINE void flat_tree_merge_unique //has_merge_unique == false
(SequenceContainer& dest, Iterator first, Iterator last, Compare comp, dtl::false_)
{
if (first != last) {
typedef typename SequenceContainer::iterator iterator;
typedef typename SequenceContainer::size_type size_type;
typedef typename SequenceContainer::difference_type difference_type;
@@ -224,6 +233,7 @@ BOOST_CONTAINER_FORCEINLINE void flat_tree_merge_unique //has_merge_unique == f
dest.erase(e, dest.end());
dtl::bool_<is_contiguous_container<SequenceContainer>::value> contiguous_tag;
(flat_tree_container_inplace_merge)(dest, dest.begin() + difference_type(old_sz), comp, contiguous_tag);
}
}
///////////////////////////////////////
@@ -931,12 +941,14 @@ class flat_tree
template <class InIt>
void insert_equal(InIt first, InIt last)
{
if (first != last) {
dtl::bool_<is_contiguous_container<container_type>::value> contiguous_tag;
container_type &seq = this->m_data.m_seq;
typename container_type::iterator const it = seq.insert(seq.cend(), first, last);
(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