Commit 99f0b6d1 by Matt Kulukundis Committed by Copybara-Service

Switch rank structs to be consistent with written guidance in go/ranked-overloads

PiperOrigin-RevId: 605125821
Change-Id: I2ee260eaf283acafd80abfd2b7419a0e9f597a78
parent 0be9f997
...@@ -64,7 +64,7 @@ struct common_policy_traits { ...@@ -64,7 +64,7 @@ struct common_policy_traits {
// UNINITIALIZED // UNINITIALIZED
template <class Alloc> template <class Alloc>
static void transfer(Alloc* alloc, slot_type* new_slot, slot_type* old_slot) { static void transfer(Alloc* alloc, slot_type* new_slot, slot_type* old_slot) {
transfer_impl(alloc, new_slot, old_slot, Rank0{}); transfer_impl(alloc, new_slot, old_slot, Rank2{});
} }
// PRECONDITION: `slot` is INITIALIZED // PRECONDITION: `slot` is INITIALIZED
...@@ -83,7 +83,7 @@ struct common_policy_traits { ...@@ -83,7 +83,7 @@ struct common_policy_traits {
static constexpr bool transfer_uses_memcpy() { static constexpr bool transfer_uses_memcpy() {
return std::is_same<decltype(transfer_impl<std::allocator<char>>( return std::is_same<decltype(transfer_impl<std::allocator<char>>(
nullptr, nullptr, nullptr, Rank0{})), nullptr, nullptr, nullptr, Rank2{})),
std::true_type>::value; std::true_type>::value;
} }
...@@ -95,18 +95,19 @@ struct common_policy_traits { ...@@ -95,18 +95,19 @@ struct common_policy_traits {
} }
private: private:
// To rank the overloads below for overload resolution. Rank0 is preferred. // Use go/ranked-overloads for dispatching.
struct Rank2 {}; struct Rank0 {};
struct Rank1 : Rank2 {}; struct Rank1 : Rank0 {};
struct Rank0 : Rank1 {}; struct Rank2 : Rank1 {};
// Use auto -> decltype as an enabler. // Use auto -> decltype as an enabler.
// P::transfer returns std::true_type if transfer uses memcpy (e.g. in // P::transfer returns std::true_type if transfer uses memcpy (e.g. in
// node_slot_policy). // node_slot_policy).
template <class Alloc, class P = Policy> template <class Alloc, class P = Policy>
static auto transfer_impl(Alloc* alloc, slot_type* new_slot, static auto transfer_impl(Alloc* alloc, slot_type* new_slot,
slot_type* old_slot, Rank0) slot_type* old_slot,
-> decltype(P::transfer(alloc, new_slot, old_slot)) { Rank2) -> decltype(P::transfer(alloc, new_slot,
old_slot)) {
return P::transfer(alloc, new_slot, old_slot); return P::transfer(alloc, new_slot, old_slot);
} }
#if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606 #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
...@@ -129,7 +130,7 @@ struct common_policy_traits { ...@@ -129,7 +130,7 @@ struct common_policy_traits {
template <class Alloc> template <class Alloc>
static void transfer_impl(Alloc* alloc, slot_type* new_slot, static void transfer_impl(Alloc* alloc, slot_type* new_slot,
slot_type* old_slot, Rank2) { slot_type* old_slot, Rank0) {
construct(alloc, new_slot, std::move(element(old_slot))); construct(alloc, new_slot, std::move(element(old_slot)));
destroy(alloc, old_slot); destroy(alloc, old_slot);
} }
......
...@@ -1120,7 +1120,7 @@ Cord MakeCordFromExternal(absl::string_view data, Releaser&& releaser) { ...@@ -1120,7 +1120,7 @@ Cord MakeCordFromExternal(absl::string_view data, Releaser&& releaser) {
} else { } else {
using ReleaserType = absl::decay_t<Releaser>; using ReleaserType = absl::decay_t<Releaser>;
cord_internal::InvokeReleaser( cord_internal::InvokeReleaser(
cord_internal::Rank0{}, ReleaserType(std::forward<Releaser>(releaser)), cord_internal::Rank1{}, ReleaserType(std::forward<Releaser>(releaser)),
data); data);
} }
return cord; return cord;
......
...@@ -352,18 +352,19 @@ struct CordRepExternal : public CordRep { ...@@ -352,18 +352,19 @@ struct CordRepExternal : public CordRep {
static void Delete(CordRep* rep); static void Delete(CordRep* rep);
}; };
struct Rank1 {}; // Use go/ranked-overloads for dispatching.
struct Rank0 : Rank1 {}; struct Rank0 {};
struct Rank1 : Rank0 {};
template <typename Releaser, typename = ::absl::base_internal::invoke_result_t< template <typename Releaser, typename = ::absl::base_internal::invoke_result_t<
Releaser, absl::string_view>> Releaser, absl::string_view>>
void InvokeReleaser(Rank0, Releaser&& releaser, absl::string_view data) { void InvokeReleaser(Rank1, Releaser&& releaser, absl::string_view data) {
::absl::base_internal::invoke(std::forward<Releaser>(releaser), data); ::absl::base_internal::invoke(std::forward<Releaser>(releaser), data);
} }
template <typename Releaser, template <typename Releaser,
typename = ::absl::base_internal::invoke_result_t<Releaser>> typename = ::absl::base_internal::invoke_result_t<Releaser>>
void InvokeReleaser(Rank1, Releaser&& releaser, absl::string_view) { void InvokeReleaser(Rank0, Releaser&& releaser, absl::string_view) {
::absl::base_internal::invoke(std::forward<Releaser>(releaser)); ::absl::base_internal::invoke(std::forward<Releaser>(releaser));
} }
...@@ -381,7 +382,7 @@ struct CordRepExternalImpl ...@@ -381,7 +382,7 @@ struct CordRepExternalImpl
} }
~CordRepExternalImpl() { ~CordRepExternalImpl() {
InvokeReleaser(Rank0{}, std::move(this->template get<0>()), InvokeReleaser(Rank1{}, std::move(this->template get<0>()),
absl::string_view(base, length)); absl::string_view(base, length));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment