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