130fdc8d8SChris Lattner //===-- CFCMutableDictionary.cpp --------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "CFCMutableDictionary.h"
1030fdc8d8SChris Lattner #include "CFCString.h"
1130fdc8d8SChris Lattner //----------------------------------------------------------------------
1230fdc8d8SChris Lattner // CFCString constructor
1330fdc8d8SChris Lattner //----------------------------------------------------------------------
14b9c1b51eSKate Stone CFCMutableDictionary::CFCMutableDictionary(CFMutableDictionaryRef s)
15b9c1b51eSKate Stone     : CFCReleaser<CFMutableDictionaryRef>(s) {}
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner //----------------------------------------------------------------------
1830fdc8d8SChris Lattner // CFCMutableDictionary copy constructor
1930fdc8d8SChris Lattner //----------------------------------------------------------------------
20b9c1b51eSKate Stone CFCMutableDictionary::CFCMutableDictionary(const CFCMutableDictionary &rhs)
21b9c1b51eSKate Stone     : CFCReleaser<CFMutableDictionaryRef>(rhs) {}
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner //----------------------------------------------------------------------
2430fdc8d8SChris Lattner // CFCMutableDictionary copy constructor
2530fdc8d8SChris Lattner //----------------------------------------------------------------------
26b9c1b51eSKate Stone const CFCMutableDictionary &CFCMutableDictionary::
27b9c1b51eSKate Stone operator=(const CFCMutableDictionary &rhs) {
2830fdc8d8SChris Lattner   if (this != &rhs)
2930fdc8d8SChris Lattner     *this = rhs;
3030fdc8d8SChris Lattner   return *this;
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner //----------------------------------------------------------------------
3430fdc8d8SChris Lattner // Destructor
3530fdc8d8SChris Lattner //----------------------------------------------------------------------
36b9c1b51eSKate Stone CFCMutableDictionary::~CFCMutableDictionary() {}
3730fdc8d8SChris Lattner 
38b9c1b51eSKate Stone CFIndex CFCMutableDictionary::GetCount() const {
3930fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
4030fdc8d8SChris Lattner   if (dict)
4130fdc8d8SChris Lattner     return ::CFDictionaryGetCount(dict);
4230fdc8d8SChris Lattner   return 0;
4330fdc8d8SChris Lattner }
4430fdc8d8SChris Lattner 
45b9c1b51eSKate Stone CFIndex CFCMutableDictionary::GetCountOfKey(const void *key) const
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner {
4830fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
4930fdc8d8SChris Lattner   if (dict)
5030fdc8d8SChris Lattner     return ::CFDictionaryGetCountOfKey(dict, key);
5130fdc8d8SChris Lattner   return 0;
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
54b9c1b51eSKate Stone CFIndex CFCMutableDictionary::GetCountOfValue(const void *value) const
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner {
5730fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
5830fdc8d8SChris Lattner   if (dict)
5930fdc8d8SChris Lattner     return ::CFDictionaryGetCountOfValue(dict, value);
6030fdc8d8SChris Lattner   return 0;
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
63b9c1b51eSKate Stone void CFCMutableDictionary::GetKeysAndValues(const void **keys,
64b9c1b51eSKate Stone                                             const void **values) const {
6530fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
6630fdc8d8SChris Lattner   if (dict)
6730fdc8d8SChris Lattner     ::CFDictionaryGetKeysAndValues(dict, keys, values);
6830fdc8d8SChris Lattner }
6930fdc8d8SChris Lattner 
70b9c1b51eSKate Stone const void *CFCMutableDictionary::GetValue(const void *key) const
7130fdc8d8SChris Lattner 
7230fdc8d8SChris Lattner {
7330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
7430fdc8d8SChris Lattner   if (dict)
7530fdc8d8SChris Lattner     return ::CFDictionaryGetValue(dict, key);
7630fdc8d8SChris Lattner   return NULL;
7730fdc8d8SChris Lattner }
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner Boolean
80b9c1b51eSKate Stone CFCMutableDictionary::GetValueIfPresent(const void *key,
81b9c1b51eSKate Stone                                         const void **value_handle) const {
8230fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
8330fdc8d8SChris Lattner   if (dict)
8430fdc8d8SChris Lattner     return ::CFDictionaryGetValueIfPresent(dict, key, value_handle);
8530fdc8d8SChris Lattner   return false;
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
88b9c1b51eSKate Stone CFMutableDictionaryRef CFCMutableDictionary::Dictionary(bool can_create) {
8930fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
90b9c1b51eSKate Stone   if (can_create && dict == NULL) {
91b9c1b51eSKate Stone     dict = ::CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
92b9c1b51eSKate Stone                                        &kCFTypeDictionaryKeyCallBacks,
93b9c1b51eSKate Stone                                        &kCFTypeDictionaryValueCallBacks);
9430fdc8d8SChris Lattner     reset(dict);
9530fdc8d8SChris Lattner   }
9630fdc8d8SChris Lattner   return dict;
9730fdc8d8SChris Lattner }
9830fdc8d8SChris Lattner 
99b9c1b51eSKate Stone bool CFCMutableDictionary::AddValue(CFStringRef key, const void *value,
100b9c1b51eSKate Stone                                     bool can_create) {
10130fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
102b9c1b51eSKate Stone   if (dict != NULL) {
10330fdc8d8SChris Lattner     // Let the dictionary own the CFNumber
10430fdc8d8SChris Lattner     ::CFDictionaryAddValue(dict, key, value);
10530fdc8d8SChris Lattner     return true;
10630fdc8d8SChris Lattner   }
10730fdc8d8SChris Lattner   return false;
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
110b9c1b51eSKate Stone bool CFCMutableDictionary::SetValue(CFStringRef key, const void *value,
111b9c1b51eSKate Stone                                     bool can_create) {
11230fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
113b9c1b51eSKate Stone   if (dict != NULL) {
11430fdc8d8SChris Lattner     // Let the dictionary own the CFNumber
11530fdc8d8SChris Lattner     ::CFDictionarySetValue(dict, key, value);
11630fdc8d8SChris Lattner     return true;
11730fdc8d8SChris Lattner   }
11830fdc8d8SChris Lattner   return false;
11930fdc8d8SChris Lattner }
12030fdc8d8SChris Lattner 
121b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueSInt8(CFStringRef key, int8_t value,
122b9c1b51eSKate Stone                                          bool can_create) {
12330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
124b9c1b51eSKate Stone   if (dict != NULL) {
125b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
126b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &value));
127b9c1b51eSKate Stone     if (cf_number.get()) {
12830fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
12930fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
13030fdc8d8SChris Lattner       return true;
13130fdc8d8SChris Lattner     }
13230fdc8d8SChris Lattner   }
13330fdc8d8SChris Lattner   return false;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
136b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueSInt8(CFStringRef key, int8_t value,
137b9c1b51eSKate Stone                                          bool can_create) {
13830fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
139b9c1b51eSKate Stone   if (dict != NULL) {
140b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
141b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &value));
142b9c1b51eSKate Stone     if (cf_number.get()) {
14330fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
14430fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_number.get());
14530fdc8d8SChris Lattner       return true;
14630fdc8d8SChris Lattner     }
14730fdc8d8SChris Lattner   }
14830fdc8d8SChris Lattner   return false;
14930fdc8d8SChris Lattner }
15030fdc8d8SChris Lattner 
151b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueSInt16(CFStringRef key, int16_t value,
152b9c1b51eSKate Stone                                           bool can_create) {
15330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
154b9c1b51eSKate Stone   if (dict != NULL) {
155b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
156b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt16Type, &value));
157b9c1b51eSKate Stone     if (cf_number.get()) {
15830fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
15930fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
16030fdc8d8SChris Lattner       return true;
16130fdc8d8SChris Lattner     }
16230fdc8d8SChris Lattner   }
16330fdc8d8SChris Lattner   return false;
16430fdc8d8SChris Lattner }
16530fdc8d8SChris Lattner 
166b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueSInt16(CFStringRef key, int16_t value,
167b9c1b51eSKate Stone                                           bool can_create) {
16830fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
169b9c1b51eSKate Stone   if (dict != NULL) {
170b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
171b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt16Type, &value));
172b9c1b51eSKate Stone     if (cf_number.get()) {
17330fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
17430fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_number.get());
17530fdc8d8SChris Lattner       return true;
17630fdc8d8SChris Lattner     }
17730fdc8d8SChris Lattner   }
17830fdc8d8SChris Lattner   return false;
17930fdc8d8SChris Lattner }
18030fdc8d8SChris Lattner 
181b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueSInt32(CFStringRef key, int32_t value,
182b9c1b51eSKate Stone                                           bool can_create) {
18330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
184b9c1b51eSKate Stone   if (dict != NULL) {
185b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
186b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
187b9c1b51eSKate Stone     if (cf_number.get()) {
18830fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
18930fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
19030fdc8d8SChris Lattner       return true;
19130fdc8d8SChris Lattner     }
19230fdc8d8SChris Lattner   }
19330fdc8d8SChris Lattner   return false;
19430fdc8d8SChris Lattner }
19530fdc8d8SChris Lattner 
196b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueSInt32(CFStringRef key, int32_t value,
197b9c1b51eSKate Stone                                           bool can_create) {
19830fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
199b9c1b51eSKate Stone   if (dict != NULL) {
200b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
201b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
202b9c1b51eSKate Stone     if (cf_number.get()) {
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 
211b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueSInt64(CFStringRef key, int64_t value,
212b9c1b51eSKate Stone                                           bool can_create) {
21330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
214b9c1b51eSKate Stone   if (dict != NULL) {
215b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
216b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value));
217b9c1b51eSKate Stone     if (cf_number.get()) {
21830fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
21930fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
22030fdc8d8SChris Lattner       return true;
22130fdc8d8SChris Lattner     }
22230fdc8d8SChris Lattner   }
22330fdc8d8SChris Lattner   return false;
22430fdc8d8SChris Lattner }
22530fdc8d8SChris Lattner 
226b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueSInt64(CFStringRef key, int64_t value,
227b9c1b51eSKate Stone                                           bool can_create) {
22830fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
229b9c1b51eSKate Stone   if (dict != NULL) {
230b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
231b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value));
232b9c1b51eSKate Stone     if (cf_number.get()) {
23330fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
23430fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_number.get());
23530fdc8d8SChris Lattner       return true;
23630fdc8d8SChris Lattner     }
23730fdc8d8SChris Lattner   }
23830fdc8d8SChris Lattner   return false;
23930fdc8d8SChris Lattner }
24030fdc8d8SChris Lattner 
241b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueUInt8(CFStringRef key, uint8_t value,
242b9c1b51eSKate Stone                                          bool can_create) {
24330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
244b9c1b51eSKate Stone   if (dict != NULL) {
245b9c1b51eSKate Stone     // Have to promote to the next size type so things don't appear negative of
246b9c1b51eSKate Stone     // the MSBit is set...
24730fdc8d8SChris Lattner     int16_t sval = value;
248b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
249b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
250b9c1b51eSKate Stone     if (cf_number.get()) {
25130fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
25230fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
25330fdc8d8SChris Lattner       return true;
25430fdc8d8SChris Lattner     }
25530fdc8d8SChris Lattner   }
25630fdc8d8SChris Lattner   return false;
25730fdc8d8SChris Lattner }
25830fdc8d8SChris Lattner 
259b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueUInt8(CFStringRef key, uint8_t value,
260b9c1b51eSKate Stone                                          bool can_create) {
26130fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
262b9c1b51eSKate Stone   if (dict != NULL) {
263b9c1b51eSKate Stone     // Have to promote to the next size type so things don't appear negative of
264b9c1b51eSKate Stone     // the MSBit is set...
26530fdc8d8SChris Lattner     int16_t sval = value;
266b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
267b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
268b9c1b51eSKate Stone     if (cf_number.get()) {
26930fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
27030fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_number.get());
27130fdc8d8SChris Lattner       return true;
27230fdc8d8SChris Lattner     }
27330fdc8d8SChris Lattner   }
27430fdc8d8SChris Lattner   return false;
27530fdc8d8SChris Lattner }
27630fdc8d8SChris Lattner 
277b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueUInt16(CFStringRef key, uint16_t value,
278b9c1b51eSKate Stone                                           bool can_create) {
27930fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
280b9c1b51eSKate Stone   if (dict != NULL) {
281b9c1b51eSKate Stone     // Have to promote to the next size type so things don't appear negative of
282b9c1b51eSKate Stone     // the MSBit is set...
28330fdc8d8SChris Lattner     int32_t sval = value;
284b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
285b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
286b9c1b51eSKate Stone     if (cf_number.get()) {
28730fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
28830fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
28930fdc8d8SChris Lattner       return true;
29030fdc8d8SChris Lattner     }
29130fdc8d8SChris Lattner   }
29230fdc8d8SChris Lattner   return false;
29330fdc8d8SChris Lattner }
29430fdc8d8SChris Lattner 
295b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueUInt16(CFStringRef key, uint16_t value,
296b9c1b51eSKate Stone                                           bool can_create) {
29730fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
298b9c1b51eSKate Stone   if (dict != NULL) {
299b9c1b51eSKate Stone     // Have to promote to the next size type so things don't appear negative of
300b9c1b51eSKate Stone     // the MSBit is set...
30130fdc8d8SChris Lattner     int32_t sval = value;
302b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
303b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
304b9c1b51eSKate Stone     if (cf_number.get()) {
30530fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
30630fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_number.get());
30730fdc8d8SChris Lattner       return true;
30830fdc8d8SChris Lattner     }
30930fdc8d8SChris Lattner   }
31030fdc8d8SChris Lattner   return false;
31130fdc8d8SChris Lattner }
31230fdc8d8SChris Lattner 
313b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueUInt32(CFStringRef key, uint32_t value,
314b9c1b51eSKate Stone                                           bool can_create) {
31530fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
316b9c1b51eSKate Stone   if (dict != NULL) {
317b9c1b51eSKate Stone     // Have to promote to the next size type so things don't appear negative of
318b9c1b51eSKate Stone     // the MSBit is set...
31930fdc8d8SChris Lattner     int64_t sval = value;
320b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
321b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
322b9c1b51eSKate Stone     if (cf_number.get()) {
32330fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
32430fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
32530fdc8d8SChris Lattner       return true;
32630fdc8d8SChris Lattner     }
32730fdc8d8SChris Lattner   }
32830fdc8d8SChris Lattner   return false;
32930fdc8d8SChris Lattner }
33030fdc8d8SChris Lattner 
331b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueUInt32(CFStringRef key, uint32_t value,
332b9c1b51eSKate Stone                                           bool can_create) {
33330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
334b9c1b51eSKate Stone   if (dict != NULL) {
335b9c1b51eSKate Stone     // Have to promote to the next size type so things don't appear negative of
336b9c1b51eSKate Stone     // the MSBit is set...
33730fdc8d8SChris Lattner     int64_t sval = value;
338b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
339b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
340b9c1b51eSKate Stone     if (cf_number.get()) {
34130fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
34230fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_number.get());
34330fdc8d8SChris Lattner       return true;
34430fdc8d8SChris Lattner     }
34530fdc8d8SChris Lattner   }
34630fdc8d8SChris Lattner   return false;
34730fdc8d8SChris Lattner }
34830fdc8d8SChris Lattner 
349b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueUInt64(CFStringRef key, uint64_t value,
350b9c1b51eSKate Stone                                           bool can_create) {
35130fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
352b9c1b51eSKate Stone   if (dict != NULL) {
353b9c1b51eSKate Stone     // The number may appear negative if the MSBit is set in "value". Due to a
35405097246SAdrian Prantl     // limitation of CFNumber, there isn't a way to have it show up otherwise
35505097246SAdrian Prantl     // as of this writing.
356b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
357b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value));
358b9c1b51eSKate Stone     if (cf_number.get()) {
35930fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
36030fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_number.get());
36130fdc8d8SChris Lattner       return true;
36230fdc8d8SChris Lattner     }
36330fdc8d8SChris Lattner   }
36430fdc8d8SChris Lattner   return false;
36530fdc8d8SChris Lattner }
36630fdc8d8SChris Lattner 
367b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueUInt64(CFStringRef key, uint64_t value,
368b9c1b51eSKate Stone                                           bool can_create) {
36930fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
370b9c1b51eSKate Stone   if (dict != NULL) {
371b9c1b51eSKate Stone     // The number may appear negative if the MSBit is set in "value". Due to a
37205097246SAdrian Prantl     // limitation of CFNumber, there isn't a way to have it show up otherwise
37305097246SAdrian Prantl     // as of this writing.
374b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
375b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value));
376b9c1b51eSKate Stone     if (cf_number.get()) {
37730fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
37830fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_number.get());
37930fdc8d8SChris Lattner       return true;
38030fdc8d8SChris Lattner     }
38130fdc8d8SChris Lattner   }
38230fdc8d8SChris Lattner   return false;
38330fdc8d8SChris Lattner }
38430fdc8d8SChris Lattner 
385b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueDouble(CFStringRef key, double value,
386b9c1b51eSKate Stone                                           bool can_create) {
387f58cececSEnrico Granata   CFMutableDictionaryRef dict = Dictionary(can_create);
388b9c1b51eSKate Stone   if (dict != NULL) {
389b9c1b51eSKate Stone     // The number may appear negative if the MSBit is set in "value". Due to a
39005097246SAdrian Prantl     // limitation of CFNumber, there isn't a way to have it show up otherwise
39105097246SAdrian Prantl     // as of this writing.
392b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
393b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &value));
394b9c1b51eSKate Stone     if (cf_number.get()) {
395f58cececSEnrico Granata       // Let the dictionary own the CFNumber
396f58cececSEnrico Granata       ::CFDictionaryAddValue(dict, key, cf_number.get());
397f58cececSEnrico Granata       return true;
398f58cececSEnrico Granata     }
399f58cececSEnrico Granata   }
400f58cececSEnrico Granata   return false;
401f58cececSEnrico Granata }
402f58cececSEnrico Granata 
403b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueDouble(CFStringRef key, double value,
404b9c1b51eSKate Stone                                           bool can_create) {
405f58cececSEnrico Granata   CFMutableDictionaryRef dict = Dictionary(can_create);
406b9c1b51eSKate Stone   if (dict != NULL) {
407b9c1b51eSKate Stone     // The number may appear negative if the MSBit is set in "value". Due to a
40805097246SAdrian Prantl     // limitation of CFNumber, there isn't a way to have it show up otherwise
40905097246SAdrian Prantl     // as of this writing.
410b9c1b51eSKate Stone     CFCReleaser<CFNumberRef> cf_number(
411b9c1b51eSKate Stone         ::CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &value));
412b9c1b51eSKate Stone     if (cf_number.get()) {
413f58cececSEnrico Granata       // Let the dictionary own the CFNumber
414f58cececSEnrico Granata       ::CFDictionarySetValue(dict, key, cf_number.get());
415f58cececSEnrico Granata       return true;
416f58cececSEnrico Granata     }
417f58cececSEnrico Granata   }
418f58cececSEnrico Granata   return false;
419f58cececSEnrico Granata }
420f58cececSEnrico Granata 
421b9c1b51eSKate Stone bool CFCMutableDictionary::AddValueCString(CFStringRef key, const char *cstr,
422b9c1b51eSKate Stone                                            bool can_create) {
42330fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
424b9c1b51eSKate Stone   if (dict != NULL) {
42530fdc8d8SChris Lattner     CFCString cf_str(cstr, kCFStringEncodingUTF8);
426b9c1b51eSKate Stone     if (cf_str.get()) {
42730fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
42830fdc8d8SChris Lattner       ::CFDictionaryAddValue(dict, key, cf_str.get());
42930fdc8d8SChris Lattner       return true;
43030fdc8d8SChris Lattner     }
43130fdc8d8SChris Lattner   }
43230fdc8d8SChris Lattner   return false;
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
435b9c1b51eSKate Stone bool CFCMutableDictionary::SetValueCString(CFStringRef key, const char *cstr,
436b9c1b51eSKate Stone                                            bool can_create) {
43730fdc8d8SChris Lattner   CFMutableDictionaryRef dict = Dictionary(can_create);
438b9c1b51eSKate Stone   if (dict != NULL) {
43930fdc8d8SChris Lattner     CFCString cf_str(cstr, kCFStringEncodingUTF8);
440b9c1b51eSKate Stone     if (cf_str.get()) {
44130fdc8d8SChris Lattner       // Let the dictionary own the CFNumber
44230fdc8d8SChris Lattner       ::CFDictionarySetValue(dict, key, cf_str.get());
44330fdc8d8SChris Lattner       return true;
44430fdc8d8SChris Lattner     }
44530fdc8d8SChris Lattner   }
44630fdc8d8SChris Lattner   return false;
44730fdc8d8SChris Lattner }
44830fdc8d8SChris Lattner 
449b9c1b51eSKate Stone void CFCMutableDictionary::RemoveAllValues() {
45030fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
45130fdc8d8SChris Lattner   if (dict)
45230fdc8d8SChris Lattner     ::CFDictionaryRemoveAllValues(dict);
45330fdc8d8SChris Lattner }
45430fdc8d8SChris Lattner 
455b9c1b51eSKate Stone void CFCMutableDictionary::RemoveValue(const void *value) {
45630fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
45730fdc8d8SChris Lattner   if (dict)
45830fdc8d8SChris Lattner     ::CFDictionaryRemoveValue(dict, value);
45930fdc8d8SChris Lattner }
460b9c1b51eSKate Stone void CFCMutableDictionary::ReplaceValue(const void *key, const void *value) {
46130fdc8d8SChris Lattner   CFMutableDictionaryRef dict = get();
46230fdc8d8SChris Lattner   if (dict)
46330fdc8d8SChris Lattner     ::CFDictionaryReplaceValue(dict, key, value);
46430fdc8d8SChris Lattner }
465