Skip to content

Commit f96ed10

Browse files
committed
[libc++] Merge insert/emplace(const_iterator, Args...) implementations
1 parent 4cdeb7d commit f96ed10

File tree

1 file changed

+12
-104
lines changed

1 file changed

+12
-104
lines changed

libcxx/include/deque

Lines changed: 12 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -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

17111673
template <class _Tp, class _Allocator>
17121674
template <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-
18141722
template <class _Tp, class _Allocator>
18151723
typename deque<_Tp, _Allocator>::iterator
18161724
deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v) {

0 commit comments

Comments
 (0)