Commit bea68894 authored by Karel Král's avatar Karel Král Committed by Commit Bot

Extend list of supported methods in ValueToString

Also support |const char* ValueType::data const| in
|base::trace_event::ValueToString|. Thus support turning more types into
std::string (for instance |IPC::MessageView|). This will provide more
detailed information in captured traces.

Bug: 1103623
Change-Id: I897325212fe2202f782e6b8c445a404aba71582a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2356304Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Commit-Queue: Karel Král <karelkral@google.com>
Cr-Commit-Position: refs/heads/master@{#798158}
parent 9af88d9d
...@@ -37,7 +37,7 @@ class ValueToStringPriority : public ValueToStringPriority<N + 1> {}; ...@@ -37,7 +37,7 @@ class ValueToStringPriority : public ValueToStringPriority<N + 1> {};
template <> template <>
// The number must be the same as in the fallback version of // The number must be the same as in the fallback version of
// |ValueToStringHelper|. // |ValueToStringHelper|.
class ValueToStringPriority<4> {}; class ValueToStringPriority<5> {};
// Use SFINAE to decide how to extract a string from the given parameter. // Use SFINAE to decide how to extract a string from the given parameter.
...@@ -87,10 +87,20 @@ ValueToStringHelper(ValueToStringPriority<3>, ...@@ -87,10 +87,20 @@ ValueToStringHelper(ValueToStringPriority<3>,
return OstreamValueToString(value); return OstreamValueToString(value);
} }
// If there is |ValueType::data| whose return value can be used to construct
// |std::string|, use it.
template <typename ValueType>
decltype(std::string(std::declval<const ValueType>().data()))
ValueToStringHelper(ValueToStringPriority<4>,
const ValueType& value,
std::string /* unused */) {
return value.data();
}
// Fallback returns the |fallback_value|. Needs to have |ValueToStringPriority| // Fallback returns the |fallback_value|. Needs to have |ValueToStringPriority|
// with the highest number (to be called last). // with the highest number (to be called last).
template <typename ValueType> template <typename ValueType>
std::string ValueToStringHelper(ValueToStringPriority<4>, std::string ValueToStringHelper(ValueToStringPriority<5>,
const ValueType& /* unused */, const ValueType& /* unused */,
std::string fallback_value) { std::string fallback_value) {
return fallback_value; return fallback_value;
......
...@@ -109,5 +109,35 @@ TEST(TraceEventConversionHelperTest, HasBoth) { ...@@ -109,5 +109,35 @@ TEST(TraceEventConversionHelperTest, HasBoth) {
EXPECT_EQ("HasBoth::ToString", answer); EXPECT_EQ("HasBoth::ToString", answer);
} }
class HasData {
public:
const char* data() const { return "HasData"; }
};
TEST(TraceEventConversionHelperTest, HasData) {
std::string answer = ValueToString(HasData());
EXPECT_EQ("HasData", answer);
}
class HasNonConstData {
public:
const char* data() { return "HasNonConstData"; }
};
TEST(TraceEventConversionHelperTest, HasNonConstData) {
std::string answer = ValueToString(HasNonConstData(), "fallback");
EXPECT_EQ("fallback", answer);
}
class HasDataOfWrongType {
public:
void data() {}
};
TEST(TraceEventConversionHelperTest, HasDataOfWrongType) {
std::string answer = ValueToString(HasDataOfWrongType(), "fallback");
EXPECT_EQ("fallback", answer);
}
} // namespace trace_event } // namespace trace_event
} // namespace base } // namespace base
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