insert(const_iterator __position, _Arg&& __x)
{ return emplace_hint(__position, std::forward<_Arg>(__x)); }
- template<__has_input_iter_cat _InputIterator>
+ private:
+ template<typename _Iter, typename _Sent>
void
- insert(_InputIterator __first, _InputIterator __last)
+ _M_insert(_Iter __first, _Sent __last)
{
// FIXME: This implementation fails its complexity requirements.
// We can't idiomatically implement an efficient version (as in the
#endif
}
+ public:
+ template<__has_input_iter_cat _InputIterator>
+ void
+ insert(_InputIterator __first, _InputIterator __last)
+ { _M_insert(std::move(__first), std::move(__last)); }
+
template<__has_input_iter_cat _InputIterator>
void
insert(__sorted_t, _InputIterator __first, _InputIterator __last)
template<__detail::__container_compatible_range<value_type> _Rg>
void
insert_range(_Rg&& __rg)
- { insert(ranges::begin(__rg), ranges::end(__rg)); }
+ { _M_insert(ranges::begin(__rg), ranges::end(__rg)); }
void
insert(initializer_list<value_type> __il)
using _Impl::emplace;
using _Impl::emplace_hint;
using _Impl::insert;
- // using _Impl::insert_range;
+ using _Impl::insert_range;
using _Impl::extract;
using _Impl::replace;
using _Impl::erase;
using _Impl::emplace;
using _Impl::emplace_hint;
using _Impl::insert;
- // using _Impl::insert_range;
+ using _Impl::insert_range;
using _Impl::extract;
using _Impl::replace;
using _Impl::erase;
template<__detail::__container_compatible_range<value_type> _Rg>
void
insert_range(_Rg&& __rg)
- { insert(ranges::begin(__rg), ranges::end(__rg)); }
+ {
+ auto __guard = _M_make_clear_guard();
+ typename container_type::iterator __it;
+ if constexpr (requires { _M_cont.insert_range(_M_cont.end(), __rg); })
+ __it = _M_cont.insert_range(_M_cont.end(), __rg);
+ else if constexpr (ranges::common_range<_Rg>)
+ __it = _M_cont.insert(_M_cont.end(), ranges::begin(__rg), ranges::end(__rg));
+ else
+ {
+ size_type __n = size();
+ auto __first = ranges::begin(__rg);
+ auto __last = ranges::end(__rg);
+ for (; __first != __last; ++__first)
+ _M_cont.emplace_back(*__first);
+ __it = _M_cont.begin() + __n;
+ }
+ std::sort(__it, _M_cont.end(), _M_comp);
+ std::inplace_merge(_M_cont.begin(), __it, _M_cont.end(), _M_comp);
+ if constexpr (!_Multi)
+ _M_unique();
+ __guard._M_disable();
+ }
void
insert(initializer_list<value_type> __il)
using _Impl::emplace;
using _Impl::emplace_hint;
using _Impl::insert;
- // using _Impl::insert_range;
+ using _Impl::insert_range;
using _Impl::extract;
using _Impl::replace;
using _Impl::erase;
using _Impl::emplace;
using _Impl::emplace_hint;
using _Impl::insert;
- // using _Impl::insert_range;
+ using _Impl::insert_range;
using _Impl::extract;
using _Impl::replace;
using _Impl::erase;
VERIFY( std::ranges::equal(m | std::views::values, (int[]){-1, -2, -3, -4, -5}) );
}
+void
+test06()
+{
+ // PR libstdc++/118156 - flat_foo::insert_range cannot handle non-common ranges
+ std::flat_map<int, int> m;
+ auto r = std::views::zip(std::views::iota(1), std::views::iota(2)) | std::views::take(5);
+ static_assert(!std::ranges::common_range<decltype(r)>);
+ m.insert_range(r);
+ VERIFY( std::ranges::equal(m | std::views::keys, (int[]){1, 2, 3, 4, 5}) );
+ VERIFY( std::ranges::equal(m | std::views::values, (int[]){2, 3, 4, 5, 6}) );
+ m.clear();
+ m.insert_range(r | std::views::reverse);
+ VERIFY( std::ranges::equal(m | std::views::keys, (int[]){1, 2, 3, 4, 5}) );
+ VERIFY( std::ranges::equal(m | std::views::values, (int[]){2, 3, 4, 5, 6}) );
+}
+
int
main()
{
test03();
test04();
test05();
+ test06();
}
VERIFY( std::ranges::equal(m | std::views::keys, (int[]){1, 2, 3, 3, 4, 5}) );
VERIFY( std::ranges::equal(m | std::views::values, (int[]){-1, -2, -3, 3, -4, -5}) );
}
+void
+test06()
+{
+ // PR libstdc++/118156 - flat_foo::insert_range cannot handle non-common ranges
+ std::flat_multimap<int, int> m;
+ auto r = std::views::zip(std::views::iota(1), std::views::iota(2)) | std::views::take(5);
+ static_assert(!std::ranges::common_range<decltype(r)>);
+ m.insert_range(r);
+ VERIFY( std::ranges::equal(m | std::views::keys, (int[]){1, 2, 3, 4, 5}) );
+ VERIFY( std::ranges::equal(m | std::views::values, (int[]){2, 3, 4, 5, 6}) );
+ m.clear();
+ m.insert_range(r | std::views::reverse);
+ VERIFY( std::ranges::equal(m | std::views::keys, (int[]){1, 2, 3, 4, 5}) );
+ VERIFY( std::ranges::equal(m | std::views::values, (int[]){2, 3, 4, 5, 6}) );
+}
int
main()
test03();
test04();
test05();
+ test06();
}
#include <flat_set>
#include <deque>
+#include <ranges>
#include <vector>
#include <testsuite_allocator.h>
#include <testsuite_hooks.h>
VERIFY( std::ranges::equal(m, (int[]){1, 2, 3, 3, 4, 5}) );
}
+void
+test06()
+{
+ // PR libstdc++/118156 - flat_foo::insert_range cannot handle non-common ranges
+ std::flat_multiset<int> s;
+ auto r = std::views::iota(1) | std::views::take(5);
+ static_assert(!std::ranges::common_range<decltype(r)>);
+ s.insert_range(r);
+ VERIFY( std::ranges::equal(s, (int[]){1, 2, 3, 4, 5}) );
+ s.clear();
+ s.insert_range(r | std::views::reverse);
+ VERIFY( std::ranges::equal(s, (int[]){1, 2, 3, 4, 5}) );
+}
+
int
main()
{
test03();
test04();
test05();
+ test06();
}
#endif
#include <deque>
+#include <ranges>
#include <vector>
#include <testsuite_allocator.h>
#include <testsuite_hooks.h>
VERIFY( std::ranges::equal(m, (int[]){1, 2, 3, 4, 5}) );
}
+void
+test06()
+{
+ // PR libstdc++/118156 - flat_foo::insert_range cannot handle non-common ranges
+ std::flat_set<int> s;
+ auto r = std::views::iota(1) | std::views::take(5);
+ static_assert(!std::ranges::common_range<decltype(r)>);
+ s.insert_range(r);
+ VERIFY( std::ranges::equal(s, (int[]){1, 2, 3, 4, 5}) );
+ s.clear();
+ s.insert_range(r | std::views::reverse);
+ VERIFY( std::ranges::equal(s, (int[]){1, 2, 3, 4, 5}) );
+}
+
int
main()
{
test03();
test04();
test05();
+ test06();
}