180814287SRaphael Isemann //===-- CFCMutableArray.cpp -----------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "CFCMutableArray.h" 10dd36defdSGreg Clayton #include "CFCString.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner // CFCString constructor 13b9c1b51eSKate Stone CFCMutableArray::CFCMutableArray(CFMutableArrayRef s) 14b9c1b51eSKate Stone : CFCReleaser<CFMutableArrayRef>(s) {} 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner // CFCMutableArray copy constructor 17b9c1b51eSKate Stone CFCMutableArray::CFCMutableArray(const CFCMutableArray &rhs) 18b9c1b51eSKate Stone : CFCReleaser<CFMutableArrayRef>(rhs) // NOTE: this won't make a copy of the 19b9c1b51eSKate Stone // array, just add a new reference to 20b9c1b51eSKate Stone // it 21b9c1b51eSKate Stone {} 2230fdc8d8SChris Lattner 2330fdc8d8SChris Lattner // CFCMutableArray copy constructor 24b9c1b51eSKate Stone CFCMutableArray &CFCMutableArray::operator=(const CFCMutableArray &rhs) { 2530fdc8d8SChris Lattner if (this != &rhs) 26b9c1b51eSKate Stone *this = rhs; // NOTE: this operator won't make a copy of the array, just add 27b9c1b51eSKate Stone // a new reference to it 2830fdc8d8SChris Lattner return *this; 2930fdc8d8SChris Lattner } 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner // Destructor 32*fd2433e1SJonas Devlieghere CFCMutableArray::~CFCMutableArray() = default; 3330fdc8d8SChris Lattner 34b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCount() const { 3530fdc8d8SChris Lattner CFMutableArrayRef array = get(); 3630fdc8d8SChris Lattner if (array) 3730fdc8d8SChris Lattner return ::CFArrayGetCount(array); 3830fdc8d8SChris Lattner return 0; 3930fdc8d8SChris Lattner } 4030fdc8d8SChris Lattner 41b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(CFRange range, 42b9c1b51eSKate Stone const void *value) const { 4330fdc8d8SChris Lattner CFMutableArrayRef array = get(); 4430fdc8d8SChris Lattner if (array) 4530fdc8d8SChris Lattner return ::CFArrayGetCountOfValue(array, range, value); 4630fdc8d8SChris Lattner return 0; 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 49b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(const void *value) const { 5030fdc8d8SChris Lattner CFMutableArrayRef array = get(); 5130fdc8d8SChris Lattner if (array) 5230fdc8d8SChris Lattner return ::CFArrayGetCountOfValue(array, CFRangeMake(0, GetCount()), value); 5330fdc8d8SChris Lattner return 0; 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 56b9c1b51eSKate Stone const void *CFCMutableArray::GetValueAtIndex(CFIndex idx) const { 5730fdc8d8SChris Lattner CFMutableArrayRef array = get(); 58b9c1b51eSKate Stone if (array) { 5930fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount(array); 60b9c1b51eSKate Stone if (0 <= idx && idx < num_array_items) { 6130fdc8d8SChris Lattner return ::CFArrayGetValueAtIndex(array, idx); 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner return NULL; 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 67b9c1b51eSKate Stone bool CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value) { 6830fdc8d8SChris Lattner CFMutableArrayRef array = get(); 69b9c1b51eSKate Stone if (array != NULL) { 7030fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount(array); 71b9c1b51eSKate Stone if (0 <= idx && idx < num_array_items) { 7230fdc8d8SChris Lattner ::CFArraySetValueAtIndex(array, idx, value); 7330fdc8d8SChris Lattner return true; 7430fdc8d8SChris Lattner } 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner return false; 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 79b9c1b51eSKate Stone bool CFCMutableArray::AppendValue(const void *value, bool can_create) { 8030fdc8d8SChris Lattner CFMutableArrayRef array = get(); 81b9c1b51eSKate Stone if (array == NULL) { 82a6682a41SJonas Devlieghere if (!can_create) 8330fdc8d8SChris Lattner return false; 84b9c1b51eSKate Stone array = 85b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 8630fdc8d8SChris Lattner reset(array); 8730fdc8d8SChris Lattner } 88b9c1b51eSKate Stone if (array != NULL) { 8930fdc8d8SChris Lattner ::CFArrayAppendValue(array, value); 9030fdc8d8SChris Lattner return true; 9130fdc8d8SChris Lattner } 9230fdc8d8SChris Lattner return false; 9330fdc8d8SChris Lattner } 94dd36defdSGreg Clayton 95b9c1b51eSKate Stone bool CFCMutableArray::AppendCStringAsCFString(const char *s, 96b9c1b51eSKate Stone CFStringEncoding encoding, 97b9c1b51eSKate Stone bool can_create) { 98dd36defdSGreg Clayton CFMutableArrayRef array = get(); 99b9c1b51eSKate Stone if (array == NULL) { 100a6682a41SJonas Devlieghere if (!can_create) 101dd36defdSGreg Clayton return false; 102b9c1b51eSKate Stone array = 103b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 104dd36defdSGreg Clayton reset(array); 105dd36defdSGreg Clayton } 106b9c1b51eSKate Stone if (array != NULL) { 107dd36defdSGreg Clayton CFCString cf_str(s, encoding); 108dd36defdSGreg Clayton ::CFArrayAppendValue(array, cf_str.get()); 109dd36defdSGreg Clayton return true; 110dd36defdSGreg Clayton } 111dd36defdSGreg Clayton return false; 112dd36defdSGreg Clayton } 113dd36defdSGreg Clayton 114b9c1b51eSKate Stone bool CFCMutableArray::AppendFileSystemRepresentationAsCFString( 115b9c1b51eSKate Stone const char *s, bool can_create) { 116dd36defdSGreg Clayton CFMutableArrayRef array = get(); 117b9c1b51eSKate Stone if (array == NULL) { 118a6682a41SJonas Devlieghere if (!can_create) 119dd36defdSGreg Clayton return false; 120b9c1b51eSKate Stone array = 121b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 122dd36defdSGreg Clayton reset(array); 123dd36defdSGreg Clayton } 124b9c1b51eSKate Stone if (array != NULL) { 125dd36defdSGreg Clayton CFCString cf_path; 126dd36defdSGreg Clayton cf_path.SetFileSystemRepresentation(s); 127dd36defdSGreg Clayton ::CFArrayAppendValue(array, cf_path.get()); 128dd36defdSGreg Clayton return true; 129dd36defdSGreg Clayton } 130dd36defdSGreg Clayton return false; 131dd36defdSGreg Clayton } 132