Home | History | Annotate | Download | only in cfcpp
      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 //----------------------------------------------------------------------
     16 CFCMutableArray::CFCMutableArray(CFMutableArrayRef s) :
     17     CFCReleaser<CFMutableArrayRef> (s)
     18 {
     19 }
     20 
     21 //----------------------------------------------------------------------
     22 // CFCMutableArray copy constructor
     23 //----------------------------------------------------------------------
     24 CFCMutableArray::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 //----------------------------------------------------------------------
     32 CFCMutableArray&
     33 CFCMutableArray::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 //----------------------------------------------------------------------
     43 CFCMutableArray::~CFCMutableArray()
     44 {
     45 }
     46 
     47 
     48 CFIndex
     49 CFCMutableArray::GetCount() const
     50 {
     51     CFMutableArrayRef array = get();
     52     if (array)
     53         return ::CFArrayGetCount (array);
     54     return 0;
     55 }
     56 
     57 CFIndex
     58 CFCMutableArray::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 
     66 CFIndex
     67 CFCMutableArray::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 
     75 const void *
     76 CFCMutableArray::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 
     90 bool
     91 CFCMutableArray::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 
    107 bool
    108 CFCMutableArray::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 
    127 bool
    128 CFCMutableArray::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 
    147 bool
    148 CFCMutableArray::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