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