Skip to content

Commit 04f02fa

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

File tree

1 file changed

+10
-104
lines changed

1 file changed

+10
-104
lines changed

libcxx/include/deque

Lines changed: 10 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,12 @@ public:
792792
_LIBCPP_HIDE_FROM_ABI void emplace_back(_Args&&... __args);
793793
# endif
794794
template <class... _Args>
795-
_LIBCPP_HIDE_FROM_ABI iterator emplace(const_iterator __p, _Args&&... __args);
795+
_LIBCPP_HIDE_FROM_ABI iterator __emplace(const_iterator __p, _Args&&... __args);
796+
797+
template <class... _Args>
798+
_LIBCPP_HIDE_FROM_ABI iterator emplace(const_iterator __p, _Args&&... __args) {
799+
return __emplace(__p, std::forward<_Args>(__args)...);
800+
}
796801

797802
_LIBCPP_HIDE_FROM_ABI void push_front(value_type&& __v);
798803
_LIBCPP_HIDE_FROM_ABI void push_back(value_type&& __v);
@@ -809,13 +814,13 @@ public:
809814
}
810815
# endif
811816

812-
_LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, value_type&& __v);
817+
_LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, value_type&& __v) { return __emplace(__p, std::move(__v)); }
813818

814819
_LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, initializer_list<value_type> __il) {
815820
return insert(__p, __il.begin(), __il.end());
816821
}
817822
# endif // _LIBCPP_CXX03_LANG
818-
_LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, const value_type& __v);
823+
_LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, const value_type& __v) { return __emplace(__p, __v); }
819824
_LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, size_type __n, const value_type& __v);
820825
template <class _InputIter, __enable_if_t<__has_exactly_input_iterator_category<_InputIter>::value, int> = 0>
821826
_LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __p, _InputIter __f, _InputIter __l);
@@ -1661,56 +1666,11 @@ deque<_Tp, _Allocator>::emplace_front(_Args&&... __args) {
16611666
return *begin();
16621667
# endif
16631668
}
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-
}
1669+
# endif // _LIBCPP_CXX03_LANG
17101670

17111671
template <class _Tp, class _Allocator>
17121672
template <class... _Args>
1713-
typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args) {
1673+
typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::__emplace(const_iterator __p, _Args&&... __args) {
17141674
size_type __pos = __p - begin();
17151675
size_type __to_end = size() - __pos;
17161676
allocator_type& __a = __alloc();
@@ -1757,60 +1717,6 @@ typename deque<_Tp, _Allocator>::iterator deque<_Tp, _Allocator>::emplace(const_
17571717
return begin() + __pos;
17581718
}
17591719

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-
18141720
template <class _Tp, class _Allocator>
18151721
typename deque<_Tp, _Allocator>::iterator
18161722
deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v) {

0 commit comments

Comments
 (0)