1//===-- Results.h -----------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef __PerfTestDriver_Results_h__ 11#define __PerfTestDriver_Results_h__ 12 13#include "lldb/lldb-forward.h" 14#include <map> 15#include <string> 16#include <vector> 17 18namespace lldb_perf { 19 20class Results 21{ 22public: 23 class Array; 24 class Dictionary; 25 class Double; 26 class String; 27 class Unsigned; 28 29 class Result 30 { 31 public: 32 enum class Type 33 { 34 Invalid, 35 Array, 36 Dictionary, 37 Double, 38 String, 39 Unsigned 40 }; 41 42 Result (Type type, const char *name, const char *description) : 43 m_name (), 44 m_description(), 45 m_type (type) 46 { 47 if (name && name[0]) 48 m_name = name; 49 if (description && description[0]) 50 m_description = description; 51 } 52 53 virtual 54 ~Result() 55 { 56 } 57 58 virtual void 59 Write (Results &results) = 0; 60 61 Array * 62 GetAsArray () 63 { 64 if (m_type == Type::Array) 65 return (Array *)this; 66 return NULL; 67 } 68 Dictionary * 69 GetAsDictionary () 70 { 71 if (m_type == Type::Dictionary) 72 return (Dictionary *)this; 73 return NULL; 74 } 75 Double * 76 GetAsDouble () 77 { 78 if (m_type == Type::Double) 79 return (Double *)this; 80 return NULL; 81 } 82 83 String * 84 GetAsString () 85 { 86 if (m_type == Type::String) 87 return (String *)this; 88 return NULL; 89 } 90 Unsigned * 91 GetAsUnsigned () 92 { 93 if (m_type == Type::Unsigned) 94 return (Unsigned *)this; 95 return NULL; 96 } 97 98 const char * 99 GetName() const 100 { 101 if (m_name.empty()) 102 return NULL; 103 return m_name.c_str(); 104 } 105 106 const char * 107 GetDescription() const 108 { 109 if (m_description.empty()) 110 return NULL; 111 return m_description.c_str(); 112 } 113 114 Type 115 GetType() const 116 { 117 return m_type; 118 } 119 120 protected: 121 std::string m_name; 122 std::string m_description; 123 Type m_type; 124 }; 125 126 typedef std::shared_ptr<Result> ResultSP; 127 128 class Array : public Result 129 { 130 public: 131 Array (const char *name, const char *description) : 132 Result (Type::Array, name, description) 133 { 134 } 135 136 virtual 137 ~Array() 138 { 139 } 140 141 ResultSP 142 Append (const ResultSP &result_sp); 143 144 void 145 ForEach (const std::function <bool (const ResultSP &)> &callback); 146 147 virtual void 148 Write (Results &results) 149 { 150 } 151 protected: 152 typedef std::vector<ResultSP> collection; 153 collection m_array; 154 }; 155 156 class Dictionary : public Result 157 { 158 public: 159 Dictionary () : 160 Result (Type::Dictionary, NULL, NULL) 161 { 162 } 163 164 Dictionary (const char *name, const char *description) : 165 Result (Type::Dictionary, name, description) 166 { 167 } 168 169 virtual 170 ~Dictionary() 171 { 172 } 173 174 virtual void 175 Write (Results &results) 176 { 177 } 178 179 void 180 ForEach (const std::function <bool (const std::string &, const ResultSP &)> &callback); 181 182 ResultSP 183 Add (const char *name, const char *description, const ResultSP &result_sp); 184 185 ResultSP 186 AddDouble (const char *name, const char *descriptiorn, double value); 187 188 ResultSP 189 AddUnsigned (const char *name, const char *description, uint64_t value); 190 191 ResultSP 192 AddString (const char *name, const char *description, const char *value); 193 194 protected: 195 196 typedef std::map<std::string, ResultSP> collection; 197 collection m_dictionary; 198 }; 199 200 class String : public Result 201 { 202 public: 203 String (const char *name, const char *description, const char *value) : 204 Result (Type::String, name, description), 205 m_string () 206 { 207 if (value && value[0]) 208 m_string = value; 209 } 210 211 virtual 212 ~String() 213 { 214 } 215 216 virtual void 217 Write (Results &results) 218 { 219 } 220 221 const char * 222 GetValue () const 223 { 224 return m_string.empty() ? NULL : m_string.c_str(); 225 } 226 227 protected: 228 std::string m_string; 229 }; 230 231 class Double : public Result 232 { 233 public: 234 Double (const char *name, const char *description, double value) : 235 Result (Type::Double, name, description), 236 m_double (value) 237 { 238 } 239 240 virtual 241 ~Double() 242 { 243 } 244 245 virtual void 246 Write (Results &results) 247 { 248 } 249 250 double 251 GetValue () const 252 { 253 return m_double; 254 } 255 256 protected: 257 double m_double; 258 }; 259 260 class Unsigned : public Result 261 { 262 public: 263 Unsigned (const char *name, const char *description, uint64_t value) : 264 Result (Type::Unsigned, name, description), 265 m_unsigned (value) 266 { 267 } 268 269 virtual 270 ~Unsigned() 271 { 272 } 273 274 virtual void 275 Write (Results &results) 276 { 277 } 278 279 uint64_t 280 GetValue () const 281 { 282 return m_unsigned; 283 } 284 285 protected: 286 uint64_t m_unsigned; 287 }; 288 289 Results () : 290 m_results () 291 { 292 } 293 294 ~Results() 295 { 296 } 297 298 Dictionary & 299 GetDictionary () 300 { 301 return m_results; 302 } 303 304 void 305 Write (const char *path); 306 307protected: 308 Dictionary m_results; 309}; 310 311} // namespace lldb_perf 312#endif // #ifndef __PerfTestDriver_Results_h__ 313