130fdc8d8SChris Lattner //===-- CFCMutableArray.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 "CFCMutableArray.h" 10dd36defdSGreg Clayton #include "CFCString.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner //---------------------------------------------------------------------- 1330fdc8d8SChris Lattner // CFCString constructor 1430fdc8d8SChris Lattner //---------------------------------------------------------------------- 15b9c1b51eSKate Stone CFCMutableArray::CFCMutableArray(CFMutableArrayRef s) 16b9c1b51eSKate Stone : CFCReleaser<CFMutableArrayRef>(s) {} 1730fdc8d8SChris Lattner 1830fdc8d8SChris Lattner //---------------------------------------------------------------------- 1930fdc8d8SChris Lattner // CFCMutableArray copy constructor 2030fdc8d8SChris Lattner //---------------------------------------------------------------------- 21b9c1b51eSKate Stone CFCMutableArray::CFCMutableArray(const CFCMutableArray &rhs) 22b9c1b51eSKate Stone : CFCReleaser<CFMutableArrayRef>(rhs) // NOTE: this won't make a copy of the 23b9c1b51eSKate Stone // array, just add a new reference to 24b9c1b51eSKate Stone // it 25b9c1b51eSKate Stone {} 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner //---------------------------------------------------------------------- 2830fdc8d8SChris Lattner // CFCMutableArray copy constructor 2930fdc8d8SChris Lattner //---------------------------------------------------------------------- 30b9c1b51eSKate Stone CFCMutableArray &CFCMutableArray::operator=(const CFCMutableArray &rhs) { 3130fdc8d8SChris Lattner if (this != &rhs) 32b9c1b51eSKate Stone *this = rhs; // NOTE: this operator won't make a copy of the array, just add 33b9c1b51eSKate Stone // a new reference to it 3430fdc8d8SChris Lattner return *this; 3530fdc8d8SChris Lattner } 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner //---------------------------------------------------------------------- 3830fdc8d8SChris Lattner // Destructor 3930fdc8d8SChris Lattner //---------------------------------------------------------------------- 40b9c1b51eSKate Stone CFCMutableArray::~CFCMutableArray() {} 4130fdc8d8SChris Lattner 42b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCount() const { 4330fdc8d8SChris Lattner CFMutableArrayRef array = get(); 4430fdc8d8SChris Lattner if (array) 4530fdc8d8SChris Lattner return ::CFArrayGetCount(array); 4630fdc8d8SChris Lattner return 0; 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 49b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(CFRange range, 50b9c1b51eSKate Stone const void *value) const { 5130fdc8d8SChris Lattner CFMutableArrayRef array = get(); 5230fdc8d8SChris Lattner if (array) 5330fdc8d8SChris Lattner return ::CFArrayGetCountOfValue(array, range, value); 5430fdc8d8SChris Lattner return 0; 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 57b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(const void *value) const { 5830fdc8d8SChris Lattner CFMutableArrayRef array = get(); 5930fdc8d8SChris Lattner if (array) 6030fdc8d8SChris Lattner return ::CFArrayGetCountOfValue(array, CFRangeMake(0, GetCount()), value); 6130fdc8d8SChris Lattner return 0; 6230fdc8d8SChris Lattner } 6330fdc8d8SChris Lattner 64b9c1b51eSKate Stone const void *CFCMutableArray::GetValueAtIndex(CFIndex idx) const { 6530fdc8d8SChris Lattner CFMutableArrayRef array = get(); 66b9c1b51eSKate Stone if (array) { 6730fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount(array); 68b9c1b51eSKate Stone if (0 <= idx && idx < num_array_items) { 6930fdc8d8SChris Lattner return ::CFArrayGetValueAtIndex(array, idx); 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner return NULL; 7330fdc8d8SChris Lattner } 7430fdc8d8SChris Lattner 75b9c1b51eSKate Stone bool CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value) { 7630fdc8d8SChris Lattner CFMutableArrayRef array = get(); 77b9c1b51eSKate Stone if (array != NULL) { 7830fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount(array); 79b9c1b51eSKate Stone if (0 <= idx && idx < num_array_items) { 8030fdc8d8SChris Lattner ::CFArraySetValueAtIndex(array, idx, value); 8130fdc8d8SChris Lattner return true; 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner return false; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 87b9c1b51eSKate Stone bool CFCMutableArray::AppendValue(const void *value, bool can_create) { 8830fdc8d8SChris Lattner CFMutableArrayRef array = get(); 89b9c1b51eSKate Stone if (array == NULL) { 90a6682a41SJonas Devlieghere if (!can_create) 9130fdc8d8SChris Lattner return false; 92b9c1b51eSKate Stone array = 93b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 9430fdc8d8SChris Lattner reset(array); 9530fdc8d8SChris Lattner } 96b9c1b51eSKate Stone if (array != NULL) { 9730fdc8d8SChris Lattner ::CFArrayAppendValue(array, value); 9830fdc8d8SChris Lattner return true; 9930fdc8d8SChris Lattner } 10030fdc8d8SChris Lattner return false; 10130fdc8d8SChris Lattner } 102dd36defdSGreg Clayton 103b9c1b51eSKate Stone bool CFCMutableArray::AppendCStringAsCFString(const char *s, 104b9c1b51eSKate Stone CFStringEncoding encoding, 105b9c1b51eSKate Stone bool can_create) { 106dd36defdSGreg Clayton CFMutableArrayRef array = get(); 107b9c1b51eSKate Stone if (array == NULL) { 108a6682a41SJonas Devlieghere if (!can_create) 109dd36defdSGreg Clayton return false; 110b9c1b51eSKate Stone array = 111b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 112dd36defdSGreg Clayton reset(array); 113dd36defdSGreg Clayton } 114b9c1b51eSKate Stone if (array != NULL) { 115dd36defdSGreg Clayton CFCString cf_str(s, encoding); 116dd36defdSGreg Clayton ::CFArrayAppendValue(array, cf_str.get()); 117dd36defdSGreg Clayton return true; 118dd36defdSGreg Clayton } 119dd36defdSGreg Clayton return false; 120dd36defdSGreg Clayton } 121dd36defdSGreg Clayton 122b9c1b51eSKate Stone bool CFCMutableArray::AppendFileSystemRepresentationAsCFString( 123b9c1b51eSKate Stone const char *s, bool can_create) { 124dd36defdSGreg Clayton CFMutableArrayRef array = get(); 125b9c1b51eSKate Stone if (array == NULL) { 126a6682a41SJonas Devlieghere if (!can_create) 127dd36defdSGreg Clayton return false; 128b9c1b51eSKate Stone array = 129b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); 130dd36defdSGreg Clayton reset(array); 131dd36defdSGreg Clayton } 132b9c1b51eSKate Stone if (array != NULL) { 133dd36defdSGreg Clayton CFCString cf_path; 134dd36defdSGreg Clayton cf_path.SetFileSystemRepresentation(s); 135dd36defdSGreg Clayton ::CFArrayAppendValue(array, cf_path.get()); 136dd36defdSGreg Clayton return true; 137dd36defdSGreg Clayton } 138dd36defdSGreg Clayton return false; 139dd36defdSGreg Clayton } 140