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"
11*dd36defdSGreg Clayton #include "CFCString.h"
1230fdc8d8SChris Lattner 
1330fdc8d8SChris Lattner //----------------------------------------------------------------------
1430fdc8d8SChris Lattner // CFCString constructor
1530fdc8d8SChris Lattner //----------------------------------------------------------------------
1630fdc8d8SChris Lattner CFCMutableArray::CFCMutableArray(CFMutableArrayRef s) :
1730fdc8d8SChris Lattner     CFCReleaser<CFMutableArrayRef> (s)
1830fdc8d8SChris Lattner {
1930fdc8d8SChris Lattner }
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner //----------------------------------------------------------------------
2230fdc8d8SChris Lattner // CFCMutableArray copy constructor
2330fdc8d8SChris Lattner //----------------------------------------------------------------------
2430fdc8d8SChris Lattner CFCMutableArray::CFCMutableArray(const CFCMutableArray& rhs) :
2530fdc8d8SChris Lattner     CFCReleaser<CFMutableArrayRef> (rhs)    // NOTE: this won't make a copy of the array, just add a new reference to it
2630fdc8d8SChris Lattner {
2730fdc8d8SChris Lattner }
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner //----------------------------------------------------------------------
3030fdc8d8SChris Lattner // CFCMutableArray copy constructor
3130fdc8d8SChris Lattner //----------------------------------------------------------------------
3230fdc8d8SChris Lattner CFCMutableArray&
3330fdc8d8SChris Lattner CFCMutableArray::operator=(const CFCMutableArray& rhs)
3430fdc8d8SChris Lattner {
3530fdc8d8SChris Lattner     if (this != &rhs)
3630fdc8d8SChris Lattner         *this = rhs;    // NOTE: this operator won't make a copy of the array, just add a new reference to it
3730fdc8d8SChris Lattner     return *this;
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner //----------------------------------------------------------------------
4130fdc8d8SChris Lattner // Destructor
4230fdc8d8SChris Lattner //----------------------------------------------------------------------
4330fdc8d8SChris Lattner CFCMutableArray::~CFCMutableArray()
4430fdc8d8SChris Lattner {
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner CFIndex
4930fdc8d8SChris Lattner CFCMutableArray::GetCount() const
5030fdc8d8SChris Lattner {
5130fdc8d8SChris Lattner     CFMutableArrayRef array = get();
5230fdc8d8SChris Lattner     if (array)
5330fdc8d8SChris Lattner         return ::CFArrayGetCount (array);
5430fdc8d8SChris Lattner     return 0;
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner CFIndex
5830fdc8d8SChris Lattner CFCMutableArray::GetCountOfValue(CFRange range, const void *value) const
5930fdc8d8SChris Lattner {
6030fdc8d8SChris Lattner     CFMutableArrayRef array = get();
6130fdc8d8SChris Lattner     if (array)
6230fdc8d8SChris Lattner         return ::CFArrayGetCountOfValue (array, range, value);
6330fdc8d8SChris Lattner     return 0;
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner CFIndex
6730fdc8d8SChris Lattner CFCMutableArray::GetCountOfValue(const void *value) const
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner     CFMutableArrayRef array = get();
7030fdc8d8SChris Lattner     if (array)
7130fdc8d8SChris Lattner         return ::CFArrayGetCountOfValue (array, CFRangeMake(0, GetCount()), value);
7230fdc8d8SChris Lattner     return 0;
7330fdc8d8SChris Lattner }
7430fdc8d8SChris Lattner 
7530fdc8d8SChris Lattner const void *
7630fdc8d8SChris Lattner CFCMutableArray::GetValueAtIndex(CFIndex idx) const
7730fdc8d8SChris Lattner {
7830fdc8d8SChris Lattner     CFMutableArrayRef array = get();
7930fdc8d8SChris Lattner     if (array)
8030fdc8d8SChris Lattner     {
8130fdc8d8SChris Lattner         const CFIndex num_array_items = ::CFArrayGetCount (array);
8230fdc8d8SChris Lattner         if (0 <= idx && idx < num_array_items)
8330fdc8d8SChris Lattner         {
8430fdc8d8SChris Lattner             return ::CFArrayGetValueAtIndex (array, idx);
8530fdc8d8SChris Lattner         }
8630fdc8d8SChris Lattner     }
8730fdc8d8SChris Lattner     return NULL;
8830fdc8d8SChris Lattner }
8930fdc8d8SChris Lattner 
9030fdc8d8SChris Lattner bool
9130fdc8d8SChris Lattner CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value)
9230fdc8d8SChris Lattner {
9330fdc8d8SChris Lattner     CFMutableArrayRef array = get();
9430fdc8d8SChris Lattner     if (array != NULL)
9530fdc8d8SChris Lattner     {
9630fdc8d8SChris Lattner         const CFIndex num_array_items = ::CFArrayGetCount (array);
9730fdc8d8SChris Lattner         if (0 <= idx && idx < num_array_items)
9830fdc8d8SChris Lattner         {
9930fdc8d8SChris Lattner             ::CFArraySetValueAtIndex (array, idx, value);
10030fdc8d8SChris Lattner             return true;
10130fdc8d8SChris Lattner         }
10230fdc8d8SChris Lattner     }
10330fdc8d8SChris Lattner     return false;
10430fdc8d8SChris Lattner }
10530fdc8d8SChris Lattner 
10630fdc8d8SChris Lattner 
10730fdc8d8SChris Lattner bool
10830fdc8d8SChris Lattner CFCMutableArray::AppendValue(const void *value, bool can_create)
10930fdc8d8SChris Lattner {
11030fdc8d8SChris Lattner     CFMutableArrayRef array = get();
11130fdc8d8SChris Lattner     if (array == NULL)
11230fdc8d8SChris Lattner     {
11330fdc8d8SChris Lattner         if (can_create == false)
11430fdc8d8SChris Lattner             return false;
11530fdc8d8SChris Lattner         array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
11630fdc8d8SChris Lattner         reset ( array );
11730fdc8d8SChris Lattner     }
11830fdc8d8SChris Lattner     if (array != NULL)
11930fdc8d8SChris Lattner     {
12030fdc8d8SChris Lattner         ::CFArrayAppendValue(array, value);
12130fdc8d8SChris Lattner         return true;
12230fdc8d8SChris Lattner     }
12330fdc8d8SChris Lattner     return false;
12430fdc8d8SChris Lattner }
125*dd36defdSGreg Clayton 
126*dd36defdSGreg Clayton 
127*dd36defdSGreg Clayton bool
128*dd36defdSGreg Clayton CFCMutableArray::AppendCStringAsCFString (const char *s, CFStringEncoding encoding, bool can_create)
129*dd36defdSGreg Clayton {
130*dd36defdSGreg Clayton     CFMutableArrayRef array = get();
131*dd36defdSGreg Clayton     if (array == NULL)
132*dd36defdSGreg Clayton     {
133*dd36defdSGreg Clayton         if (can_create == false)
134*dd36defdSGreg Clayton             return false;
135*dd36defdSGreg Clayton         array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
136*dd36defdSGreg Clayton         reset ( array );
137*dd36defdSGreg Clayton     }
138*dd36defdSGreg Clayton     if (array != NULL)
139*dd36defdSGreg Clayton     {
140*dd36defdSGreg Clayton         CFCString cf_str (s, encoding);
141*dd36defdSGreg Clayton         ::CFArrayAppendValue (array, cf_str.get());
142*dd36defdSGreg Clayton         return true;
143*dd36defdSGreg Clayton     }
144*dd36defdSGreg Clayton     return false;
145*dd36defdSGreg Clayton }
146*dd36defdSGreg Clayton 
147*dd36defdSGreg Clayton bool
148*dd36defdSGreg Clayton CFCMutableArray::AppendFileSystemRepresentationAsCFString (const char *s, bool can_create)
149*dd36defdSGreg Clayton {
150*dd36defdSGreg Clayton     CFMutableArrayRef array = get();
151*dd36defdSGreg Clayton     if (array == NULL)
152*dd36defdSGreg Clayton     {
153*dd36defdSGreg Clayton         if (can_create == false)
154*dd36defdSGreg Clayton             return false;
155*dd36defdSGreg Clayton         array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
156*dd36defdSGreg Clayton         reset ( array );
157*dd36defdSGreg Clayton     }
158*dd36defdSGreg Clayton     if (array != NULL)
159*dd36defdSGreg Clayton     {
160*dd36defdSGreg Clayton         CFCString cf_path;
161*dd36defdSGreg Clayton         cf_path.SetFileSystemRepresentation(s);
162*dd36defdSGreg Clayton         ::CFArrayAppendValue (array, cf_path.get());
163*dd36defdSGreg Clayton         return true;
164*dd36defdSGreg Clayton     }
165*dd36defdSGreg Clayton     return false;
166*dd36defdSGreg Clayton }
167