@@ -779,6 +779,10 @@ public:
779779 // 23.2.2.3 modifiers:
780780 _LIBCPP_HIDE_FROM_ABI void push_front (const value_type& __v);
781781 _LIBCPP_HIDE_FROM_ABI void push_back (const value_type& __v);
782+
783+ template <class ... _Args>
784+ _LIBCPP_HIDE_FROM_ABI iterator __emplace (const_iterator __p, _Args&&... __args);
785+
782786# ifndef _LIBCPP_CXX03_LANG
783787# if _LIBCPP_STD_VER >= 17
784788 template <class ... _Args>
@@ -791,8 +795,11 @@ public:
791795 template <class ... _Args>
792796 _LIBCPP_HIDE_FROM_ABI void emplace_back (_Args&&... __args);
793797# endif
798+
794799 template <class ... _Args>
795- _LIBCPP_HIDE_FROM_ABI iterator emplace (const_iterator __p, _Args&&... __args);
800+ _LIBCPP_HIDE_FROM_ABI iterator emplace (const_iterator __p, _Args&&... __args) {
801+ return __emplace (__p, std::forward<_Args>(__args)...);
802+ }
796803
797804 _LIBCPP_HIDE_FROM_ABI void push_front (value_type&& __v);
798805 _LIBCPP_HIDE_FROM_ABI void push_back (value_type&& __v);
@@ -809,13 +816,13 @@ public:
809816 }
810817# endif
811818
812- _LIBCPP_HIDE_FROM_ABI iterator insert (const_iterator __p, value_type&& __v);
819+ _LIBCPP_HIDE_FROM_ABI iterator insert (const_iterator __p, value_type&& __v) { return __emplace (__p, std::move (__v)); }
813820
814821 _LIBCPP_HIDE_FROM_ABI iterator insert (const_iterator __p, initializer_list<value_type> __il) {
815822 return insert (__p, __il.begin (), __il.end ());
816823 }
817824# endif // _LIBCPP_CXX03_LANG
818- _LIBCPP_HIDE_FROM_ABI iterator insert (const_iterator __p, const value_type& __v);
825+ _LIBCPP_HIDE_FROM_ABI iterator insert (const_iterator __p, const value_type& __v) { return __emplace (__p, __v); }
819826 _LIBCPP_HIDE_FROM_ABI iterator insert (const_iterator __p, size_type __n, const value_type& __v);
820827 template <class _InputIter , __enable_if_t <__has_exactly_input_iterator_category<_InputIter>::value, int > = 0 >
821828 _LIBCPP_HIDE_FROM_ABI iterator insert (const_iterator __p, _InputIter __f, _InputIter __l);
@@ -1661,56 +1668,11 @@ deque<_Tp, _Allocator>::emplace_front(_Args&&... __args) {
16611668 return *begin ();
16621669# endif
16631670}
1664-
1665- template <class _Tp , class _Allocator >
1666- typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v) {
1667- size_type __pos = __p - begin ();
1668- size_type __to_end = size () - __pos;
1669- allocator_type& __a = __alloc ();
1670- if (__pos < __to_end) { // insert by shifting things backward
1671- if (__front_spare () == 0 )
1672- __add_front_capacity ();
1673- // __front_spare() >= 1
1674- __annotate_increase_front (1 );
1675- if (__pos == 0 ) {
1676- __alloc_traits::construct (__a, std::addressof (*--begin ()), std::move (__v));
1677- --__start_;
1678- ++__size ();
1679- } else {
1680- iterator __b = begin ();
1681- iterator __bm1 = std::prev (__b);
1682- __alloc_traits::construct (__a, std::addressof (*__bm1), std::move (*__b));
1683- --__start_;
1684- ++__size ();
1685- if (__pos > 1 )
1686- __b = std::move (std::next (__b), __b + __pos, __b);
1687- *__b = std::move (__v);
1688- }
1689- } else { // insert by shifting things forward
1690- if (__back_spare () == 0 )
1691- __add_back_capacity ();
1692- // __back_capacity >= 1
1693- __annotate_increase_back (1 );
1694- size_type __de = size () - __pos;
1695- if (__de == 0 ) {
1696- __alloc_traits::construct (__a, std::addressof (*end ()), std::move (__v));
1697- ++__size ();
1698- } else {
1699- iterator __e = end ();
1700- iterator __em1 = std::prev (__e);
1701- __alloc_traits::construct (__a, std::addressof (*__e), std::move (*__em1));
1702- ++__size ();
1703- if (__de > 1 )
1704- __e = std::move_backward (__e - __de, __em1, __e);
1705- *--__e = std::move (__v);
1706- }
1707- }
1708- return begin () + __pos;
1709- }
1671+ # endif // _LIBCPP_CXX03_LANG
17101672
17111673template <class _Tp , class _Allocator >
17121674template <class ... _Args>
1713- typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::emplace (const_iterator __p, _Args&&... __args) {
1675+ typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::__emplace (const_iterator __p, _Args&&... __args) {
17141676 size_type __pos = __p - begin ();
17151677 size_type __to_end = size () - __pos;
17161678 allocator_type& __a = __alloc ();
@@ -1757,60 +1719,6 @@ typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::emplace(const_
17571719 return begin () + __pos;
17581720}
17591721
1760- # endif // _LIBCPP_CXX03_LANG
1761-
1762- template <class _Tp , class _Allocator >
1763- typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v) {
1764- size_type __pos = __p - begin ();
1765- size_type __to_end = size () - __pos;
1766- allocator_type& __a = __alloc ();
1767- if (__pos < __to_end) { // insert by shifting things backward
1768- if (__front_spare () == 0 )
1769- __add_front_capacity ();
1770- // __front_spare() >= 1
1771- __annotate_increase_front (1 );
1772- if (__pos == 0 ) {
1773- __alloc_traits::construct (__a, std::addressof (*--begin ()), __v);
1774- --__start_;
1775- ++__size ();
1776- } else {
1777- const_pointer __vt = pointer_traits<const_pointer>::pointer_to (__v);
1778- iterator __b = begin ();
1779- iterator __bm1 = std::prev (__b);
1780- if (__vt == pointer_traits<const_pointer>::pointer_to (*__b))
1781- __vt = pointer_traits<const_pointer>::pointer_to (*__bm1);
1782- __alloc_traits::construct (__a, std::addressof (*__bm1), std::move (*__b));
1783- --__start_;
1784- ++__size ();
1785- if (__pos > 1 )
1786- __b = __move_and_check (std::next (__b), __b + __pos, __b, __vt);
1787- *__b = *__vt;
1788- }
1789- } else { // insert by shifting things forward
1790- if (__back_spare () == 0 )
1791- __add_back_capacity ();
1792- // __back_capacity >= 1
1793- __annotate_increase_back (1 );
1794- size_type __de = size () - __pos;
1795- if (__de == 0 ) {
1796- __alloc_traits::construct (__a, std::addressof (*end ()), __v);
1797- ++__size ();
1798- } else {
1799- const_pointer __vt = pointer_traits<const_pointer>::pointer_to (__v);
1800- iterator __e = end ();
1801- iterator __em1 = std::prev (__e);
1802- if (__vt == pointer_traits<const_pointer>::pointer_to (*__em1))
1803- __vt = pointer_traits<const_pointer>::pointer_to (*__e);
1804- __alloc_traits::construct (__a, std::addressof (*__e), std::move (*__em1));
1805- ++__size ();
1806- if (__de > 1 )
1807- __e = __move_backward_and_check (__e - __de, __em1, __e, __vt);
1808- *--__e = *__vt;
1809- }
1810- }
1811- return begin () + __pos;
1812- }
1813-
18141722template <class _Tp , class _Allocator >
18151723typename deque<_Tp, _Allocator>::iterator
18161724deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v) {
0 commit comments