130fdc8d8SChris Lattner //===-- CFCMutableArray.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 "CFCMutableArray.h" 11*dd36defdSGreg Clayton #include "CFCString.h" 1230fdc8d8SChris Lattner 1330fdc8d8SChris Lattner //---------------------------------------------------------------------- 1430fdc8d8SChris Lattner // CFCString constructor 1530fdc8d8SChris Lattner //---------------------------------------------------------------------- 1630fdc8d8SChris Lattner CFCMutableArray::CFCMutableArray(CFMutableArrayRef s) : 1730fdc8d8SChris Lattner CFCReleaser<CFMutableArrayRef> (s) 1830fdc8d8SChris Lattner { 1930fdc8d8SChris Lattner } 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner //---------------------------------------------------------------------- 2230fdc8d8SChris Lattner // CFCMutableArray copy constructor 2330fdc8d8SChris Lattner //---------------------------------------------------------------------- 2430fdc8d8SChris Lattner CFCMutableArray::CFCMutableArray(const CFCMutableArray& rhs) : 2530fdc8d8SChris Lattner CFCReleaser<CFMutableArrayRef> (rhs) // NOTE: this won't make a copy of the array, just add a new reference to it 2630fdc8d8SChris Lattner { 2730fdc8d8SChris Lattner } 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner //---------------------------------------------------------------------- 3030fdc8d8SChris Lattner // CFCMutableArray copy constructor 3130fdc8d8SChris Lattner //---------------------------------------------------------------------- 3230fdc8d8SChris Lattner CFCMutableArray& 3330fdc8d8SChris Lattner CFCMutableArray::operator=(const CFCMutableArray& rhs) 3430fdc8d8SChris Lattner { 3530fdc8d8SChris Lattner if (this != &rhs) 3630fdc8d8SChris Lattner *this = rhs; // NOTE: this operator won't make a copy of the array, just add a new reference to it 3730fdc8d8SChris Lattner return *this; 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner //---------------------------------------------------------------------- 4130fdc8d8SChris Lattner // Destructor 4230fdc8d8SChris Lattner //---------------------------------------------------------------------- 4330fdc8d8SChris Lattner CFCMutableArray::~CFCMutableArray() 4430fdc8d8SChris Lattner { 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner CFIndex 4930fdc8d8SChris Lattner CFCMutableArray::GetCount() const 5030fdc8d8SChris Lattner { 5130fdc8d8SChris Lattner CFMutableArrayRef array = get(); 5230fdc8d8SChris Lattner if (array) 5330fdc8d8SChris Lattner return ::CFArrayGetCount (array); 5430fdc8d8SChris Lattner return 0; 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner CFIndex 5830fdc8d8SChris Lattner CFCMutableArray::GetCountOfValue(CFRange range, const void *value) const 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner CFMutableArrayRef array = get(); 6130fdc8d8SChris Lattner if (array) 6230fdc8d8SChris Lattner return ::CFArrayGetCountOfValue (array, range, value); 6330fdc8d8SChris Lattner return 0; 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner CFIndex 6730fdc8d8SChris Lattner CFCMutableArray::GetCountOfValue(const void *value) const 6830fdc8d8SChris Lattner { 6930fdc8d8SChris Lattner CFMutableArrayRef array = get(); 7030fdc8d8SChris Lattner if (array) 7130fdc8d8SChris Lattner return ::CFArrayGetCountOfValue (array, CFRangeMake(0, GetCount()), value); 7230fdc8d8SChris Lattner return 0; 7330fdc8d8SChris Lattner } 7430fdc8d8SChris Lattner 7530fdc8d8SChris Lattner const void * 7630fdc8d8SChris Lattner CFCMutableArray::GetValueAtIndex(CFIndex idx) const 7730fdc8d8SChris Lattner { 7830fdc8d8SChris Lattner CFMutableArrayRef array = get(); 7930fdc8d8SChris Lattner if (array) 8030fdc8d8SChris Lattner { 8130fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount (array); 8230fdc8d8SChris Lattner if (0 <= idx && idx < num_array_items) 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner return ::CFArrayGetValueAtIndex (array, idx); 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner } 8730fdc8d8SChris Lattner return NULL; 8830fdc8d8SChris Lattner } 8930fdc8d8SChris Lattner 9030fdc8d8SChris Lattner bool 9130fdc8d8SChris Lattner CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value) 9230fdc8d8SChris Lattner { 9330fdc8d8SChris Lattner CFMutableArrayRef array = get(); 9430fdc8d8SChris Lattner if (array != NULL) 9530fdc8d8SChris Lattner { 9630fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount (array); 9730fdc8d8SChris Lattner if (0 <= idx && idx < num_array_items) 9830fdc8d8SChris Lattner { 9930fdc8d8SChris Lattner ::CFArraySetValueAtIndex (array, idx, value); 10030fdc8d8SChris Lattner return true; 10130fdc8d8SChris Lattner } 10230fdc8d8SChris Lattner } 10330fdc8d8SChris Lattner return false; 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 10630fdc8d8SChris Lattner 10730fdc8d8SChris Lattner bool 10830fdc8d8SChris Lattner CFCMutableArray::AppendValue(const void *value, bool can_create) 10930fdc8d8SChris Lattner { 11030fdc8d8SChris Lattner CFMutableArrayRef array = get(); 11130fdc8d8SChris Lattner if (array == NULL) 11230fdc8d8SChris Lattner { 11330fdc8d8SChris Lattner if (can_create == false) 11430fdc8d8SChris Lattner return false; 11530fdc8d8SChris Lattner array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 11630fdc8d8SChris Lattner reset ( array ); 11730fdc8d8SChris Lattner } 11830fdc8d8SChris Lattner if (array != NULL) 11930fdc8d8SChris Lattner { 12030fdc8d8SChris Lattner ::CFArrayAppendValue(array, value); 12130fdc8d8SChris Lattner return true; 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner return false; 12430fdc8d8SChris Lattner } 125*dd36defdSGreg Clayton 126*dd36defdSGreg Clayton 127*dd36defdSGreg Clayton bool 128*dd36defdSGreg Clayton CFCMutableArray::AppendCStringAsCFString (const char *s, CFStringEncoding encoding, bool can_create) 129*dd36defdSGreg Clayton { 130*dd36defdSGreg Clayton CFMutableArrayRef array = get(); 131*dd36defdSGreg Clayton if (array == NULL) 132*dd36defdSGreg Clayton { 133*dd36defdSGreg Clayton if (can_create == false) 134*dd36defdSGreg Clayton return false; 135*dd36defdSGreg Clayton array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 136*dd36defdSGreg Clayton reset ( array ); 137*dd36defdSGreg Clayton } 138*dd36defdSGreg Clayton if (array != NULL) 139*dd36defdSGreg Clayton { 140*dd36defdSGreg Clayton CFCString cf_str (s, encoding); 141*dd36defdSGreg Clayton ::CFArrayAppendValue (array, cf_str.get()); 142*dd36defdSGreg Clayton return true; 143*dd36defdSGreg Clayton } 144*dd36defdSGreg Clayton return false; 145*dd36defdSGreg Clayton } 146*dd36defdSGreg Clayton 147*dd36defdSGreg Clayton bool 148*dd36defdSGreg Clayton CFCMutableArray::AppendFileSystemRepresentationAsCFString (const char *s, bool can_create) 149*dd36defdSGreg Clayton { 150*dd36defdSGreg Clayton CFMutableArrayRef array = get(); 151*dd36defdSGreg Clayton if (array == NULL) 152*dd36defdSGreg Clayton { 153*dd36defdSGreg Clayton if (can_create == false) 154*dd36defdSGreg Clayton return false; 155*dd36defdSGreg Clayton array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 156*dd36defdSGreg Clayton reset ( array ); 157*dd36defdSGreg Clayton } 158*dd36defdSGreg Clayton if (array != NULL) 159*dd36defdSGreg Clayton { 160*dd36defdSGreg Clayton CFCString cf_path; 161*dd36defdSGreg Clayton cf_path.SetFileSystemRepresentation(s); 162*dd36defdSGreg Clayton ::CFArrayAppendValue (array, cf_path.get()); 163*dd36defdSGreg Clayton return true; 164*dd36defdSGreg Clayton } 165*dd36defdSGreg Clayton return false; 166*dd36defdSGreg Clayton } 167