123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- // Copyright 2014 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef BASE_TRACE_EVENT_TRACED_VALUE_H_
- #define BASE_TRACE_EVENT_TRACED_VALUE_H_
- #include <stddef.h>
- #include <memory>
- #include <string>
- #include <vector>
- #include "base/macros.h"
- #include "base/pickle.h"
- #include "base/strings/string_piece.h"
- #include "base/trace_event/trace_event_impl.h"
- namespace base {
- class Value;
- namespace trace_event {
- class BASE_EXPORT TracedValue : public ConvertableToTraceFormat {
- public:
- // TODO(oysteine): |capacity| is not used in any production code. Consider
- // removing it.
- explicit TracedValue(size_t capacity = 0);
- ~TracedValue() override;
- void EndDictionary();
- void EndArray();
- // These methods assume that |name| is a long lived "quoted" string.
- void SetInteger(const char* name, int value);
- void SetDouble(const char* name, double value);
- void SetBoolean(const char* name, bool value);
- void SetString(const char* name, base::StringPiece value);
- void SetValue(const char* name, TracedValue* value);
- void BeginDictionary(const char* name);
- void BeginArray(const char* name);
- // These, instead, can be safely passed a temporary string.
- void SetIntegerWithCopiedName(base::StringPiece name, int value);
- void SetDoubleWithCopiedName(base::StringPiece name, double value);
- void SetBooleanWithCopiedName(base::StringPiece name, bool value);
- void SetStringWithCopiedName(base::StringPiece name, base::StringPiece value);
- void SetValueWithCopiedName(base::StringPiece name, TracedValue* value);
- void BeginDictionaryWithCopiedName(base::StringPiece name);
- void BeginArrayWithCopiedName(base::StringPiece name);
- void AppendInteger(int);
- void AppendDouble(double);
- void AppendBoolean(bool);
- void AppendString(base::StringPiece);
- void BeginArray();
- void BeginDictionary();
- // ConvertableToTraceFormat implementation.
- void AppendAsTraceFormat(std::string* out) const override;
- bool AppendToProto(ProtoAppender* appender) override;
- void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead) override;
- // A custom serialization class can be supplied by implementing the
- // Writer interface and supplying a factory class to SetWriterFactoryCallback.
- // Primarily used by Perfetto to write TracedValues directly into its proto
- // format, which lets us do a direct memcpy() in AppendToProto() rather than
- // a JSON serialization step in AppendAsTraceFormat.
- class BASE_EXPORT Writer {
- public:
- virtual ~Writer() = default;
- virtual void BeginArray() = 0;
- virtual void BeginDictionary() = 0;
- virtual void EndDictionary() = 0;
- virtual void EndArray() = 0;
- // These methods assume that |name| is a long lived "quoted" string.
- virtual void SetInteger(const char* name, int value) = 0;
- virtual void SetDouble(const char* name, double value) = 0;
- virtual void SetBoolean(const char* name, bool value) = 0;
- virtual void SetString(const char* name, base::StringPiece value) = 0;
- virtual void SetValue(const char* name, Writer* value) = 0;
- virtual void BeginDictionary(const char* name) = 0;
- virtual void BeginArray(const char* name) = 0;
- // These, instead, can be safely passed a temporary string.
- virtual void SetIntegerWithCopiedName(base::StringPiece name,
- int value) = 0;
- virtual void SetDoubleWithCopiedName(base::StringPiece name,
- double value) = 0;
- virtual void SetBooleanWithCopiedName(base::StringPiece name,
- bool value) = 0;
- virtual void SetStringWithCopiedName(base::StringPiece name,
- base::StringPiece value) = 0;
- virtual void SetValueWithCopiedName(base::StringPiece name,
- Writer* value) = 0;
- virtual void BeginDictionaryWithCopiedName(base::StringPiece name) = 0;
- virtual void BeginArrayWithCopiedName(base::StringPiece name) = 0;
- virtual void AppendInteger(int) = 0;
- virtual void AppendDouble(double) = 0;
- virtual void AppendBoolean(bool) = 0;
- virtual void AppendString(base::StringPiece) = 0;
- virtual void AppendAsTraceFormat(std::string* out) const = 0;
- virtual bool AppendToProto(ProtoAppender* appender);
- virtual void EstimateTraceMemoryOverhead(
- TraceEventMemoryOverhead* overhead) = 0;
- virtual bool IsPickleWriter() const = 0;
- virtual bool IsProtoWriter() const = 0;
- };
- typedef std::unique_ptr<Writer> (*WriterFactoryCallback)(size_t capacity);
- static void SetWriterFactoryCallback(WriterFactoryCallback callback);
- protected:
- TracedValue(size_t capacity, bool forced_json);
- std::unique_ptr<base::Value> ToBaseValue() const;
- private:
- std::unique_ptr<Writer> writer_;
- #ifndef NDEBUG
- // In debug builds checks the pairings of {Start,End}{Dictionary,Array}
- std::vector<bool> nesting_stack_;
- #endif
- DISALLOW_COPY_AND_ASSIGN(TracedValue);
- };
- // TracedValue that is convertable to JSON format. This has lower performance
- // than the default TracedValue in production code, and should be used only for
- // testing and debugging. Should be avoided in tracing. It's for
- // testing/debugging code calling value dumping function designed for tracing,
- // like the following:
- //
- // TracedValueJSON value;
- // AsValueInto(&value); // which is designed for tracing.
- // return value.ToJSON();
- //
- // If the code is merely for testing/debugging, base::Value should be used
- // instead.
- class BASE_EXPORT TracedValueJSON : public TracedValue {
- public:
- explicit TracedValueJSON(size_t capacity = 0)
- : TracedValue(capacity, /*forced_josn*/ true) {}
- using TracedValue::ToBaseValue;
- // Converts the value into a JSON string without formatting. Suitable for
- // printing a simple value or printing a value in a single line context.
- std::string ToJSON() const;
- // Converts the value into a formatted JSON string, with indentation, spaces
- // and new lines for better human readability of complex values.
- std::string ToFormattedJSON() const;
- };
- } // namespace trace_event
- } // namespace base
- #endif // BASE_TRACE_EVENT_TRACED_VALUE_H_
|