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