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