forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			530 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			530 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- CFCMutableDictionary.cpp --------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "CFCMutableDictionary.h"
 | |
| #include "CFCString.h"
 | |
| //----------------------------------------------------------------------
 | |
| // CFCString constructor
 | |
| //----------------------------------------------------------------------
 | |
| CFCMutableDictionary::CFCMutableDictionary(CFMutableDictionaryRef s) :
 | |
|     CFCReleaser<CFMutableDictionaryRef> (s)
 | |
| {
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------
 | |
| // CFCMutableDictionary copy constructor
 | |
| //----------------------------------------------------------------------
 | |
| CFCMutableDictionary::CFCMutableDictionary(const CFCMutableDictionary& rhs) :
 | |
|     CFCReleaser<CFMutableDictionaryRef> (rhs)
 | |
| {
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------
 | |
| // CFCMutableDictionary copy constructor
 | |
| //----------------------------------------------------------------------
 | |
| const CFCMutableDictionary&
 | |
| CFCMutableDictionary::operator=(const CFCMutableDictionary& rhs)
 | |
| {
 | |
|     if (this != &rhs)
 | |
|         *this = rhs;
 | |
|     return *this;
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------
 | |
| // Destructor
 | |
| //----------------------------------------------------------------------
 | |
| CFCMutableDictionary::~CFCMutableDictionary()
 | |
| {
 | |
| }
 | |
| 
 | |
| 
 | |
| CFIndex
 | |
| CFCMutableDictionary::GetCount() const
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         return ::CFDictionaryGetCount (dict);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| CFIndex
 | |
| CFCMutableDictionary::GetCountOfKey(const void *key) const
 | |
| 
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         return ::CFDictionaryGetCountOfKey (dict, key);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| CFIndex
 | |
| CFCMutableDictionary::GetCountOfValue(const void *value) const
 | |
| 
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         return ::CFDictionaryGetCountOfValue (dict, value);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| void
 | |
| CFCMutableDictionary::GetKeysAndValues(const void **keys, const void **values) const
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         ::CFDictionaryGetKeysAndValues (dict, keys, values);
 | |
| }
 | |
| 
 | |
| 
 | |
| const void *
 | |
| CFCMutableDictionary::GetValue(const void *key) const
 | |
| 
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         return ::CFDictionaryGetValue (dict, key);
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| Boolean
 | |
| CFCMutableDictionary::GetValueIfPresent(const void *key, const void **value_handle) const
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         return ::CFDictionaryGetValueIfPresent (dict, key, value_handle);
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| CFMutableDictionaryRef
 | |
| CFCMutableDictionary::Dictionary(bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (can_create && dict == NULL)
 | |
|     {
 | |
|         dict = ::CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
 | |
|         reset ( dict );
 | |
|     }
 | |
|     return dict;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValue(CFStringRef key, const void *value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Let the dictionary own the CFNumber
 | |
|         ::CFDictionaryAddValue (dict, key, value);
 | |
|         return true;
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValue(CFStringRef key, const void *value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Let the dictionary own the CFNumber
 | |
|         ::CFDictionarySetValue (dict, key, value);
 | |
|         return true;
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueSInt8(CFStringRef key, int8_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt8Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueSInt8(CFStringRef key, int8_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt8Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueSInt16(CFStringRef key, int16_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueSInt16(CFStringRef key, int16_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueSInt32(CFStringRef key, int32_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueSInt32(CFStringRef key, int32_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueSInt64(CFStringRef key, int64_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueSInt64(CFStringRef key, int64_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueUInt8(CFStringRef key, uint8_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
 | |
|         int16_t sval = value;
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueUInt8(CFStringRef key, uint8_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
 | |
|         int16_t sval = value;
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt16Type, &sval));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueUInt16(CFStringRef key, uint16_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
 | |
|         int32_t sval = value;
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueUInt16(CFStringRef key, uint16_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
 | |
|         int32_t sval = value;
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt32Type, &sval));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueUInt32(CFStringRef key, uint32_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
 | |
|         int64_t sval = value;
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueUInt32(CFStringRef key, uint32_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // Have to promote to the next size type so things don't appear negative of the MSBit is set...
 | |
|         int64_t sval = value;
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &sval));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueUInt64(CFStringRef key, uint64_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
 | |
|         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueUInt64(CFStringRef key, uint64_t value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
 | |
|         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberSInt64Type, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueDouble(CFStringRef key, double value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
 | |
|         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberDoubleType, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueDouble(CFStringRef key, double value, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         // The number may appear negative if the MSBit is set in "value". Due to a limitation of
 | |
|         // CFNumber, there isn't a way to have it show up otherwise as of this writing.
 | |
|         CFCReleaser<CFNumberRef> cf_number(::CFNumberCreate (kCFAllocatorDefault, kCFNumberDoubleType, &value));
 | |
|         if (cf_number.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_number.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::AddValueCString(CFStringRef key, const char *cstr, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCString cf_str(cstr, kCFStringEncodingUTF8);
 | |
|         if (cf_str.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionaryAddValue (dict, key, cf_str.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool
 | |
| CFCMutableDictionary::SetValueCString(CFStringRef key, const char *cstr, bool can_create)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = Dictionary(can_create);
 | |
|     if (dict != NULL)
 | |
|     {
 | |
|         CFCString cf_str(cstr, kCFStringEncodingUTF8);
 | |
|         if (cf_str.get())
 | |
|         {
 | |
|             // Let the dictionary own the CFNumber
 | |
|             ::CFDictionarySetValue (dict, key, cf_str.get());
 | |
|             return true;
 | |
|         }
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| 
 | |
| void
 | |
| CFCMutableDictionary::RemoveAllValues()
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         ::CFDictionaryRemoveAllValues(dict);
 | |
| }
 | |
| 
 | |
| void
 | |
| CFCMutableDictionary::RemoveValue(const void *value)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         ::CFDictionaryRemoveValue(dict, value);
 | |
| }
 | |
| void
 | |
| CFCMutableDictionary::ReplaceValue(const void *key, const void *value)
 | |
| {
 | |
|     CFMutableDictionaryRef dict = get();
 | |
|     if (dict)
 | |
|         ::CFDictionaryReplaceValue (dict, key, value);
 | |
| }
 | |
| 
 |