1*30fdc8d8SChris Lattner //===-- CFCMutableArray.cpp -------------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "CFCMutableArray.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner //----------------------------------------------------------------------
13*30fdc8d8SChris Lattner // CFCString constructor
14*30fdc8d8SChris Lattner //----------------------------------------------------------------------
15*30fdc8d8SChris Lattner CFCMutableArray::CFCMutableArray(CFMutableArrayRef s) :
16*30fdc8d8SChris Lattner     CFCReleaser<CFMutableArrayRef> (s)
17*30fdc8d8SChris Lattner {
18*30fdc8d8SChris Lattner }
19*30fdc8d8SChris Lattner 
20*30fdc8d8SChris Lattner //----------------------------------------------------------------------
21*30fdc8d8SChris Lattner // CFCMutableArray copy constructor
22*30fdc8d8SChris Lattner //----------------------------------------------------------------------
23*30fdc8d8SChris Lattner CFCMutableArray::CFCMutableArray(const CFCMutableArray& rhs) :
24*30fdc8d8SChris Lattner     CFCReleaser<CFMutableArrayRef> (rhs)    // NOTE: this won't make a copy of the array, just add a new reference to it
25*30fdc8d8SChris Lattner {
26*30fdc8d8SChris Lattner }
27*30fdc8d8SChris Lattner 
28*30fdc8d8SChris Lattner //----------------------------------------------------------------------
29*30fdc8d8SChris Lattner // CFCMutableArray copy constructor
30*30fdc8d8SChris Lattner //----------------------------------------------------------------------
31*30fdc8d8SChris Lattner CFCMutableArray&
32*30fdc8d8SChris Lattner CFCMutableArray::operator=(const CFCMutableArray& rhs)
33*30fdc8d8SChris Lattner {
34*30fdc8d8SChris Lattner     if (this != &rhs)
35*30fdc8d8SChris Lattner         *this = rhs;    // NOTE: this operator won't make a copy of the array, just add a new reference to it
36*30fdc8d8SChris Lattner     return *this;
37*30fdc8d8SChris Lattner }
38*30fdc8d8SChris Lattner 
39*30fdc8d8SChris Lattner //----------------------------------------------------------------------
40*30fdc8d8SChris Lattner // Destructor
41*30fdc8d8SChris Lattner //----------------------------------------------------------------------
42*30fdc8d8SChris Lattner CFCMutableArray::~CFCMutableArray()
43*30fdc8d8SChris Lattner {
44*30fdc8d8SChris Lattner }
45*30fdc8d8SChris Lattner 
46*30fdc8d8SChris Lattner 
47*30fdc8d8SChris Lattner CFIndex
48*30fdc8d8SChris Lattner CFCMutableArray::GetCount() const
49*30fdc8d8SChris Lattner {
50*30fdc8d8SChris Lattner     CFMutableArrayRef array = get();
51*30fdc8d8SChris Lattner     if (array)
52*30fdc8d8SChris Lattner         return ::CFArrayGetCount (array);
53*30fdc8d8SChris Lattner     return 0;
54*30fdc8d8SChris Lattner }
55*30fdc8d8SChris Lattner 
56*30fdc8d8SChris Lattner CFIndex
57*30fdc8d8SChris Lattner CFCMutableArray::GetCountOfValue(CFRange range, const void *value) const
58*30fdc8d8SChris Lattner {
59*30fdc8d8SChris Lattner     CFMutableArrayRef array = get();
60*30fdc8d8SChris Lattner     if (array)
61*30fdc8d8SChris Lattner         return ::CFArrayGetCountOfValue (array, range, value);
62*30fdc8d8SChris Lattner     return 0;
63*30fdc8d8SChris Lattner }
64*30fdc8d8SChris Lattner 
65*30fdc8d8SChris Lattner CFIndex
66*30fdc8d8SChris Lattner CFCMutableArray::GetCountOfValue(const void *value) const
67*30fdc8d8SChris Lattner {
68*30fdc8d8SChris Lattner     CFMutableArrayRef array = get();
69*30fdc8d8SChris Lattner     if (array)
70*30fdc8d8SChris Lattner         return ::CFArrayGetCountOfValue (array, CFRangeMake(0, GetCount()), value);
71*30fdc8d8SChris Lattner     return 0;
72*30fdc8d8SChris Lattner }
73*30fdc8d8SChris Lattner 
74*30fdc8d8SChris Lattner const void *
75*30fdc8d8SChris Lattner CFCMutableArray::GetValueAtIndex(CFIndex idx) const
76*30fdc8d8SChris Lattner {
77*30fdc8d8SChris Lattner     CFMutableArrayRef array = get();
78*30fdc8d8SChris Lattner     if (array)
79*30fdc8d8SChris Lattner     {
80*30fdc8d8SChris Lattner         const CFIndex num_array_items = ::CFArrayGetCount (array);
81*30fdc8d8SChris Lattner         if (0 <= idx && idx < num_array_items)
82*30fdc8d8SChris Lattner         {
83*30fdc8d8SChris Lattner             return ::CFArrayGetValueAtIndex (array, idx);
84*30fdc8d8SChris Lattner         }
85*30fdc8d8SChris Lattner     }
86*30fdc8d8SChris Lattner     return NULL;
87*30fdc8d8SChris Lattner }
88*30fdc8d8SChris Lattner 
89*30fdc8d8SChris Lattner bool
90*30fdc8d8SChris Lattner CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value)
91*30fdc8d8SChris Lattner {
92*30fdc8d8SChris Lattner     CFMutableArrayRef array = get();
93*30fdc8d8SChris Lattner     if (array != NULL)
94*30fdc8d8SChris Lattner     {
95*30fdc8d8SChris Lattner         const CFIndex num_array_items = ::CFArrayGetCount (array);
96*30fdc8d8SChris Lattner         if (0 <= idx && idx < num_array_items)
97*30fdc8d8SChris Lattner         {
98*30fdc8d8SChris Lattner             ::CFArraySetValueAtIndex (array, idx, value);
99*30fdc8d8SChris Lattner             return true;
100*30fdc8d8SChris Lattner         }
101*30fdc8d8SChris Lattner     }
102*30fdc8d8SChris Lattner     return false;
103*30fdc8d8SChris Lattner }
104*30fdc8d8SChris Lattner 
105*30fdc8d8SChris Lattner 
106*30fdc8d8SChris Lattner bool
107*30fdc8d8SChris Lattner CFCMutableArray::AppendValue(const void *value, bool can_create)
108*30fdc8d8SChris Lattner {
109*30fdc8d8SChris Lattner     CFMutableArrayRef array = get();
110*30fdc8d8SChris Lattner     if (array == NULL)
111*30fdc8d8SChris Lattner     {
112*30fdc8d8SChris Lattner         if (can_create == false)
113*30fdc8d8SChris Lattner             return false;
114*30fdc8d8SChris Lattner         array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
115*30fdc8d8SChris Lattner         reset ( array );
116*30fdc8d8SChris Lattner     }
117*30fdc8d8SChris Lattner     if (array != NULL)
118*30fdc8d8SChris Lattner     {
119*30fdc8d8SChris Lattner         ::CFArrayAppendValue(array, value);
120*30fdc8d8SChris Lattner         return true;
121*30fdc8d8SChris Lattner     }
122*30fdc8d8SChris Lattner     return false;
123*30fdc8d8SChris Lattner }
124