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
CFCMutableArray(CFMutableArrayRef s)13b9c1b51eSKate Stone CFCMutableArray::CFCMutableArray(CFMutableArrayRef s)
14b9c1b51eSKate Stone : CFCReleaser<CFMutableArrayRef>(s) {}
1530fdc8d8SChris Lattner
1630fdc8d8SChris Lattner // CFCMutableArray copy constructor
17*24f9a2f5SShafik Yaghmour CFCMutableArray::CFCMutableArray(const CFCMutableArray &rhs) =
18*24f9a2f5SShafik Yaghmour default; // NOTE: this won't make a copy of the
19b9c1b51eSKate Stone // array, just add a new reference to
20b9c1b51eSKate Stone // it
2130fdc8d8SChris Lattner
2230fdc8d8SChris Lattner // CFCMutableArray copy constructor
operator =(const CFCMutableArray & rhs)23b9c1b51eSKate Stone CFCMutableArray &CFCMutableArray::operator=(const CFCMutableArray &rhs) {
2430fdc8d8SChris Lattner if (this != &rhs)
25b9c1b51eSKate Stone *this = rhs; // NOTE: this operator won't make a copy of the array, just add
26b9c1b51eSKate Stone // a new reference to it
2730fdc8d8SChris Lattner return *this;
2830fdc8d8SChris Lattner }
2930fdc8d8SChris Lattner
3030fdc8d8SChris Lattner // Destructor
31fd2433e1SJonas Devlieghere CFCMutableArray::~CFCMutableArray() = default;
3230fdc8d8SChris Lattner
GetCount() const33b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCount() const {
3430fdc8d8SChris Lattner CFMutableArrayRef array = get();
3530fdc8d8SChris Lattner if (array)
3630fdc8d8SChris Lattner return ::CFArrayGetCount(array);
3730fdc8d8SChris Lattner return 0;
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner
GetCountOfValue(CFRange range,const void * value) const40b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(CFRange range,
41b9c1b51eSKate Stone const void *value) const {
4230fdc8d8SChris Lattner CFMutableArrayRef array = get();
4330fdc8d8SChris Lattner if (array)
4430fdc8d8SChris Lattner return ::CFArrayGetCountOfValue(array, range, value);
4530fdc8d8SChris Lattner return 0;
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner
GetCountOfValue(const void * value) const48b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(const void *value) const {
4930fdc8d8SChris Lattner CFMutableArrayRef array = get();
5030fdc8d8SChris Lattner if (array)
5130fdc8d8SChris Lattner return ::CFArrayGetCountOfValue(array, CFRangeMake(0, GetCount()), value);
5230fdc8d8SChris Lattner return 0;
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner
GetValueAtIndex(CFIndex idx) const55b9c1b51eSKate Stone const void *CFCMutableArray::GetValueAtIndex(CFIndex idx) const {
5630fdc8d8SChris Lattner CFMutableArrayRef array = get();
57b9c1b51eSKate Stone if (array) {
5830fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount(array);
59b9c1b51eSKate Stone if (0 <= idx && idx < num_array_items) {
6030fdc8d8SChris Lattner return ::CFArrayGetValueAtIndex(array, idx);
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner return NULL;
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner
SetValueAtIndex(CFIndex idx,const void * value)66b9c1b51eSKate Stone bool CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value) {
6730fdc8d8SChris Lattner CFMutableArrayRef array = get();
68b9c1b51eSKate Stone if (array != NULL) {
6930fdc8d8SChris Lattner const CFIndex num_array_items = ::CFArrayGetCount(array);
70b9c1b51eSKate Stone if (0 <= idx && idx < num_array_items) {
7130fdc8d8SChris Lattner ::CFArraySetValueAtIndex(array, idx, value);
7230fdc8d8SChris Lattner return true;
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner return false;
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner
AppendValue(const void * value,bool can_create)78b9c1b51eSKate Stone bool CFCMutableArray::AppendValue(const void *value, bool can_create) {
7930fdc8d8SChris Lattner CFMutableArrayRef array = get();
80b9c1b51eSKate Stone if (array == NULL) {
81a6682a41SJonas Devlieghere if (!can_create)
8230fdc8d8SChris Lattner return false;
83b9c1b51eSKate Stone array =
84b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
8530fdc8d8SChris Lattner reset(array);
8630fdc8d8SChris Lattner }
87b9c1b51eSKate Stone if (array != NULL) {
8830fdc8d8SChris Lattner ::CFArrayAppendValue(array, value);
8930fdc8d8SChris Lattner return true;
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner return false;
9230fdc8d8SChris Lattner }
93dd36defdSGreg Clayton
AppendCStringAsCFString(const char * s,CFStringEncoding encoding,bool can_create)94b9c1b51eSKate Stone bool CFCMutableArray::AppendCStringAsCFString(const char *s,
95b9c1b51eSKate Stone CFStringEncoding encoding,
96b9c1b51eSKate Stone bool can_create) {
97dd36defdSGreg Clayton CFMutableArrayRef array = get();
98b9c1b51eSKate Stone if (array == NULL) {
99a6682a41SJonas Devlieghere if (!can_create)
100dd36defdSGreg Clayton return false;
101b9c1b51eSKate Stone array =
102b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
103dd36defdSGreg Clayton reset(array);
104dd36defdSGreg Clayton }
105b9c1b51eSKate Stone if (array != NULL) {
106dd36defdSGreg Clayton CFCString cf_str(s, encoding);
107dd36defdSGreg Clayton ::CFArrayAppendValue(array, cf_str.get());
108dd36defdSGreg Clayton return true;
109dd36defdSGreg Clayton }
110dd36defdSGreg Clayton return false;
111dd36defdSGreg Clayton }
112dd36defdSGreg Clayton
AppendFileSystemRepresentationAsCFString(const char * s,bool can_create)113b9c1b51eSKate Stone bool CFCMutableArray::AppendFileSystemRepresentationAsCFString(
114b9c1b51eSKate Stone const char *s, bool can_create) {
115dd36defdSGreg Clayton CFMutableArrayRef array = get();
116b9c1b51eSKate Stone if (array == NULL) {
117a6682a41SJonas Devlieghere if (!can_create)
118dd36defdSGreg Clayton return false;
119b9c1b51eSKate Stone array =
120b9c1b51eSKate Stone ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
121dd36defdSGreg Clayton reset(array);
122dd36defdSGreg Clayton }
123b9c1b51eSKate Stone if (array != NULL) {
124dd36defdSGreg Clayton CFCString cf_path;
125dd36defdSGreg Clayton cf_path.SetFileSystemRepresentation(s);
126dd36defdSGreg Clayton ::CFArrayAppendValue(array, cf_path.get());
127dd36defdSGreg Clayton return true;
128dd36defdSGreg Clayton }
129dd36defdSGreg Clayton return false;
130dd36defdSGreg Clayton }
131