Results.cpp revision 102b2c2681c9a830afe25bfea35557421905e42c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- Results.cpp ---------------------------------------------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Results.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <assert.h> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __APPLE__ 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "CFCMutableArray.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "CFCMutableDictionary.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "CFCReleaser.h" 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "CFCString.h" 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochusing namespace lldb_perf; 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic void 230529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochAddResultToArray (CFCMutableArray &array, Results::Result *result); 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic void 260529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochAddResultToDictionary (CFCMutableDictionary &parent_dict, const char *key, Results::Result *result); 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic void 290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochAddResultToArray (CFCMutableArray &parent_array, Results::Result *result) 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch{ 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch switch (result->GetType()) 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::Invalid: 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::Array: 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Results::Array *value = result->GetAsArray(); 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFCMutableArray array; 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value->ForEach([&array](const Results::ResultSP &value_sp) -> bool 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddResultToArray (array, value_sp.get()); 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }); 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parent_array.AppendValue(array.get(), true); 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case Results::Result::Type::Dictionary: 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Results::Dictionary *value = result->GetAsDictionary(); 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFCMutableDictionary dict; 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value->ForEach([&dict](const std::string &key, const Results::ResultSP &value_sp) -> bool 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AddResultToDictionary (dict, key.c_str(), value_sp.get()); 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return true; 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu }); 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (result->GetDescription()) 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dict.AddValueCString(CFSTR("description"), result->GetDescription()); 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu parent_array.AppendValue(dict.get(), true); 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case Results::Result::Type::Double: 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu double d = result->GetAsDouble()->GetValue(); 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberDoubleType, &d)); 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (cf_number.get()) 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu parent_array.AppendValue(cf_number.get(), true); 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case Results::Result::Type::String: 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CFCString cfstr (result->GetAsString()->GetValue()); 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (cfstr.get()) 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu parent_array.AppendValue(cfstr.get(), true); 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu break; 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu case Results::Result::Type::Unsigned: 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu { 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu uint64_t uval64 = result->GetAsUnsigned()->GetValue(); 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &uval64)); 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (cf_number.get()) 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parent_array.AppendValue(cf_number.get(), true); 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch default: 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch assert (!"unhandled result"); 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic void 990529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochAddResultToDictionary (CFCMutableDictionary &parent_dict, const char *key, Results::Result *result) 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch{ 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch assert (key && key[0]); 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFCString cf_key(key); 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch switch (result->GetType()) 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::Invalid: 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::Array: 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Results::Array *value = result->GetAsArray(); 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFCMutableArray array; 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value->ForEach([&array](const Results::ResultSP &value_sp) -> bool 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddResultToArray (array, value_sp.get()); 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }); 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parent_dict.AddValue(cf_key.get(), array.get(), true); 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::Dictionary: 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Results::Dictionary *value = result->GetAsDictionary(); 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFCMutableDictionary dict; 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value->ForEach([&dict](const std::string &key, const Results::ResultSP &value_sp) -> bool 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddResultToDictionary (dict, key.c_str(), value_sp.get()); 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }); 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (result->GetDescription()) 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dict.AddValueCString(CFSTR("description"), result->GetDescription()); 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parent_dict.AddValue(cf_key.get(), dict.get(), true); 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::Double: 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parent_dict.SetValueDouble(cf_key.get(), result->GetAsDouble()->GetValue(), true); 1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::String: 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parent_dict.SetValueCString(cf_key.get(), result->GetAsString()->GetValue(), true); 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch case Results::Result::Type::Unsigned: 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parent_dict.SetValueUInt64 (cf_key.get(), result->GetAsUnsigned()->GetValue(), true); 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch default: 1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch assert (!"unhandled result"); 1540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid 1580529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochResults::Write (const char *out_path) 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch{ 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifdef __APPLE__ 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFCMutableDictionary dict; 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch m_results.ForEach([&dict](const std::string &key, const ResultSP &value_sp) -> bool 1640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddResultToDictionary (dict, key.c_str(), value_sp.get()); 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }); 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFDataRef xmlData = CFPropertyListCreateData(kCFAllocatorDefault, dict.get(), kCFPropertyListXMLFormat_v1_0, 0, NULL); 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (out_path == NULL) 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch out_path = "/dev/stdout"; 1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFURLRef file = CFURLCreateFromFileSystemRepresentation(NULL, (const UInt8*)out_path, strlen(out_path), FALSE); 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CFURLWriteDataAndPropertiesToResource(file, xmlData, NULL, NULL); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1790529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochResults::ResultSP 1800529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochResults::Dictionary::AddUnsigned (const char *name, const char *description, uint64_t value) 1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch{ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert (name && name[0]); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (description && description[0]) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::unique_ptr<Results::Dictionary> value_dict_ap (new Results::Dictionary ()); 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value_dict_ap->AddString("description", NULL, description); 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value_dict_ap->AddUnsigned("value", NULL, value); 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch m_dictionary[std::string(name)] = ResultSP (value_dict_ap.release()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_dictionary[std::string(name)] = ResultSP (new Unsigned (name, description, value)); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return m_dictionary[std::string(name)]; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Results::ResultSP 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Results::Dictionary::AddDouble (const char *name, const char *description, double value) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert (name && name[0]); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (description && description[0]) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::unique_ptr<Results::Dictionary> value_dict_ap (new Results::Dictionary ()); 2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value_dict_ap->AddString("description", NULL, description); 2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value_dict_ap->AddDouble("value", NULL, value); 2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch m_dictionary[std::string(name)] = ResultSP (value_dict_ap.release()); 2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch else 2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch m_dictionary[std::string(name)] = ResultSP (new Double (name, description, value)); 2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return m_dictionary[std::string(name)]; 2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2110529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochResults::ResultSP 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Results::Dictionary::AddString (const char *name, const char *description, const char *value) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert (name && name[0]); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (description && description[0]) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::unique_ptr<Results::Dictionary> value_dict_ap (new Results::Dictionary ()); 2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value_dict_ap->AddString("description", NULL, description); 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch value_dict_ap->AddString("value", NULL, value); 2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch m_dictionary[std::string(name)] = ResultSP (value_dict_ap.release()); 2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch m_dictionary[std::string(name)] = ResultSP (new String (name, description, value)); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return m_dictionary[std::string(name)]; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2270529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochResults::ResultSP 2280529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochResults::Dictionary::Add (const char *name, const char *description, const ResultSP &result_sp) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch assert (name && name[0]); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (description && description[0]) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::unique_ptr<Results::Dictionary> value_dict_ap (new Results::Dictionary ()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_dict_ap->AddString("description", NULL, description); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value_dict_ap->Add("value", NULL, result_sp); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_dictionary[std::string(name)] = ResultSP (value_dict_ap.release()); 2370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch else 2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch m_dictionary[std::string(name)] = result_sp; 2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return m_dictionary[std::string(name)]; 2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Results::Dictionary::ForEach (const std::function <bool (const std::string &, const ResultSP &)> &callback) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) collection::const_iterator pos, end = m_dictionary.end(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (pos = m_dictionary.begin(); pos != end; ++pos) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (callback (pos->first.c_str(), pos->second) == false) 2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2560529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochResults::ResultSP 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Results::Array::Append (const ResultSP &result_sp) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m_array.push_back (result_sp); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result_sp; 261} 262 263void 264Results::Array::ForEach (const std::function <bool (const ResultSP &)> &callback) 265{ 266 collection::const_iterator pos, end = m_array.end(); 267 for (pos = m_array.begin(); pos != end; ++pos) 268 { 269 if (callback (*pos) == false) 270 return; 271 } 272} 273 274 275 276