Skip to content
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

Various cleanups: Impl and wrapper functions for vector algorithms #4146

Merged
Merged
Show file tree
Hide file tree
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
6 changes: 4 additions & 2 deletions stl/inc/algorithm
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ const void* __stdcall __std_find_last_trivial_4(const void* _First, const void*
const void* __stdcall __std_find_last_trivial_8(const void* _First, const void* _Last, uint64_t _Val) noexcept;
_END_EXTERN_C

_STD_BEGIN
template <class _Ty>
_STD pair<_Ty*, _Ty*> __std_minmax_element(_Ty* _First, _Ty* _Last) noexcept {
constexpr bool _Signed = _STD is_signed_v<_Ty>;
Expand Down Expand Up @@ -102,6 +103,7 @@ _Ty* __std_find_last_trivial(_Ty* _First, _Ty* _Last, const _TVal _Val) noexcept
static_assert(_STD _Always_false<_Ty>, "Unexpected size");
}
}
_STD_END
#endif // _USE_STD_VECTOR_ALGORITHMS

_STD_BEGIN
Expand Down Expand Up @@ -9848,7 +9850,7 @@ namespace ranges {
if (!_STD is_constant_evaluated()) {
const auto _First_ptr = _STD to_address(_First);
const auto _Last_ptr = _First_ptr + (_Last - _First);
const auto _Result = _CSTD __std_minmax_element(_First_ptr, _Last_ptr);
const auto _Result = _STD __std_minmax_element(_First_ptr, _Last_ptr);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we remove _std_ from these function names - possibly in a followup - to avoid the awkward _STD __std?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The idea is that they behave just like the __std_meow_N functions without the N size; renaming them would break that symmetry. That said I wouldn't grumble too much, as long as the names are unique.

(If I had my way there wouldn't be any _STD at all and we wouldn't care about the incomplete type scenario 😹)

if constexpr (is_pointer_v<_It>) {
return {_Result.first, _Result.second};
} else {
Expand Down Expand Up @@ -10046,7 +10048,7 @@ namespace ranges {
if (!_STD is_constant_evaluated()) {
const auto _First_ptr = _STD to_address(_First);
const auto _Last_ptr = _First_ptr + (_Last - _First);
const auto _Result = _CSTD __std_minmax_element(_First_ptr, _Last_ptr);
const auto _Result = _STD __std_minmax_element(_First_ptr, _Last_ptr);
return {static_cast<_Vty>(*_Result.first), static_cast<_Vty>(*_Result.second)};
}
}
Expand Down
2 changes: 2 additions & 0 deletions stl/inc/xutility
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ const void* __stdcall __std_max_element_4(const void* _First, const void* _Last,
const void* __stdcall __std_max_element_8(const void* _First, const void* _Last, bool _Signed) noexcept;
_END_EXTERN_C

_STD_BEGIN
template <class _Ty, class _TVal>
__declspec(noalias) size_t __std_count_trivial(_Ty* _First, _Ty* _Last, const _TVal _Val) noexcept {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto _STD __std_.

if constexpr (_STD is_pointer_v<_TVal> || _STD is_null_pointer_v<_TVal>) {
Expand Down Expand Up @@ -186,6 +187,7 @@ _Ty* __std_max_element(_Ty* _First, _Ty* _Last) noexcept {
static_assert(_STD _Always_false<_Ty>, "Unexpected size");
}
}
_STD_END

#endif // _USE_STD_VECTOR_ALGORITHMS

Expand Down
40 changes: 20 additions & 20 deletions stl/src/vector_algorithms.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1240,7 +1240,7 @@ namespace {
// In optimized builds it avoids an extra call, as this function is too large to inline.

template <class _Traits, class _Ty>
const void* __stdcall __std_find_trivial_unsized(const void* _First, const _Ty _Val) noexcept {
const void* __stdcall __std_find_trivial_unsized_impl(const void* _First, const _Ty _Val) noexcept {
#ifndef _M_ARM64EC
if (_Use_avx2()) {
_Zeroupper_on_exit _Guard; // TRANSITION, DevCom-10331414
Expand Down Expand Up @@ -1326,7 +1326,7 @@ namespace {
}

template <class _Traits, class _Ty>
const void* __stdcall __std_find_trivial(const void* _First, const void* _Last, _Ty _Val) noexcept {
const void* __stdcall __std_find_trivial_impl(const void* _First, const void* _Last, _Ty _Val) noexcept {
#ifndef _M_ARM64EC
size_t _Size_bytes = _Byte_length(_First, _Last);

Expand Down Expand Up @@ -1380,7 +1380,7 @@ namespace {
}

template <class _Traits, class _Ty>
const void* __stdcall __std_find_last_trivial(const void* _First, const void* _Last, _Ty _Val) noexcept {
const void* __stdcall __std_find_last_trivial_impl(const void* _First, const void* _Last, _Ty _Val) noexcept {
const void* const _Real_last = _Last;
#ifndef _M_ARM64EC
size_t _Size_bytes = _Byte_length(_First, _Last);
Expand Down Expand Up @@ -1439,7 +1439,7 @@ namespace {

template <class _Traits, class _Ty>
__declspec(noalias) size_t
__stdcall __std_count_trivial(const void* _First, const void* const _Last, const _Ty _Val) noexcept {
__stdcall __std_count_trivial_impl(const void* _First, const void* const _Last, const _Ty _Val) noexcept {
size_t _Result = 0;

#ifndef _M_ARM64EC
Expand Down Expand Up @@ -1488,79 +1488,79 @@ namespace {
extern "C" {

const void* __stdcall __std_find_trivial_unsized_1(const void* const _First, const uint8_t _Val) noexcept {
return __std_find_trivial_unsized<_Find_traits_1>(_First, _Val);
return __std_find_trivial_unsized_impl<_Find_traits_1>(_First, _Val);
}

const void* __stdcall __std_find_trivial_unsized_2(const void* const _First, const uint16_t _Val) noexcept {
return __std_find_trivial_unsized<_Find_traits_2>(_First, _Val);
return __std_find_trivial_unsized_impl<_Find_traits_2>(_First, _Val);
}

const void* __stdcall __std_find_trivial_unsized_4(const void* const _First, const uint32_t _Val) noexcept {
return __std_find_trivial_unsized<_Find_traits_4>(_First, _Val);
return __std_find_trivial_unsized_impl<_Find_traits_4>(_First, _Val);
}

const void* __stdcall __std_find_trivial_unsized_8(const void* const _First, const uint64_t _Val) noexcept {
return __std_find_trivial_unsized<_Find_traits_8>(_First, _Val);
return __std_find_trivial_unsized_impl<_Find_traits_8>(_First, _Val);
}

const void* __stdcall __std_find_trivial_1(
const void* const _First, const void* const _Last, const uint8_t _Val) noexcept {
return __std_find_trivial<_Find_traits_1>(_First, _Last, _Val);
return __std_find_trivial_impl<_Find_traits_1>(_First, _Last, _Val);
}

const void* __stdcall __std_find_trivial_2(
const void* const _First, const void* const _Last, const uint16_t _Val) noexcept {
return __std_find_trivial<_Find_traits_2>(_First, _Last, _Val);
return __std_find_trivial_impl<_Find_traits_2>(_First, _Last, _Val);
}

const void* __stdcall __std_find_trivial_4(
const void* const _First, const void* const _Last, const uint32_t _Val) noexcept {
return __std_find_trivial<_Find_traits_4>(_First, _Last, _Val);
return __std_find_trivial_impl<_Find_traits_4>(_First, _Last, _Val);
}

const void* __stdcall __std_find_trivial_8(
const void* const _First, const void* const _Last, const uint64_t _Val) noexcept {
return __std_find_trivial<_Find_traits_8>(_First, _Last, _Val);
return __std_find_trivial_impl<_Find_traits_8>(_First, _Last, _Val);
}

const void* __stdcall __std_find_last_trivial_1(
const void* const _First, const void* const _Last, const uint8_t _Val) noexcept {
return __std_find_last_trivial<_Find_traits_1>(_First, _Last, _Val);
return __std_find_last_trivial_impl<_Find_traits_1>(_First, _Last, _Val);
}

const void* __stdcall __std_find_last_trivial_2(
const void* const _First, const void* const _Last, const uint16_t _Val) noexcept {
return __std_find_last_trivial<_Find_traits_2>(_First, _Last, _Val);
return __std_find_last_trivial_impl<_Find_traits_2>(_First, _Last, _Val);
}

const void* __stdcall __std_find_last_trivial_4(
const void* const _First, const void* const _Last, const uint32_t _Val) noexcept {
return __std_find_last_trivial<_Find_traits_4>(_First, _Last, _Val);
return __std_find_last_trivial_impl<_Find_traits_4>(_First, _Last, _Val);
}

const void* __stdcall __std_find_last_trivial_8(
const void* const _First, const void* const _Last, const uint64_t _Val) noexcept {
return __std_find_last_trivial<_Find_traits_8>(_First, _Last, _Val);
return __std_find_last_trivial_impl<_Find_traits_8>(_First, _Last, _Val);
}

__declspec(noalias) size_t
__stdcall __std_count_trivial_1(const void* const _First, const void* const _Last, const uint8_t _Val) noexcept {
return __std_count_trivial<_Find_traits_1>(_First, _Last, _Val);
return __std_count_trivial_impl<_Find_traits_1>(_First, _Last, _Val);
}

__declspec(noalias) size_t
__stdcall __std_count_trivial_2(const void* const _First, const void* const _Last, const uint16_t _Val) noexcept {
return __std_count_trivial<_Find_traits_2>(_First, _Last, _Val);
return __std_count_trivial_impl<_Find_traits_2>(_First, _Last, _Val);
}

__declspec(noalias) size_t
__stdcall __std_count_trivial_4(const void* const _First, const void* const _Last, const uint32_t _Val) noexcept {
return __std_count_trivial<_Find_traits_4>(_First, _Last, _Val);
return __std_count_trivial_impl<_Find_traits_4>(_First, _Last, _Val);
}

__declspec(noalias) size_t
__stdcall __std_count_trivial_8(const void* const _First, const void* const _Last, const uint64_t _Val) noexcept {
return __std_count_trivial<_Find_traits_8>(_First, _Last, _Val);
return __std_count_trivial_impl<_Find_traits_8>(_First, _Last, _Val);
}

} // extern "C"
Expand Down