130fdc8d8SChris Lattner //===-- CFCMutableDictionary.cpp --------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "CFCMutableDictionary.h"
1130fdc8d8SChris Lattner #include "CFCString.h"
1230fdc8d8SChris Lattner //----------------------------------------------------------------------
1330fdc8d8SChris Lattner // CFCString constructor
1430fdc8d8SChris Lattner //----------------------------------------------------------------------
1530fdc8d8SChris Lattner CFCMutableDictionary::CFCMutableDictionary(CFMutableDictionaryRef s) :
1630fdc8d8SChris Lattner     CFCReleaser<CFMutableDictionaryRef> (s)
1730fdc8d8SChris Lattner {
1830fdc8d8SChris Lattner }
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner //----------------------------------------------------------------------
2130fdc8d8SChris Lattner // CFCMutableDictionary copy constructor
2230fdc8d8SChris Lattner //----------------------------------------------------------------------
2330fdc8d8SChris Lattner CFCMutableDictionary::CFCMutableDictionary(const CFCMutableDictionary& rhs) :
2430fdc8d8SChris Lattner     CFCReleaser<CFMutableDictionaryRef> (rhs)
2530fdc8d8SChris Lattner {
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner //----------------------------------------------------------------------
2930fdc8d8SChris Lattner // CFCMutableDictionary copy constructor
3030fdc8d8SChris Lattner //----------------------------------------------------------------------
3130fdc8d8SChris Lattner const CFCMutableDictionary&
3230fdc8d8SChris Lattner CFCMutableDictionary::operator=(const CFCMutableDictionary& rhs)
3330fdc8d8SChris Lattner {
3430fdc8d8SChris Lattner     if (this != &rhs)
3530fdc8d8SChris Lattner         *this = rhs;
3630fdc8d8SChris Lattner     return *this;
3730fdc8d8SChris Lattner }
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner //----------------------------------------------------------------------
4030fdc8d8SChris Lattner // Destructor
4130fdc8d8SChris Lattner //----------------------------------------------------------------------
4230fdc8d8SChris Lattner CFCMutableDictionary::~CFCMutableDictionary()
4330fdc8d8SChris Lattner {
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner CFIndex
4830fdc8d8SChris Lattner CFCMutableDictionary::GetCount() const
4930fdc8d8SChris Lattner {
5030fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
5130fdc8d8SChris Lattner     if (dict)
5230fdc8d8SChris Lattner         return ::CFDictionaryGetCount (dict);
5330fdc8d8SChris Lattner     return 0;
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner CFIndex
5730fdc8d8SChris Lattner CFCMutableDictionary::GetCountOfKey(const void *key) const
5830fdc8d8SChris Lattner 
5930fdc8d8SChris Lattner {
6030fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
6130fdc8d8SChris Lattner     if (dict)
6230fdc8d8SChris Lattner         return ::CFDictionaryGetCountOfKey (dict, key);
6330fdc8d8SChris Lattner     return 0;
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner CFIndex
6730fdc8d8SChris Lattner CFCMutableDictionary::GetCountOfValue(const void *value) const
6830fdc8d8SChris Lattner 
6930fdc8d8SChris Lattner {
7030fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
7130fdc8d8SChris Lattner     if (dict)
7230fdc8d8SChris Lattner         return ::CFDictionaryGetCountOfValue (dict, value);
7330fdc8d8SChris Lattner     return 0;
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner void
7730fdc8d8SChris Lattner CFCMutableDictionary::GetKeysAndValues(const void **keys, const void **values) const
7830fdc8d8SChris Lattner {
7930fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
8030fdc8d8SChris Lattner     if (dict)
8130fdc8d8SChris Lattner         ::CFDictionaryGetKeysAndValues (dict, keys, values);
8230fdc8d8SChris Lattner }
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner 
8530fdc8d8SChris Lattner const void *
8630fdc8d8SChris Lattner CFCMutableDictionary::GetValue(const void *key) const
8730fdc8d8SChris Lattner 
8830fdc8d8SChris Lattner {
8930fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
9030fdc8d8SChris Lattner     if (dict)
9130fdc8d8SChris Lattner         return ::CFDictionaryGetValue (dict, key);
9230fdc8d8SChris Lattner     return NULL;
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner 
9530fdc8d8SChris Lattner Boolean
9630fdc8d8SChris Lattner CFCMutableDictionary::GetValueIfPresent(const void *key, const void **value_handle) const
9730fdc8d8SChris Lattner {
9830fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
9930fdc8d8SChris Lattner     if (dict)
10030fdc8d8SChris Lattner         return ::CFDictionaryGetValueIfPresent (dict, key, value_handle);
10130fdc8d8SChris Lattner     return false;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner CFMutableDictionaryRef
10630fdc8d8SChris Lattner CFCMutableDictionary::Dictionary(bool can_create)
10730fdc8d8SChris Lattner {
10830fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
10930fdc8d8SChris Lattner     if (can_create && dict == NULL)
11030fdc8d8SChris Lattner     {
11130fdc8d8SChris Lattner         dict = ::CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
11230fdc8d8SChris Lattner         reset ( dict );
11330fdc8d8SChris Lattner     }
11430fdc8d8SChris Lattner     return dict;
11530fdc8d8SChris Lattner }
11630fdc8d8SChris Lattner 
11730fdc8d8SChris Lattner bool
11830fdc8d8SChris Lattner CFCMutableDictionary::AddValue(CFStringRef key, const void *value, bool can_create)
11930fdc8d8SChris Lattner {
12030fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
12130fdc8d8SChris Lattner     if (dict != NULL)
12230fdc8d8SChris Lattner     {
12330fdc8d8SChris Lattner         // Let the dictionary own the CFNumber
12430fdc8d8SChris Lattner         ::CFDictionaryAddValue (dict, key, value);
12530fdc8d8SChris Lattner         return true;
12630fdc8d8SChris Lattner     }
12730fdc8d8SChris Lattner     return false;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13030fdc8d8SChris Lattner bool
13130fdc8d8SChris Lattner CFCMutableDictionary::SetValue(CFStringRef key, const void *value, bool can_create)
13230fdc8d8SChris Lattner {
13330fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
13430fdc8d8SChris Lattner     if (dict != NULL)
13530fdc8d8SChris Lattner     {
13630fdc8d8SChris Lattner         // Let the dictionary own the CFNumber
13730fdc8d8SChris Lattner         ::CFDictionarySetValue (dict, key, value);
13830fdc8d8SChris Lattner         return true;
13930fdc8d8SChris Lattner     }
14030fdc8d8SChris Lattner     return false;
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
14330fdc8d8SChris Lattner bool
14430fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt8(CFStringRef key, int8_t value, bool can_create)
14530fdc8d8SChris Lattner {
14630fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
14730fdc8d8SChris Lattner     if (dict != NULL)
14830fdc8d8SChris Lattner     {
14930fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt8Type, &value));
15030fdc8d8SChris Lattner         if (cf_number.get())
15130fdc8d8SChris Lattner         {
15230fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
15330fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
15430fdc8d8SChris Lattner             return true;
15530fdc8d8SChris Lattner         }
15630fdc8d8SChris Lattner     }
15730fdc8d8SChris Lattner     return false;
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
16030fdc8d8SChris Lattner bool
16130fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt8(CFStringRef key, int8_t value, bool can_create)
16230fdc8d8SChris Lattner {
16330fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
16430fdc8d8SChris Lattner     if (dict != NULL)
16530fdc8d8SChris Lattner     {
16630fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt8Type, &value));
16730fdc8d8SChris Lattner         if (cf_number.get())
16830fdc8d8SChris Lattner         {
16930fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
17030fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
17130fdc8d8SChris Lattner             return true;
17230fdc8d8SChris Lattner         }
17330fdc8d8SChris Lattner     }
17430fdc8d8SChris Lattner     return false;
17530fdc8d8SChris Lattner }
17630fdc8d8SChris Lattner 
17730fdc8d8SChris Lattner bool
17830fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt16(CFStringRef key, int16_t value, bool can_create)
17930fdc8d8SChris Lattner {
18030fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
18130fdc8d8SChris Lattner     if (dict != NULL)
18230fdc8d8SChris Lattner     {
18330fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &value));
18430fdc8d8SChris Lattner         if (cf_number.get())
18530fdc8d8SChris Lattner         {
18630fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
18730fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
18830fdc8d8SChris Lattner             return true;
18930fdc8d8SChris Lattner         }
19030fdc8d8SChris Lattner     }
19130fdc8d8SChris Lattner     return false;
19230fdc8d8SChris Lattner }
19330fdc8d8SChris Lattner 
19430fdc8d8SChris Lattner bool
19530fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt16(CFStringRef key, int16_t value, bool can_create)
19630fdc8d8SChris Lattner {
19730fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
19830fdc8d8SChris Lattner     if (dict != NULL)
19930fdc8d8SChris Lattner     {
20030fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &value));
20130fdc8d8SChris Lattner         if (cf_number.get())
20230fdc8d8SChris Lattner         {
20330fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
20430fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
20530fdc8d8SChris Lattner             return true;
20630fdc8d8SChris Lattner         }
20730fdc8d8SChris Lattner     }
20830fdc8d8SChris Lattner     return false;
20930fdc8d8SChris Lattner }
21030fdc8d8SChris Lattner 
21130fdc8d8SChris Lattner bool
21230fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt32(CFStringRef key, int32_t value, bool can_create)
21330fdc8d8SChris Lattner {
21430fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
21530fdc8d8SChris Lattner     if (dict != NULL)
21630fdc8d8SChris Lattner     {
21730fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &value));
21830fdc8d8SChris Lattner         if (cf_number.get())
21930fdc8d8SChris Lattner         {
22030fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
22130fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
22230fdc8d8SChris Lattner             return true;
22330fdc8d8SChris Lattner         }
22430fdc8d8SChris Lattner     }
22530fdc8d8SChris Lattner     return false;
22630fdc8d8SChris Lattner }
22730fdc8d8SChris Lattner 
22830fdc8d8SChris Lattner bool
22930fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt32(CFStringRef key, int32_t value, bool can_create)
23030fdc8d8SChris Lattner {
23130fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
23230fdc8d8SChris Lattner     if (dict != NULL)
23330fdc8d8SChris Lattner     {
23430fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &value));
23530fdc8d8SChris Lattner         if (cf_number.get())
23630fdc8d8SChris Lattner         {
23730fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
23830fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
23930fdc8d8SChris Lattner             return true;
24030fdc8d8SChris Lattner         }
24130fdc8d8SChris Lattner     }
24230fdc8d8SChris Lattner     return false;
24330fdc8d8SChris Lattner }
24430fdc8d8SChris Lattner 
24530fdc8d8SChris Lattner bool
24630fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt64(CFStringRef key, int64_t value, bool can_create)
24730fdc8d8SChris Lattner {
24830fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
24930fdc8d8SChris Lattner     if (dict != NULL)
25030fdc8d8SChris Lattner     {
25130fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
25230fdc8d8SChris Lattner         if (cf_number.get())
25330fdc8d8SChris Lattner         {
25430fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
25530fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
25630fdc8d8SChris Lattner             return true;
25730fdc8d8SChris Lattner         }
25830fdc8d8SChris Lattner     }
25930fdc8d8SChris Lattner     return false;
26030fdc8d8SChris Lattner }
26130fdc8d8SChris Lattner 
26230fdc8d8SChris Lattner bool
26330fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt64(CFStringRef key, int64_t value, bool can_create)
26430fdc8d8SChris Lattner {
26530fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
26630fdc8d8SChris Lattner     if (dict != NULL)
26730fdc8d8SChris Lattner     {
26830fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
26930fdc8d8SChris Lattner         if (cf_number.get())
27030fdc8d8SChris Lattner         {
27130fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
27230fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
27330fdc8d8SChris Lattner             return true;
27430fdc8d8SChris Lattner         }
27530fdc8d8SChris Lattner     }
27630fdc8d8SChris Lattner     return false;
27730fdc8d8SChris Lattner }
27830fdc8d8SChris Lattner 
27930fdc8d8SChris Lattner bool
28030fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt8(CFStringRef key, uint8_t value, bool can_create)
28130fdc8d8SChris Lattner {
28230fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
28330fdc8d8SChris Lattner     if (dict != NULL)
28430fdc8d8SChris Lattner     {
28530fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
28630fdc8d8SChris Lattner         int16_t sval = value;
28730fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
28830fdc8d8SChris Lattner         if (cf_number.get())
28930fdc8d8SChris Lattner         {
29030fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
29130fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
29230fdc8d8SChris Lattner             return true;
29330fdc8d8SChris Lattner         }
29430fdc8d8SChris Lattner     }
29530fdc8d8SChris Lattner     return false;
29630fdc8d8SChris Lattner }
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner bool
29930fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt8(CFStringRef key, uint8_t value, bool can_create)
30030fdc8d8SChris Lattner {
30130fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
30230fdc8d8SChris Lattner     if (dict != NULL)
30330fdc8d8SChris Lattner     {
30430fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
30530fdc8d8SChris Lattner         int16_t sval = value;
30630fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
30730fdc8d8SChris Lattner         if (cf_number.get())
30830fdc8d8SChris Lattner         {
30930fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
31030fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
31130fdc8d8SChris Lattner             return true;
31230fdc8d8SChris Lattner         }
31330fdc8d8SChris Lattner     }
31430fdc8d8SChris Lattner     return false;
31530fdc8d8SChris Lattner }
31630fdc8d8SChris Lattner 
31730fdc8d8SChris Lattner 
31830fdc8d8SChris Lattner bool
31930fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt16(CFStringRef key, uint16_t value, bool can_create)
32030fdc8d8SChris Lattner {
32130fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
32230fdc8d8SChris Lattner     if (dict != NULL)
32330fdc8d8SChris Lattner     {
32430fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
32530fdc8d8SChris Lattner         int32_t sval = value;
32630fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
32730fdc8d8SChris Lattner         if (cf_number.get())
32830fdc8d8SChris Lattner         {
32930fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
33030fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
33130fdc8d8SChris Lattner             return true;
33230fdc8d8SChris Lattner         }
33330fdc8d8SChris Lattner     }
33430fdc8d8SChris Lattner     return false;
33530fdc8d8SChris Lattner }
33630fdc8d8SChris Lattner 
33730fdc8d8SChris Lattner bool
33830fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt16(CFStringRef key, uint16_t value, bool can_create)
33930fdc8d8SChris Lattner {
34030fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
34130fdc8d8SChris Lattner     if (dict != NULL)
34230fdc8d8SChris Lattner     {
34330fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
34430fdc8d8SChris Lattner         int32_t sval = value;
34530fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
34630fdc8d8SChris Lattner         if (cf_number.get())
34730fdc8d8SChris Lattner         {
34830fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
34930fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
35030fdc8d8SChris Lattner             return true;
35130fdc8d8SChris Lattner         }
35230fdc8d8SChris Lattner     }
35330fdc8d8SChris Lattner     return false;
35430fdc8d8SChris Lattner }
35530fdc8d8SChris Lattner 
35630fdc8d8SChris Lattner bool
35730fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt32(CFStringRef key, uint32_t value, bool can_create)
35830fdc8d8SChris Lattner {
35930fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
36030fdc8d8SChris Lattner     if (dict != NULL)
36130fdc8d8SChris Lattner     {
36230fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
36330fdc8d8SChris Lattner         int64_t sval = value;
36430fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
36530fdc8d8SChris Lattner         if (cf_number.get())
36630fdc8d8SChris Lattner         {
36730fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
36830fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
36930fdc8d8SChris Lattner             return true;
37030fdc8d8SChris Lattner         }
37130fdc8d8SChris Lattner     }
37230fdc8d8SChris Lattner     return false;
37330fdc8d8SChris Lattner }
37430fdc8d8SChris Lattner 
37530fdc8d8SChris Lattner bool
37630fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt32(CFStringRef key, uint32_t value, bool can_create)
37730fdc8d8SChris Lattner {
37830fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
37930fdc8d8SChris Lattner     if (dict != NULL)
38030fdc8d8SChris Lattner     {
38130fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
38230fdc8d8SChris Lattner         int64_t sval = value;
38330fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
38430fdc8d8SChris Lattner         if (cf_number.get())
38530fdc8d8SChris Lattner         {
38630fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
38730fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
38830fdc8d8SChris Lattner             return true;
38930fdc8d8SChris Lattner         }
39030fdc8d8SChris Lattner     }
39130fdc8d8SChris Lattner     return false;
39230fdc8d8SChris Lattner }
39330fdc8d8SChris Lattner 
39430fdc8d8SChris Lattner 
39530fdc8d8SChris Lattner bool
39630fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt64(CFStringRef key, uint64_t value, bool can_create)
39730fdc8d8SChris Lattner {
39830fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
39930fdc8d8SChris Lattner     if (dict != NULL)
40030fdc8d8SChris Lattner     {
40130fdc8d8SChris Lattner         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
40230fdc8d8SChris Lattner         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
40330fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
40430fdc8d8SChris Lattner         if (cf_number.get())
40530fdc8d8SChris Lattner         {
40630fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
40730fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
40830fdc8d8SChris Lattner             return true;
40930fdc8d8SChris Lattner         }
41030fdc8d8SChris Lattner     }
41130fdc8d8SChris Lattner     return false;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner 
41430fdc8d8SChris Lattner 
41530fdc8d8SChris Lattner bool
41630fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt64(CFStringRef key, uint64_t value, bool can_create)
41730fdc8d8SChris Lattner {
41830fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
41930fdc8d8SChris Lattner     if (dict != NULL)
42030fdc8d8SChris Lattner     {
42130fdc8d8SChris Lattner         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
42230fdc8d8SChris Lattner         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
42330fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
42430fdc8d8SChris Lattner         if (cf_number.get())
42530fdc8d8SChris Lattner         {
42630fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
42730fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
42830fdc8d8SChris Lattner             return true;
42930fdc8d8SChris Lattner         }
43030fdc8d8SChris Lattner     }
43130fdc8d8SChris Lattner     return false;
43230fdc8d8SChris Lattner }
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner bool
435*f58cececSEnrico Granata CFCMutableDictionary::AddValueDouble(CFStringRef key, double value, bool can_create)
436*f58cececSEnrico Granata {
437*f58cececSEnrico Granata     CFMutableDictionaryRef dict = Dictionary(can_create);
438*f58cececSEnrico Granata     if (dict != NULL)
439*f58cececSEnrico Granata     {
440*f58cececSEnrico Granata         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
441*f58cececSEnrico Granata         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
442*f58cececSEnrico Granata         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberDoubleType, &value));
443*f58cececSEnrico Granata         if (cf_number.get())
444*f58cececSEnrico Granata         {
445*f58cececSEnrico Granata             // Let the dictionary own the CFNumber
446*f58cececSEnrico Granata             ::CFDictionaryAddValue (dict, key, cf_number.get());
447*f58cececSEnrico Granata             return true;
448*f58cececSEnrico Granata         }
449*f58cececSEnrico Granata     }
450*f58cececSEnrico Granata     return false;
451*f58cececSEnrico Granata }
452*f58cececSEnrico Granata 
453*f58cececSEnrico Granata bool
454*f58cececSEnrico Granata CFCMutableDictionary::SetValueDouble(CFStringRef key, double value, bool can_create)
455*f58cececSEnrico Granata {
456*f58cececSEnrico Granata     CFMutableDictionaryRef dict = Dictionary(can_create);
457*f58cececSEnrico Granata     if (dict != NULL)
458*f58cececSEnrico Granata     {
459*f58cececSEnrico Granata         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
460*f58cececSEnrico Granata         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
461*f58cececSEnrico Granata         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberDoubleType, &value));
462*f58cececSEnrico Granata         if (cf_number.get())
463*f58cececSEnrico Granata         {
464*f58cececSEnrico Granata             // Let the dictionary own the CFNumber
465*f58cececSEnrico Granata             ::CFDictionarySetValue (dict, key, cf_number.get());
466*f58cececSEnrico Granata             return true;
467*f58cececSEnrico Granata         }
468*f58cececSEnrico Granata     }
469*f58cececSEnrico Granata     return false;
470*f58cececSEnrico Granata }
471*f58cececSEnrico Granata 
472*f58cececSEnrico Granata bool
47330fdc8d8SChris Lattner CFCMutableDictionary::AddValueCString(CFStringRef key, const char *cstr, bool can_create)
47430fdc8d8SChris Lattner {
47530fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
47630fdc8d8SChris Lattner     if (dict != NULL)
47730fdc8d8SChris Lattner     {
47830fdc8d8SChris Lattner         CFCString cf_str(cstr, kCFStringEncodingUTF8);
47930fdc8d8SChris Lattner         if (cf_str.get())
48030fdc8d8SChris Lattner         {
48130fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
48230fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_str.get());
48330fdc8d8SChris Lattner             return true;
48430fdc8d8SChris Lattner         }
48530fdc8d8SChris Lattner     }
48630fdc8d8SChris Lattner     return false;
48730fdc8d8SChris Lattner }
48830fdc8d8SChris Lattner 
48930fdc8d8SChris Lattner bool
49030fdc8d8SChris Lattner CFCMutableDictionary::SetValueCString(CFStringRef key, const char *cstr, bool can_create)
49130fdc8d8SChris Lattner {
49230fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
49330fdc8d8SChris Lattner     if (dict != NULL)
49430fdc8d8SChris Lattner     {
49530fdc8d8SChris Lattner         CFCString cf_str(cstr, kCFStringEncodingUTF8);
49630fdc8d8SChris Lattner         if (cf_str.get())
49730fdc8d8SChris Lattner         {
49830fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
49930fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_str.get());
50030fdc8d8SChris Lattner             return true;
50130fdc8d8SChris Lattner         }
50230fdc8d8SChris Lattner     }
50330fdc8d8SChris Lattner     return false;
50430fdc8d8SChris Lattner }
50530fdc8d8SChris Lattner 
50630fdc8d8SChris Lattner 
50730fdc8d8SChris Lattner void
50830fdc8d8SChris Lattner CFCMutableDictionary::RemoveAllValues()
50930fdc8d8SChris Lattner {
51030fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
51130fdc8d8SChris Lattner     if (dict)
51230fdc8d8SChris Lattner         ::CFDictionaryRemoveAllValues(dict);
51330fdc8d8SChris Lattner }
51430fdc8d8SChris Lattner 
51530fdc8d8SChris Lattner void
51630fdc8d8SChris Lattner CFCMutableDictionary::RemoveValue(const void *value)
51730fdc8d8SChris Lattner {
51830fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
51930fdc8d8SChris Lattner     if (dict)
52030fdc8d8SChris Lattner         ::CFDictionaryRemoveValue(dict, value);
52130fdc8d8SChris Lattner }
52230fdc8d8SChris Lattner void
52330fdc8d8SChris Lattner CFCMutableDictionary::ReplaceValue(const void *key, const void *value)
52430fdc8d8SChris Lattner {
52530fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
52630fdc8d8SChris Lattner     if (dict)
52730fdc8d8SChris Lattner         ::CFDictionaryReplaceValue (dict, key, value);
52830fdc8d8SChris Lattner }
52930fdc8d8SChris Lattner 
530