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