mirror of
https://github.com/boostorg/container.git
synced 2025-08-02 14:04:26 +02:00
Fixes #240 ("_GLIBCXX_DEBUG detects issues in flat_set/map")
This commit is contained in:
@@ -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]
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user