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