1*30fdc8d8SChris Lattner //===-- CFCMutableDictionary.cpp --------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "CFCMutableDictionary.h"
11*30fdc8d8SChris Lattner #include "CFCString.h"
12*30fdc8d8SChris Lattner //----------------------------------------------------------------------
13*30fdc8d8SChris Lattner // CFCString constructor
14*30fdc8d8SChris Lattner //----------------------------------------------------------------------
15*30fdc8d8SChris Lattner CFCMutableDictionary::CFCMutableDictionary(CFMutableDictionaryRef s) :
16*30fdc8d8SChris Lattner     CFCReleaser<CFMutableDictionaryRef> (s)
17*30fdc8d8SChris Lattner {
18*30fdc8d8SChris Lattner }
19*30fdc8d8SChris Lattner 
20*30fdc8d8SChris Lattner //----------------------------------------------------------------------
21*30fdc8d8SChris Lattner // CFCMutableDictionary copy constructor
22*30fdc8d8SChris Lattner //----------------------------------------------------------------------
23*30fdc8d8SChris Lattner CFCMutableDictionary::CFCMutableDictionary(const CFCMutableDictionary& rhs) :
24*30fdc8d8SChris Lattner     CFCReleaser<CFMutableDictionaryRef> (rhs)
25*30fdc8d8SChris Lattner {
26*30fdc8d8SChris Lattner }
27*30fdc8d8SChris Lattner 
28*30fdc8d8SChris Lattner //----------------------------------------------------------------------
29*30fdc8d8SChris Lattner // CFCMutableDictionary copy constructor
30*30fdc8d8SChris Lattner //----------------------------------------------------------------------
31*30fdc8d8SChris Lattner const CFCMutableDictionary&
32*30fdc8d8SChris Lattner CFCMutableDictionary::operator=(const CFCMutableDictionary& rhs)
33*30fdc8d8SChris Lattner {
34*30fdc8d8SChris Lattner     if (this != &rhs)
35*30fdc8d8SChris Lattner         *this = rhs;
36*30fdc8d8SChris Lattner     return *this;
37*30fdc8d8SChris Lattner }
38*30fdc8d8SChris Lattner 
39*30fdc8d8SChris Lattner //----------------------------------------------------------------------
40*30fdc8d8SChris Lattner // Destructor
41*30fdc8d8SChris Lattner //----------------------------------------------------------------------
42*30fdc8d8SChris Lattner CFCMutableDictionary::~CFCMutableDictionary()
43*30fdc8d8SChris Lattner {
44*30fdc8d8SChris Lattner }
45*30fdc8d8SChris Lattner 
46*30fdc8d8SChris Lattner 
47*30fdc8d8SChris Lattner CFIndex
48*30fdc8d8SChris Lattner CFCMutableDictionary::GetCount() const
49*30fdc8d8SChris Lattner {
50*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
51*30fdc8d8SChris Lattner     if (dict)
52*30fdc8d8SChris Lattner         return ::CFDictionaryGetCount (dict);
53*30fdc8d8SChris Lattner     return 0;
54*30fdc8d8SChris Lattner }
55*30fdc8d8SChris Lattner 
56*30fdc8d8SChris Lattner CFIndex
57*30fdc8d8SChris Lattner CFCMutableDictionary::GetCountOfKey(const void *key) const
58*30fdc8d8SChris Lattner 
59*30fdc8d8SChris Lattner {
60*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
61*30fdc8d8SChris Lattner     if (dict)
62*30fdc8d8SChris Lattner         return ::CFDictionaryGetCountOfKey (dict, key);
63*30fdc8d8SChris Lattner     return 0;
64*30fdc8d8SChris Lattner }
65*30fdc8d8SChris Lattner 
66*30fdc8d8SChris Lattner CFIndex
67*30fdc8d8SChris Lattner CFCMutableDictionary::GetCountOfValue(const void *value) const
68*30fdc8d8SChris Lattner 
69*30fdc8d8SChris Lattner {
70*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
71*30fdc8d8SChris Lattner     if (dict)
72*30fdc8d8SChris Lattner         return ::CFDictionaryGetCountOfValue (dict, value);
73*30fdc8d8SChris Lattner     return 0;
74*30fdc8d8SChris Lattner }
75*30fdc8d8SChris Lattner 
76*30fdc8d8SChris Lattner void
77*30fdc8d8SChris Lattner CFCMutableDictionary::GetKeysAndValues(const void **keys, const void **values) const
78*30fdc8d8SChris Lattner {
79*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
80*30fdc8d8SChris Lattner     if (dict)
81*30fdc8d8SChris Lattner         ::CFDictionaryGetKeysAndValues (dict, keys, values);
82*30fdc8d8SChris Lattner }
83*30fdc8d8SChris Lattner 
84*30fdc8d8SChris Lattner 
85*30fdc8d8SChris Lattner const void *
86*30fdc8d8SChris Lattner CFCMutableDictionary::GetValue(const void *key) const
87*30fdc8d8SChris Lattner 
88*30fdc8d8SChris Lattner {
89*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
90*30fdc8d8SChris Lattner     if (dict)
91*30fdc8d8SChris Lattner         return ::CFDictionaryGetValue (dict, key);
92*30fdc8d8SChris Lattner     return NULL;
93*30fdc8d8SChris Lattner }
94*30fdc8d8SChris Lattner 
95*30fdc8d8SChris Lattner Boolean
96*30fdc8d8SChris Lattner CFCMutableDictionary::GetValueIfPresent(const void *key, const void **value_handle) const
97*30fdc8d8SChris Lattner {
98*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
99*30fdc8d8SChris Lattner     if (dict)
100*30fdc8d8SChris Lattner         return ::CFDictionaryGetValueIfPresent (dict, key, value_handle);
101*30fdc8d8SChris Lattner     return false;
102*30fdc8d8SChris Lattner }
103*30fdc8d8SChris Lattner 
104*30fdc8d8SChris Lattner 
105*30fdc8d8SChris Lattner CFMutableDictionaryRef
106*30fdc8d8SChris Lattner CFCMutableDictionary::Dictionary(bool can_create)
107*30fdc8d8SChris Lattner {
108*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
109*30fdc8d8SChris Lattner     if (can_create && dict == NULL)
110*30fdc8d8SChris Lattner     {
111*30fdc8d8SChris Lattner         dict = ::CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
112*30fdc8d8SChris Lattner         reset ( dict );
113*30fdc8d8SChris Lattner     }
114*30fdc8d8SChris Lattner     return dict;
115*30fdc8d8SChris Lattner }
116*30fdc8d8SChris Lattner 
117*30fdc8d8SChris Lattner bool
118*30fdc8d8SChris Lattner CFCMutableDictionary::AddValue(CFStringRef key, const void *value, bool can_create)
119*30fdc8d8SChris Lattner {
120*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
121*30fdc8d8SChris Lattner     if (dict != NULL)
122*30fdc8d8SChris Lattner     {
123*30fdc8d8SChris Lattner         // Let the dictionary own the CFNumber
124*30fdc8d8SChris Lattner         ::CFDictionaryAddValue (dict, key, value);
125*30fdc8d8SChris Lattner         return true;
126*30fdc8d8SChris Lattner     }
127*30fdc8d8SChris Lattner     return false;
128*30fdc8d8SChris Lattner }
129*30fdc8d8SChris Lattner 
130*30fdc8d8SChris Lattner bool
131*30fdc8d8SChris Lattner CFCMutableDictionary::SetValue(CFStringRef key, const void *value, bool can_create)
132*30fdc8d8SChris Lattner {
133*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
134*30fdc8d8SChris Lattner     if (dict != NULL)
135*30fdc8d8SChris Lattner     {
136*30fdc8d8SChris Lattner         // Let the dictionary own the CFNumber
137*30fdc8d8SChris Lattner         ::CFDictionarySetValue (dict, key, value);
138*30fdc8d8SChris Lattner         return true;
139*30fdc8d8SChris Lattner     }
140*30fdc8d8SChris Lattner     return false;
141*30fdc8d8SChris Lattner }
142*30fdc8d8SChris Lattner 
143*30fdc8d8SChris Lattner bool
144*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt8(CFStringRef key, int8_t value, bool can_create)
145*30fdc8d8SChris Lattner {
146*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
147*30fdc8d8SChris Lattner     if (dict != NULL)
148*30fdc8d8SChris Lattner     {
149*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt8Type, &value));
150*30fdc8d8SChris Lattner         if (cf_number.get())
151*30fdc8d8SChris Lattner         {
152*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
153*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
154*30fdc8d8SChris Lattner             return true;
155*30fdc8d8SChris Lattner         }
156*30fdc8d8SChris Lattner     }
157*30fdc8d8SChris Lattner     return false;
158*30fdc8d8SChris Lattner }
159*30fdc8d8SChris Lattner 
160*30fdc8d8SChris Lattner bool
161*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt8(CFStringRef key, int8_t value, bool can_create)
162*30fdc8d8SChris Lattner {
163*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
164*30fdc8d8SChris Lattner     if (dict != NULL)
165*30fdc8d8SChris Lattner     {
166*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt8Type, &value));
167*30fdc8d8SChris Lattner         if (cf_number.get())
168*30fdc8d8SChris Lattner         {
169*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
170*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
171*30fdc8d8SChris Lattner             return true;
172*30fdc8d8SChris Lattner         }
173*30fdc8d8SChris Lattner     }
174*30fdc8d8SChris Lattner     return false;
175*30fdc8d8SChris Lattner }
176*30fdc8d8SChris Lattner 
177*30fdc8d8SChris Lattner bool
178*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt16(CFStringRef key, int16_t value, bool can_create)
179*30fdc8d8SChris Lattner {
180*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
181*30fdc8d8SChris Lattner     if (dict != NULL)
182*30fdc8d8SChris Lattner     {
183*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &value));
184*30fdc8d8SChris Lattner         if (cf_number.get())
185*30fdc8d8SChris Lattner         {
186*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
187*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
188*30fdc8d8SChris Lattner             return true;
189*30fdc8d8SChris Lattner         }
190*30fdc8d8SChris Lattner     }
191*30fdc8d8SChris Lattner     return false;
192*30fdc8d8SChris Lattner }
193*30fdc8d8SChris Lattner 
194*30fdc8d8SChris Lattner bool
195*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt16(CFStringRef key, int16_t value, bool can_create)
196*30fdc8d8SChris Lattner {
197*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
198*30fdc8d8SChris Lattner     if (dict != NULL)
199*30fdc8d8SChris Lattner     {
200*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &value));
201*30fdc8d8SChris Lattner         if (cf_number.get())
202*30fdc8d8SChris Lattner         {
203*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
204*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
205*30fdc8d8SChris Lattner             return true;
206*30fdc8d8SChris Lattner         }
207*30fdc8d8SChris Lattner     }
208*30fdc8d8SChris Lattner     return false;
209*30fdc8d8SChris Lattner }
210*30fdc8d8SChris Lattner 
211*30fdc8d8SChris Lattner bool
212*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt32(CFStringRef key, int32_t value, bool can_create)
213*30fdc8d8SChris Lattner {
214*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
215*30fdc8d8SChris Lattner     if (dict != NULL)
216*30fdc8d8SChris Lattner     {
217*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &value));
218*30fdc8d8SChris Lattner         if (cf_number.get())
219*30fdc8d8SChris Lattner         {
220*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
221*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
222*30fdc8d8SChris Lattner             return true;
223*30fdc8d8SChris Lattner         }
224*30fdc8d8SChris Lattner     }
225*30fdc8d8SChris Lattner     return false;
226*30fdc8d8SChris Lattner }
227*30fdc8d8SChris Lattner 
228*30fdc8d8SChris Lattner bool
229*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt32(CFStringRef key, int32_t value, bool can_create)
230*30fdc8d8SChris Lattner {
231*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
232*30fdc8d8SChris Lattner     if (dict != NULL)
233*30fdc8d8SChris Lattner     {
234*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &value));
235*30fdc8d8SChris Lattner         if (cf_number.get())
236*30fdc8d8SChris Lattner         {
237*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
238*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
239*30fdc8d8SChris Lattner             return true;
240*30fdc8d8SChris Lattner         }
241*30fdc8d8SChris Lattner     }
242*30fdc8d8SChris Lattner     return false;
243*30fdc8d8SChris Lattner }
244*30fdc8d8SChris Lattner 
245*30fdc8d8SChris Lattner bool
246*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueSInt64(CFStringRef key, int64_t value, bool can_create)
247*30fdc8d8SChris Lattner {
248*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
249*30fdc8d8SChris Lattner     if (dict != NULL)
250*30fdc8d8SChris Lattner     {
251*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
252*30fdc8d8SChris Lattner         if (cf_number.get())
253*30fdc8d8SChris Lattner         {
254*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
255*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
256*30fdc8d8SChris Lattner             return true;
257*30fdc8d8SChris Lattner         }
258*30fdc8d8SChris Lattner     }
259*30fdc8d8SChris Lattner     return false;
260*30fdc8d8SChris Lattner }
261*30fdc8d8SChris Lattner 
262*30fdc8d8SChris Lattner bool
263*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueSInt64(CFStringRef key, int64_t value, bool can_create)
264*30fdc8d8SChris Lattner {
265*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
266*30fdc8d8SChris Lattner     if (dict != NULL)
267*30fdc8d8SChris Lattner     {
268*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
269*30fdc8d8SChris Lattner         if (cf_number.get())
270*30fdc8d8SChris Lattner         {
271*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
272*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
273*30fdc8d8SChris Lattner             return true;
274*30fdc8d8SChris Lattner         }
275*30fdc8d8SChris Lattner     }
276*30fdc8d8SChris Lattner     return false;
277*30fdc8d8SChris Lattner }
278*30fdc8d8SChris Lattner 
279*30fdc8d8SChris Lattner bool
280*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt8(CFStringRef key, uint8_t value, bool can_create)
281*30fdc8d8SChris Lattner {
282*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
283*30fdc8d8SChris Lattner     if (dict != NULL)
284*30fdc8d8SChris Lattner     {
285*30fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
286*30fdc8d8SChris Lattner         int16_t sval = value;
287*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
288*30fdc8d8SChris Lattner         if (cf_number.get())
289*30fdc8d8SChris Lattner         {
290*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
291*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
292*30fdc8d8SChris Lattner             return true;
293*30fdc8d8SChris Lattner         }
294*30fdc8d8SChris Lattner     }
295*30fdc8d8SChris Lattner     return false;
296*30fdc8d8SChris Lattner }
297*30fdc8d8SChris Lattner 
298*30fdc8d8SChris Lattner bool
299*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt8(CFStringRef key, uint8_t value, bool can_create)
300*30fdc8d8SChris Lattner {
301*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
302*30fdc8d8SChris Lattner     if (dict != NULL)
303*30fdc8d8SChris Lattner     {
304*30fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
305*30fdc8d8SChris Lattner         int16_t sval = value;
306*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
307*30fdc8d8SChris Lattner         if (cf_number.get())
308*30fdc8d8SChris Lattner         {
309*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
310*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
311*30fdc8d8SChris Lattner             return true;
312*30fdc8d8SChris Lattner         }
313*30fdc8d8SChris Lattner     }
314*30fdc8d8SChris Lattner     return false;
315*30fdc8d8SChris Lattner }
316*30fdc8d8SChris Lattner 
317*30fdc8d8SChris Lattner 
318*30fdc8d8SChris Lattner bool
319*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt16(CFStringRef key, uint16_t value, bool can_create)
320*30fdc8d8SChris Lattner {
321*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
322*30fdc8d8SChris Lattner     if (dict != NULL)
323*30fdc8d8SChris Lattner     {
324*30fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
325*30fdc8d8SChris Lattner         int32_t sval = value;
326*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
327*30fdc8d8SChris Lattner         if (cf_number.get())
328*30fdc8d8SChris Lattner         {
329*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
330*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
331*30fdc8d8SChris Lattner             return true;
332*30fdc8d8SChris Lattner         }
333*30fdc8d8SChris Lattner     }
334*30fdc8d8SChris Lattner     return false;
335*30fdc8d8SChris Lattner }
336*30fdc8d8SChris Lattner 
337*30fdc8d8SChris Lattner bool
338*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt16(CFStringRef key, uint16_t value, bool can_create)
339*30fdc8d8SChris Lattner {
340*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
341*30fdc8d8SChris Lattner     if (dict != NULL)
342*30fdc8d8SChris Lattner     {
343*30fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
344*30fdc8d8SChris Lattner         int32_t sval = value;
345*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
346*30fdc8d8SChris Lattner         if (cf_number.get())
347*30fdc8d8SChris Lattner         {
348*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
349*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
350*30fdc8d8SChris Lattner             return true;
351*30fdc8d8SChris Lattner         }
352*30fdc8d8SChris Lattner     }
353*30fdc8d8SChris Lattner     return false;
354*30fdc8d8SChris Lattner }
355*30fdc8d8SChris Lattner 
356*30fdc8d8SChris Lattner bool
357*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt32(CFStringRef key, uint32_t value, bool can_create)
358*30fdc8d8SChris Lattner {
359*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
360*30fdc8d8SChris Lattner     if (dict != NULL)
361*30fdc8d8SChris Lattner     {
362*30fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
363*30fdc8d8SChris Lattner         int64_t sval = value;
364*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
365*30fdc8d8SChris Lattner         if (cf_number.get())
366*30fdc8d8SChris Lattner         {
367*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
368*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
369*30fdc8d8SChris Lattner             return true;
370*30fdc8d8SChris Lattner         }
371*30fdc8d8SChris Lattner     }
372*30fdc8d8SChris Lattner     return false;
373*30fdc8d8SChris Lattner }
374*30fdc8d8SChris Lattner 
375*30fdc8d8SChris Lattner bool
376*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt32(CFStringRef key, uint32_t value, bool can_create)
377*30fdc8d8SChris Lattner {
378*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
379*30fdc8d8SChris Lattner     if (dict != NULL)
380*30fdc8d8SChris Lattner     {
381*30fdc8d8SChris Lattner         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
382*30fdc8d8SChris Lattner         int64_t sval = value;
383*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
384*30fdc8d8SChris Lattner         if (cf_number.get())
385*30fdc8d8SChris Lattner         {
386*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
387*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
388*30fdc8d8SChris Lattner             return true;
389*30fdc8d8SChris Lattner         }
390*30fdc8d8SChris Lattner     }
391*30fdc8d8SChris Lattner     return false;
392*30fdc8d8SChris Lattner }
393*30fdc8d8SChris Lattner 
394*30fdc8d8SChris Lattner 
395*30fdc8d8SChris Lattner bool
396*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueUInt64(CFStringRef key, uint64_t value, bool can_create)
397*30fdc8d8SChris Lattner {
398*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
399*30fdc8d8SChris Lattner     if (dict != NULL)
400*30fdc8d8SChris Lattner     {
401*30fdc8d8SChris Lattner         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
402*30fdc8d8SChris Lattner         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
403*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
404*30fdc8d8SChris Lattner         if (cf_number.get())
405*30fdc8d8SChris Lattner         {
406*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
407*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_number.get());
408*30fdc8d8SChris Lattner             return true;
409*30fdc8d8SChris Lattner         }
410*30fdc8d8SChris Lattner     }
411*30fdc8d8SChris Lattner     return false;
412*30fdc8d8SChris Lattner }
413*30fdc8d8SChris Lattner 
414*30fdc8d8SChris Lattner 
415*30fdc8d8SChris Lattner bool
416*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueUInt64(CFStringRef key, uint64_t value, bool can_create)
417*30fdc8d8SChris Lattner {
418*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
419*30fdc8d8SChris Lattner     if (dict != NULL)
420*30fdc8d8SChris Lattner     {
421*30fdc8d8SChris Lattner         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
422*30fdc8d8SChris Lattner         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
423*30fdc8d8SChris Lattner         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
424*30fdc8d8SChris Lattner         if (cf_number.get())
425*30fdc8d8SChris Lattner         {
426*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
427*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_number.get());
428*30fdc8d8SChris Lattner             return true;
429*30fdc8d8SChris Lattner         }
430*30fdc8d8SChris Lattner     }
431*30fdc8d8SChris Lattner     return false;
432*30fdc8d8SChris Lattner }
433*30fdc8d8SChris Lattner 
434*30fdc8d8SChris Lattner bool
435*30fdc8d8SChris Lattner CFCMutableDictionary::AddValueCString(CFStringRef key, const char *cstr, bool can_create)
436*30fdc8d8SChris Lattner {
437*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
438*30fdc8d8SChris Lattner     if (dict != NULL)
439*30fdc8d8SChris Lattner     {
440*30fdc8d8SChris Lattner         CFCString cf_str(cstr, kCFStringEncodingUTF8);
441*30fdc8d8SChris Lattner         if (cf_str.get())
442*30fdc8d8SChris Lattner         {
443*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
444*30fdc8d8SChris Lattner             ::CFDictionaryAddValue (dict, key, cf_str.get());
445*30fdc8d8SChris Lattner             return true;
446*30fdc8d8SChris Lattner         }
447*30fdc8d8SChris Lattner     }
448*30fdc8d8SChris Lattner     return false;
449*30fdc8d8SChris Lattner }
450*30fdc8d8SChris Lattner 
451*30fdc8d8SChris Lattner bool
452*30fdc8d8SChris Lattner CFCMutableDictionary::SetValueCString(CFStringRef key, const char *cstr, bool can_create)
453*30fdc8d8SChris Lattner {
454*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = Dictionary(can_create);
455*30fdc8d8SChris Lattner     if (dict != NULL)
456*30fdc8d8SChris Lattner     {
457*30fdc8d8SChris Lattner         CFCString cf_str(cstr, kCFStringEncodingUTF8);
458*30fdc8d8SChris Lattner         if (cf_str.get())
459*30fdc8d8SChris Lattner         {
460*30fdc8d8SChris Lattner             // Let the dictionary own the CFNumber
461*30fdc8d8SChris Lattner             ::CFDictionarySetValue (dict, key, cf_str.get());
462*30fdc8d8SChris Lattner             return true;
463*30fdc8d8SChris Lattner         }
464*30fdc8d8SChris Lattner     }
465*30fdc8d8SChris Lattner     return false;
466*30fdc8d8SChris Lattner }
467*30fdc8d8SChris Lattner 
468*30fdc8d8SChris Lattner 
469*30fdc8d8SChris Lattner void
470*30fdc8d8SChris Lattner CFCMutableDictionary::RemoveAllValues()
471*30fdc8d8SChris Lattner {
472*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
473*30fdc8d8SChris Lattner     if (dict)
474*30fdc8d8SChris Lattner         ::CFDictionaryRemoveAllValues(dict);
475*30fdc8d8SChris Lattner }
476*30fdc8d8SChris Lattner 
477*30fdc8d8SChris Lattner void
478*30fdc8d8SChris Lattner CFCMutableDictionary::RemoveValue(const void *value)
479*30fdc8d8SChris Lattner {
480*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
481*30fdc8d8SChris Lattner     if (dict)
482*30fdc8d8SChris Lattner         ::CFDictionaryRemoveValue(dict, value);
483*30fdc8d8SChris Lattner }
484*30fdc8d8SChris Lattner void
485*30fdc8d8SChris Lattner CFCMutableDictionary::ReplaceValue(const void *key, const void *value)
486*30fdc8d8SChris Lattner {
487*30fdc8d8SChris Lattner     CFMutableDictionaryRef dict = get();
488*30fdc8d8SChris Lattner     if (dict)
489*30fdc8d8SChris Lattner         ::CFDictionaryReplaceValue (dict, key, value);
490*30fdc8d8SChris Lattner }
491*30fdc8d8SChris Lattner 
492