130fdc8d8SChris Lattner //===-- CFCMutableArray.cpp -------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "CFCMutableArray.h"
11dd36defdSGreg Clayton #include "CFCString.h"
1230fdc8d8SChris Lattner 
1330fdc8d8SChris Lattner //----------------------------------------------------------------------
1430fdc8d8SChris Lattner // CFCString constructor
1530fdc8d8SChris Lattner //----------------------------------------------------------------------
16b9c1b51eSKate Stone CFCMutableArray::CFCMutableArray(CFMutableArrayRef s)
17b9c1b51eSKate Stone     : CFCReleaser<CFMutableArrayRef>(s) {}
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner //----------------------------------------------------------------------
2030fdc8d8SChris Lattner // CFCMutableArray copy constructor
2130fdc8d8SChris Lattner //----------------------------------------------------------------------
22b9c1b51eSKate Stone CFCMutableArray::CFCMutableArray(const CFCMutableArray &rhs)
23b9c1b51eSKate Stone     : CFCReleaser<CFMutableArrayRef>(rhs) // NOTE: this won't make a copy of the
24b9c1b51eSKate Stone                                           // array, just add a new reference to
25b9c1b51eSKate Stone                                           // it
26b9c1b51eSKate Stone {}
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner //----------------------------------------------------------------------
2930fdc8d8SChris Lattner // CFCMutableArray copy constructor
3030fdc8d8SChris Lattner //----------------------------------------------------------------------
31b9c1b51eSKate Stone CFCMutableArray &CFCMutableArray::operator=(const CFCMutableArray &rhs) {
3230fdc8d8SChris Lattner   if (this != &rhs)
33b9c1b51eSKate Stone     *this = rhs; // NOTE: this operator won't make a copy of the array, just add
34b9c1b51eSKate Stone                  // a new reference to it
3530fdc8d8SChris Lattner   return *this;
3630fdc8d8SChris Lattner }
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner //----------------------------------------------------------------------
3930fdc8d8SChris Lattner // Destructor
4030fdc8d8SChris Lattner //----------------------------------------------------------------------
41b9c1b51eSKate Stone CFCMutableArray::~CFCMutableArray() {}
4230fdc8d8SChris Lattner 
43b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCount() const {
4430fdc8d8SChris Lattner   CFMutableArrayRef array = get();
4530fdc8d8SChris Lattner   if (array)
4630fdc8d8SChris Lattner     return ::CFArrayGetCount(array);
4730fdc8d8SChris Lattner   return 0;
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
50b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(CFRange range,
51b9c1b51eSKate Stone                                          const void *value) const {
5230fdc8d8SChris Lattner   CFMutableArrayRef array = get();
5330fdc8d8SChris Lattner   if (array)
5430fdc8d8SChris Lattner     return ::CFArrayGetCountOfValue(array, range, value);
5530fdc8d8SChris Lattner   return 0;
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner 
58b9c1b51eSKate Stone CFIndex CFCMutableArray::GetCountOfValue(const void *value) const {
5930fdc8d8SChris Lattner   CFMutableArrayRef array = get();
6030fdc8d8SChris Lattner   if (array)
6130fdc8d8SChris Lattner     return ::CFArrayGetCountOfValue(array, CFRangeMake(0, GetCount()), value);
6230fdc8d8SChris Lattner   return 0;
6330fdc8d8SChris Lattner }
6430fdc8d8SChris Lattner 
65b9c1b51eSKate Stone const void *CFCMutableArray::GetValueAtIndex(CFIndex idx) const {
6630fdc8d8SChris Lattner   CFMutableArrayRef array = get();
67b9c1b51eSKate Stone   if (array) {
6830fdc8d8SChris Lattner     const CFIndex num_array_items = ::CFArrayGetCount(array);
69b9c1b51eSKate Stone     if (0 <= idx && idx < num_array_items) {
7030fdc8d8SChris Lattner       return ::CFArrayGetValueAtIndex(array, idx);
7130fdc8d8SChris Lattner     }
7230fdc8d8SChris Lattner   }
7330fdc8d8SChris Lattner   return NULL;
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
76b9c1b51eSKate Stone bool CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value) {
7730fdc8d8SChris Lattner   CFMutableArrayRef array = get();
78b9c1b51eSKate Stone   if (array != NULL) {
7930fdc8d8SChris Lattner     const CFIndex num_array_items = ::CFArrayGetCount(array);
80b9c1b51eSKate Stone     if (0 <= idx && idx < num_array_items) {
8130fdc8d8SChris Lattner       ::CFArraySetValueAtIndex(array, idx, value);
8230fdc8d8SChris Lattner       return true;
8330fdc8d8SChris Lattner     }
8430fdc8d8SChris Lattner   }
8530fdc8d8SChris Lattner   return false;
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
88b9c1b51eSKate Stone bool CFCMutableArray::AppendValue(const void *value, bool can_create) {
8930fdc8d8SChris Lattner   CFMutableArrayRef array = get();
90b9c1b51eSKate Stone   if (array == NULL) {
91*a6682a41SJonas Devlieghere     if (!can_create)
9230fdc8d8SChris Lattner       return false;
93b9c1b51eSKate Stone     array =
94b9c1b51eSKate Stone         ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
9530fdc8d8SChris Lattner     reset(array);
9630fdc8d8SChris Lattner   }
97b9c1b51eSKate Stone   if (array != NULL) {
9830fdc8d8SChris Lattner     ::CFArrayAppendValue(array, value);
9930fdc8d8SChris Lattner     return true;
10030fdc8d8SChris Lattner   }
10130fdc8d8SChris Lattner   return false;
10230fdc8d8SChris Lattner }
103dd36defdSGreg Clayton 
104b9c1b51eSKate Stone bool CFCMutableArray::AppendCStringAsCFString(const char *s,
105b9c1b51eSKate Stone                                               CFStringEncoding encoding,
106b9c1b51eSKate Stone                                               bool can_create) {
107dd36defdSGreg Clayton   CFMutableArrayRef array = get();
108b9c1b51eSKate Stone   if (array == NULL) {
109*a6682a41SJonas Devlieghere     if (!can_create)
110dd36defdSGreg Clayton       return false;
111b9c1b51eSKate Stone     array =
112b9c1b51eSKate Stone         ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
113dd36defdSGreg Clayton     reset(array);
114dd36defdSGreg Clayton   }
115b9c1b51eSKate Stone   if (array != NULL) {
116dd36defdSGreg Clayton     CFCString cf_str(s, encoding);
117dd36defdSGreg Clayton     ::CFArrayAppendValue(array, cf_str.get());
118dd36defdSGreg Clayton     return true;
119dd36defdSGreg Clayton   }
120dd36defdSGreg Clayton   return false;
121dd36defdSGreg Clayton }
122dd36defdSGreg Clayton 
123b9c1b51eSKate Stone bool CFCMutableArray::AppendFileSystemRepresentationAsCFString(
124b9c1b51eSKate Stone     const char *s, bool can_create) {
125dd36defdSGreg Clayton   CFMutableArrayRef array = get();
126b9c1b51eSKate Stone   if (array == NULL) {
127*a6682a41SJonas Devlieghere     if (!can_create)
128dd36defdSGreg Clayton       return false;
129b9c1b51eSKate Stone     array =
130b9c1b51eSKate Stone         ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
131dd36defdSGreg Clayton     reset(array);
132dd36defdSGreg Clayton   }
133b9c1b51eSKate Stone   if (array != NULL) {
134dd36defdSGreg Clayton     CFCString cf_path;
135dd36defdSGreg Clayton     cf_path.SetFileSystemRepresentation(s);
136dd36defdSGreg Clayton     ::CFArrayAppendValue(array, cf_path.get());
137dd36defdSGreg Clayton     return true;
138dd36defdSGreg Clayton   }
139dd36defdSGreg Clayton   return false;
140dd36defdSGreg Clayton }
141