optimize channel args to string

pull/35286/head
Craig Tiller 1 year ago
parent 9118cb1a55
commit 5275aed2f8
  1. 38
      src/core/lib/channel/channel_args.cc
  2. 10
      src/core/lib/channel/channel_args.h

@ -280,25 +280,35 @@ absl::optional<bool> ChannelArgs::GetBool(absl::string_view name) const {
}
}
std::string ChannelArgs::Value::ToString() const {
if (rep_.c_vtable() == &int_vtable_) {
return std::to_string(reinterpret_cast<intptr_t>(rep_.c_pointer()));
}
absl::string_view ChannelArgs::Value::ToString(
std::list<std::string>& backing_strings) const {
if (rep_.c_vtable() == &string_vtable_) {
return std::string(
static_cast<RefCountedString*>(rep_.c_pointer())->as_string_view());
return static_cast<RefCountedString*>(rep_.c_pointer())->as_string_view();
}
if (rep_.c_vtable() == &int_vtable_) {
backing_strings.emplace_back(
std::to_string(reinterpret_cast<intptr_t>(rep_.c_pointer())));
return backing_strings.back();
}
return absl::StrFormat("%p", rep_.c_pointer());
backing_strings.emplace_back(absl::StrFormat("%p", rep_.c_pointer()));
return backing_strings.back();
}
std::string ChannelArgs::ToString() const {
std::vector<std::string> arg_strings;
args_.ForEach(
[&arg_strings](const RefCountedStringValue& key, const Value& value) {
arg_strings.push_back(
absl::StrCat(key.as_string_view(), "=", value.ToString()));
});
return absl::StrCat("{", absl::StrJoin(arg_strings, ", "), "}");
std::vector<absl::string_view> strings;
std::list<std::string> backing_strings;
strings.push_back("{");
bool first = true;
args_.ForEach([&strings, &first, &backing_strings](
const RefCountedStringValue& key, const Value& value) {
if (!first) strings.push_back(", ");
first = false;
strings.push_back(key.as_string_view());
strings.push_back("=");
strings.push_back(value.ToString(backing_strings));
});
strings.push_back("}");
return absl::StrJoin(strings, "");
}
ChannelArgs ChannelArgs::UnionWith(ChannelArgs other) const {

@ -345,7 +345,7 @@ class ChannelArgs {
return &rep_;
}
std::string ToString() const;
absl::string_view ToString(std::list<std::string>& backing) const;
grpc_arg MakeCArg(const char* name) const;
@ -391,8 +391,8 @@ class ChannelArgs {
// Only used in union_with_test.cc, reference version of UnionWith for
// differential fuzzing.
GRPC_MUST_USE_RESULT ChannelArgs
FuzzingReferenceUnionWith(ChannelArgs other) const;
GRPC_MUST_USE_RESULT ChannelArgs FuzzingReferenceUnionWith(
ChannelArgs other) const;
const Value* Get(absl::string_view name) const;
GRPC_MUST_USE_RESULT ChannelArgs Set(absl::string_view name,
@ -466,8 +466,8 @@ class ChannelArgs {
GRPC_MUST_USE_RESULT ChannelArgs Remove(absl::string_view name) const;
bool Contains(absl::string_view name) const;
GRPC_MUST_USE_RESULT ChannelArgs
RemoveAllKeysWithPrefix(absl::string_view prefix) const;
GRPC_MUST_USE_RESULT ChannelArgs RemoveAllKeysWithPrefix(
absl::string_view prefix) const;
template <typename T>
bool ContainsObject() const {

Loading…
Cancel
Save