// 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_DEBUG_TRACE_EVENT_ARGUMENT_H_
#define BASE_DEBUG_TRACE_EVENT_ARGUMENT_H_

#include <string>
#include <vector>

#include "base/debug/trace_event.h"
#include "base/memory/scoped_ptr.h"

namespace base {
class DictionaryValue;
class ListValue;
class Value;

namespace debug {

class BASE_EXPORT TracedValue : public ConvertableToTraceFormat {
 public:
  TracedValue();

  void EndDictionary();
  void EndArray();

  void SetInteger(const char* name, int value);
  void SetDouble(const char* name, double);
  void SetBoolean(const char* name, bool value);
  void SetString(const char* name, const std::string& value);
  void SetValue(const char* name, Value* value);
  void BeginDictionary(const char* name);
  void BeginArray(const char* name);

  void AppendInteger(int);
  void AppendDouble(double);
  void AppendBoolean(bool);
  void AppendString(const std::string&);
  void BeginArray();
  void BeginDictionary();

  virtual void AppendAsTraceFormat(std::string* out) const override;

 private:
  virtual ~TracedValue();

  DictionaryValue* GetCurrentDictionary();
  ListValue* GetCurrentArray();

  scoped_ptr<base::Value> root_;
  std::vector<Value*> stack_;
  DISALLOW_COPY_AND_ASSIGN(TracedValue);
};

}  // namespace debug
}  // namespace base

#endif  // BASE_DEBUG_TRACE_EVENT_ARGUMENT_H_
