Skip to content

[libc++] Remove unnecessary static_casts in std::forward_list #130310

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 41 additions & 59 deletions libcxx/include/forward_list
Original file line number Diff line number Diff line change
Expand Up @@ -294,10 +294,6 @@ struct __forward_node_traits {
"is being broken between LLVM 19 and LLVM 20. If you don't care about your ABI being broken, define "
"the _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB macro to silence this diagnostic.");
# endif

_LIBCPP_HIDE_FROM_ABI static __begin_node_pointer __as_iter_node(__node_pointer __p) {
return static_cast<__begin_node_pointer>(static_cast<__void_pointer>(__p));
}
};

template <class _NodePtr>
Expand All @@ -309,10 +305,6 @@ struct __forward_begin_node {

_LIBCPP_HIDE_FROM_ABI __forward_begin_node() : __next_(nullptr) {}
_LIBCPP_HIDE_FROM_ABI explicit __forward_begin_node(pointer __n) : __next_(__n) {}

_LIBCPP_HIDE_FROM_ABI __begin_node_pointer __next_as_begin() const {
return static_cast<__begin_node_pointer>(__next_);
}
};

template <class _Tp, class _VoidPtr>
Expand Down Expand Up @@ -363,19 +355,12 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_iterator {

__begin_node_pointer __ptr_;

_LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin() const {
return static_cast<__begin_node_pointer>(static_cast<__void_pointer>(__ptr_));
}
_LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer() const {
return static_cast<__node_pointer>(static_cast<__void_pointer>(__ptr_));
}

_LIBCPP_HIDE_FROM_ABI explicit __forward_list_iterator(nullptr_t) _NOEXCEPT : __ptr_(nullptr) {}

_LIBCPP_HIDE_FROM_ABI explicit __forward_list_iterator(__begin_node_pointer __p) _NOEXCEPT : __ptr_(__p) {}

_LIBCPP_HIDE_FROM_ABI explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT
: __ptr_(__traits::__as_iter_node(__p)) {}
: __ptr_(static_cast<__begin_node_pointer>(__p)) {}

template <class, class>
friend class _LIBCPP_TEMPLATE_VIS forward_list;
Expand All @@ -391,13 +376,13 @@ public:

_LIBCPP_HIDE_FROM_ABI __forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {}

_LIBCPP_HIDE_FROM_ABI reference operator*() const { return __get_unsafe_node_pointer()->__get_value(); }
_LIBCPP_HIDE_FROM_ABI reference operator*() const { return static_cast<__node_pointer>(__ptr_)->__get_value(); }
_LIBCPP_HIDE_FROM_ABI pointer operator->() const {
return pointer_traits<pointer>::pointer_to(__get_unsafe_node_pointer()->__get_value());
return pointer_traits<pointer>::pointer_to(static_cast<__node_pointer>(__ptr_)->__get_value());
}

_LIBCPP_HIDE_FROM_ABI __forward_list_iterator& operator++() {
__ptr_ = __traits::__as_iter_node(__ptr_->__next_);
__ptr_ = static_cast<__begin_node_pointer>(__ptr_->__next_);
return *this;
}
_LIBCPP_HIDE_FROM_ABI __forward_list_iterator operator++(int) {
Expand Down Expand Up @@ -427,19 +412,12 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator {

__begin_node_pointer __ptr_;

_LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin() const {
return static_cast<__begin_node_pointer>(static_cast<__void_pointer>(__ptr_));
}
_LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer() const {
return static_cast<__node_pointer>(static_cast<__void_pointer>(__ptr_));
}

_LIBCPP_HIDE_FROM_ABI explicit __forward_list_const_iterator(nullptr_t) _NOEXCEPT : __ptr_(nullptr) {}

_LIBCPP_HIDE_FROM_ABI explicit __forward_list_const_iterator(__begin_node_pointer __p) _NOEXCEPT : __ptr_(__p) {}

_LIBCPP_HIDE_FROM_ABI explicit __forward_list_const_iterator(__node_pointer __p) _NOEXCEPT
: __ptr_(__traits::__as_iter_node(__p)) {}
: __ptr_(static_cast<__begin_node_pointer>(__p)) {}

template <class, class>
friend class forward_list;
Expand All @@ -455,13 +433,13 @@ public:
_LIBCPP_HIDE_FROM_ABI __forward_list_const_iterator(__forward_list_iterator<__node_pointer> __p) _NOEXCEPT
: __ptr_(__p.__ptr_) {}

_LIBCPP_HIDE_FROM_ABI reference operator*() const { return __get_unsafe_node_pointer()->__get_value(); }
_LIBCPP_HIDE_FROM_ABI reference operator*() const { return static_cast<__node_pointer>(__ptr_)->__get_value(); }
_LIBCPP_HIDE_FROM_ABI pointer operator->() const {
return pointer_traits<pointer>::pointer_to(__get_unsafe_node_pointer()->__get_value());
return pointer_traits<pointer>::pointer_to(static_cast<__node_pointer>(__ptr_)->__get_value());
}

_LIBCPP_HIDE_FROM_ABI __forward_list_const_iterator& operator++() {
__ptr_ = __traits::__as_iter_node(__ptr_->__next_);
__ptr_ = static_cast<__begin_node_pointer>(__ptr_->__next_);
return *this;
}
_LIBCPP_HIDE_FROM_ABI __forward_list_const_iterator operator++(int) {
Expand Down Expand Up @@ -911,7 +889,8 @@ inline forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a) : __ba
template <class _Tp, class _Alloc>
forward_list<_Tp, _Alloc>::forward_list(size_type __n) {
if (__n > 0) {
for (__begin_node_pointer __p = __base::__before_begin(); __n > 0; --__n, __p = __p->__next_as_begin()) {
for (__begin_node_pointer __p = __base::__before_begin(); __n > 0;
--__n, __p = static_cast<__begin_node_pointer>(__p->__next_)) {
__p->__next_ = this->__create_node(/* next = */ nullptr);
}
}
Expand All @@ -921,7 +900,8 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n) {
template <class _Tp, class _Alloc>
forward_list<_Tp, _Alloc>::forward_list(size_type __n, const allocator_type& __base_alloc) : __base(__base_alloc) {
if (__n > 0) {
for (__begin_node_pointer __p = __base::__before_begin(); __n > 0; --__n, __p = __p->__next_as_begin()) {
for (__begin_node_pointer __p = __base::__before_begin(); __n > 0;
--__n, __p = static_cast<__begin_node_pointer>(__p->__next_)) {
__p->__next_ = this->__create_node(/* next = */ nullptr);
}
}
Expand Down Expand Up @@ -1105,15 +1085,15 @@ template <class _Tp, class _Alloc>
template <class... _Args>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args) {
__begin_node_pointer const __r = __p.__get_begin();
__begin_node_pointer const __r = __p.__ptr_;
__r->__next_ = this->__create_node(/* next = */ __r->__next_, std::forward<_Args>(__args)...);
return iterator(__r->__next_);
}

template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v) {
__begin_node_pointer const __r = __p.__get_begin();
__begin_node_pointer const __r = __p.__ptr_;
__r->__next_ = this->__create_node(/* next = */ __r->__next_, std::move(__v));
return iterator(__r->__next_);
}
Expand All @@ -1123,15 +1103,15 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v) {
template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v) {
__begin_node_pointer const __r = __p.__get_begin();
__begin_node_pointer const __r = __p.__ptr_;
__r->__next_ = this->__create_node(/* next = */ __r->__next_, __v);
return iterator(__r->__next_);
}

template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, const value_type& __v) {
__begin_node_pointer __r = __p.__get_begin();
__begin_node_pointer __r = __p.__ptr_;
if (__n > 0) {
__node_pointer __first = this->__create_node(/* next = */ nullptr, __v);
__node_pointer __last = __first;
Expand Down Expand Up @@ -1169,7 +1149,7 @@ template <class _Tp, class _Alloc>
template <class _InputIterator, class _Sentinel>
_LIBCPP_HIDE_FROM_ABI typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::__insert_after_with_sentinel(const_iterator __p, _InputIterator __f, _Sentinel __l) {
__begin_node_pointer __r = __p.__get_begin();
__begin_node_pointer __r = __p.__ptr_;

if (__f != __l) {
__node_pointer __first = this->__create_node(/* next = */ nullptr, *__f);
Expand Down Expand Up @@ -1202,7 +1182,7 @@ forward_list<_Tp, _Alloc>::__insert_after_with_sentinel(const_iterator __p, _Inp

template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator forward_list<_Tp, _Alloc>::erase_after(const_iterator __f) {
__begin_node_pointer __p = __f.__get_begin();
__begin_node_pointer __p = __f.__ptr_;
__node_pointer __n = __p->__next_;
__p->__next_ = __n->__next_;
this->__delete_node(__n);
Expand All @@ -1212,9 +1192,9 @@ typename forward_list<_Tp, _Alloc>::iterator forward_list<_Tp, _Alloc>::erase_af
template <class _Tp, class _Alloc>
typename forward_list<_Tp, _Alloc>::iterator
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l) {
__node_pointer __e = __l.__get_unsafe_node_pointer();
__node_pointer __e = static_cast<__node_pointer>(__l.__ptr_);
if (__f != __l) {
__begin_node_pointer __bp = __f.__get_begin();
__begin_node_pointer __bp = __f.__ptr_;

__node_pointer __n = __bp->__next_;
if (__n != __e) {
Expand Down Expand Up @@ -1242,7 +1222,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n) {
else {
__n -= __sz;
if (__n > 0) {
for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n, __ptr = __ptr->__next_as_begin()) {
for (__begin_node_pointer __ptr = __p.__ptr_; __n > 0;
--__n, __ptr = static_cast<__begin_node_pointer>(__ptr->__next_)) {
__ptr->__next_ = this->__create_node(/* next = */ nullptr);
}
}
Expand All @@ -1262,7 +1243,8 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) {
else {
__n -= __sz;
if (__n > 0) {
for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n, __ptr = __ptr->__next_as_begin()) {
for (__begin_node_pointer __ptr = __p.__ptr_; __n > 0;
--__n, __ptr = static_cast<__begin_node_pointer>(__ptr->__next_)) {
__ptr->__next_ = this->__create_node(/* next = */ nullptr, __v);
}
}
Expand All @@ -1272,13 +1254,13 @@ void forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) {
template <class _Tp, class _Alloc>
void forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, forward_list& __x) {
if (!__x.empty()) {
if (__p.__get_begin()->__next_ != nullptr) {
if (__p.__ptr_->__next_ != nullptr) {
const_iterator __lm1 = __x.before_begin();
while (__lm1.__get_begin()->__next_ != nullptr)
while (__lm1.__ptr_->__next_ != nullptr)
++__lm1;
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
}
__p.__get_begin()->__next_ = __x.__before_begin()->__next_;
__p.__ptr_->__next_ = __x.__before_begin()->__next_;
__x.__before_begin()->__next_ = nullptr;
}
}
Expand All @@ -1287,9 +1269,9 @@ template <class _Tp, class _Alloc>
void forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, forward_list& /*__other*/, const_iterator __i) {
const_iterator __lm1 = std::next(__i);
if (__p != __i && __p != __lm1) {
__i.__get_begin()->__next_ = __lm1.__get_begin()->__next_;
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
__p.__get_begin()->__next_ = __lm1.__get_unsafe_node_pointer();
__i.__ptr_->__next_ = __lm1.__ptr_->__next_;
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
__p.__ptr_->__next_ = static_cast<__node_pointer>(__lm1.__ptr_);
}
}

Expand All @@ -1298,12 +1280,12 @@ void forward_list<_Tp, _Alloc>::splice_after(
const_iterator __p, forward_list& /*__other*/, const_iterator __f, const_iterator __l) {
if (__f != __l && __p != __f) {
const_iterator __lm1 = __f;
while (__lm1.__get_begin()->__next_ != __l.__get_begin())
while (__lm1.__ptr_->__next_ != __l.__ptr_)
++__lm1;
if (__f != __lm1) {
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_;
__p.__get_begin()->__next_ = __f.__get_begin()->__next_;
__f.__get_begin()->__next_ = __l.__get_unsafe_node_pointer();
__lm1.__ptr_->__next_ = __p.__ptr_->__next_;
__p.__ptr_->__next_ = __f.__ptr_->__next_;
__f.__ptr_->__next_ = static_cast<__node_pointer>(__l.__ptr_);
}
}
}
Expand All @@ -1330,8 +1312,8 @@ typename forward_list<_Tp, _Alloc>::__remove_return_type forward_list<_Tp, _Allo
forward_list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
typename forward_list<_Tp, _Alloc>::size_type __count_removed = 0;
const iterator __e = end();
for (iterator __i = before_begin(); __i.__get_begin()->__next_ != nullptr;) {
if (__i.__get_begin()->__next_->__get_value() == __v) {
for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;) {
if (__i.__ptr_->__next_->__get_value() == __v) {
++__count_removed;
iterator __j = std::next(__i, 2);
for (; __j != __e && *__j == __v; ++__j)
Expand All @@ -1353,8 +1335,8 @@ typename forward_list<_Tp, _Alloc>::__remove_return_type forward_list<_Tp, _Allo
forward_list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
typename forward_list<_Tp, _Alloc>::size_type __count_removed = 0;
const iterator __e = end();
for (iterator __i = before_begin(); __i.__get_begin()->__next_ != nullptr;) {
if (__pred(__i.__get_begin()->__next_->__get_value())) {
for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;) {
if (__pred(__i.__ptr_->__next_->__get_value())) {
++__count_removed;
iterator __j = std::next(__i, 2);
for (; __j != __e && __pred(*__j); ++__j)
Expand All @@ -1380,7 +1362,7 @@ forward_list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred) {
iterator __j = std::next(__i);
for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
++__count_removed;
if (__i.__get_begin()->__next_ != __j.__get_unsafe_node_pointer())
if (__i.__ptr_->__next_ != static_cast<__node_pointer>(__j.__ptr_))
__deleted_nodes.splice_after(__deleted_nodes.before_begin(), *this, __i, __j);
__i = __j;
}
Expand Down Expand Up @@ -1460,7 +1442,7 @@ forward_list<_Tp, _Alloc>::__sort(__node_pointer __f1, difference_type __sz, _Co
}
difference_type __sz1 = __sz / 2;
difference_type __sz2 = __sz - __sz1;
__node_pointer __t = std::next(iterator(__f1), __sz1 - 1).__get_unsafe_node_pointer();
__node_pointer __t = static_cast<__node_pointer>(std::next(iterator(__f1), __sz1 - 1).__ptr_);
__node_pointer __f2 = __t->__next_;
__t->__next_ = nullptr;
return __merge(__sort(__f1, __sz1, __comp), __sort(__f2, __sz2, __comp), __comp);
Expand Down