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