//===-- Results.h -----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef __PerfTestDriver_Results_h__ #define __PerfTestDriver_Results_h__ #include "lldb/lldb-forward.h" #include #include #include namespace lldb_perf { class Results { public: class Array; class Dictionary; class Double; class String; class Unsigned; class Result { public: enum class Type { Invalid, Array, Dictionary, Double, String, Unsigned }; Result(Type type, const char *name, const char *description) : m_name(), m_description(), m_type(type) { if (name && name[0]) m_name = name; if (description && description[0]) m_description = description; } virtual ~Result() {} virtual void Write(Results &results) = 0; Array *GetAsArray() { if (m_type == Type::Array) return (Array *)this; return NULL; } Dictionary *GetAsDictionary() { if (m_type == Type::Dictionary) return (Dictionary *)this; return NULL; } Double *GetAsDouble() { if (m_type == Type::Double) return (Double *)this; return NULL; } String *GetAsString() { if (m_type == Type::String) return (String *)this; return NULL; } Unsigned *GetAsUnsigned() { if (m_type == Type::Unsigned) return (Unsigned *)this; return NULL; } const char *GetName() const { if (m_name.empty()) return NULL; return m_name.c_str(); } const char *GetDescription() const { if (m_description.empty()) return NULL; return m_description.c_str(); } Type GetType() const { return m_type; } protected: std::string m_name; std::string m_description; Type m_type; }; typedef std::shared_ptr ResultSP; class Array : public Result { public: Array(const char *name, const char *description) : Result(Type::Array, name, description) {} virtual ~Array() {} ResultSP Append(const ResultSP &result_sp); void ForEach(const std::function &callback); virtual void Write(Results &results) {} protected: typedef std::vector collection; collection m_array; }; class Dictionary : public Result { public: Dictionary() : Result(Type::Dictionary, NULL, NULL) {} Dictionary(const char *name, const char *description) : Result(Type::Dictionary, name, description) {} virtual ~Dictionary() {} virtual void Write(Results &results) {} void ForEach(const std::function &callback); ResultSP Add(const char *name, const char *description, const ResultSP &result_sp); ResultSP AddDouble(const char *name, const char *descriptiorn, double value); ResultSP AddUnsigned(const char *name, const char *description, uint64_t value); ResultSP AddString(const char *name, const char *description, const char *value); protected: typedef std::map collection; collection m_dictionary; }; class String : public Result { public: String(const char *name, const char *description, const char *value) : Result(Type::String, name, description), m_string() { if (value && value[0]) m_string = value; } virtual ~String() {} virtual void Write(Results &results) {} const char *GetValue() const { return m_string.empty() ? NULL : m_string.c_str(); } protected: std::string m_string; }; class Double : public Result { public: Double(const char *name, const char *description, double value) : Result(Type::Double, name, description), m_double(value) {} virtual ~Double() {} virtual void Write(Results &results) {} double GetValue() const { return m_double; } protected: double m_double; }; class Unsigned : public Result { public: Unsigned(const char *name, const char *description, uint64_t value) : Result(Type::Unsigned, name, description), m_unsigned(value) {} virtual ~Unsigned() {} virtual void Write(Results &results) {} uint64_t GetValue() const { return m_unsigned; } protected: uint64_t m_unsigned; }; Results() : m_results() {} ~Results() {} Dictionary &GetDictionary() { return m_results; } void Write(const char *path); protected: Dictionary m_results; }; } // namespace lldb_perf #endif // #ifndef __PerfTestDriver_Results_h__