//===-- CFCMutableArray.cpp -------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "CFCMutableArray.h"
#include "CFCString.h"

//----------------------------------------------------------------------
// CFCString constructor
//----------------------------------------------------------------------
CFCMutableArray::CFCMutableArray(CFMutableArrayRef s) :
    CFCReleaser<CFMutableArrayRef> (s)
{
}

//----------------------------------------------------------------------
// CFCMutableArray copy constructor
//----------------------------------------------------------------------
CFCMutableArray::CFCMutableArray(const CFCMutableArray& rhs) :
    CFCReleaser<CFMutableArrayRef> (rhs)    // NOTE: this won't make a copy of the array, just add a new reference to it
{
}

//----------------------------------------------------------------------
// CFCMutableArray copy constructor
//----------------------------------------------------------------------
CFCMutableArray&
CFCMutableArray::operator=(const CFCMutableArray& rhs)
{
    if (this != &rhs)
        *this = rhs;    // NOTE: this operator won't make a copy of the array, just add a new reference to it
    return *this;
}

//----------------------------------------------------------------------
// Destructor
//----------------------------------------------------------------------
CFCMutableArray::~CFCMutableArray()
{
}


CFIndex
CFCMutableArray::GetCount() const
{
    CFMutableArrayRef array = get();
    if (array)
        return ::CFArrayGetCount (array);
    return 0;
}

CFIndex
CFCMutableArray::GetCountOfValue(CFRange range, const void *value) const
{
    CFMutableArrayRef array = get();
    if (array)
        return ::CFArrayGetCountOfValue (array, range, value);
    return 0;
}

CFIndex
CFCMutableArray::GetCountOfValue(const void *value) const
{
    CFMutableArrayRef array = get();
    if (array)
        return ::CFArrayGetCountOfValue (array, CFRangeMake(0, GetCount()), value);
    return 0;
}

const void *
CFCMutableArray::GetValueAtIndex(CFIndex idx) const
{
    CFMutableArrayRef array = get();
    if (array)
    {
        const CFIndex num_array_items = ::CFArrayGetCount (array);
        if (0 <= idx && idx < num_array_items)
        {
            return ::CFArrayGetValueAtIndex (array, idx);
        }
    }
    return NULL;
}

bool
CFCMutableArray::SetValueAtIndex(CFIndex idx, const void *value)
{
    CFMutableArrayRef array = get();
    if (array != NULL)
    {
        const CFIndex num_array_items = ::CFArrayGetCount (array);
        if (0 <= idx && idx < num_array_items)
        {
            ::CFArraySetValueAtIndex (array, idx, value);
            return true;
        }
    }
    return false;
}


bool
CFCMutableArray::AppendValue(const void *value, bool can_create)
{
    CFMutableArrayRef array = get();
    if (array == NULL)
    {
        if (can_create == false)
            return false;
        array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
        reset ( array );
    }
    if (array != NULL)
    {
        ::CFArrayAppendValue(array, value);
        return true;
    }
    return false;
}


bool
CFCMutableArray::AppendCStringAsCFString (const char *s, CFStringEncoding encoding, bool can_create)
{
    CFMutableArrayRef array = get();
    if (array == NULL)
    {
        if (can_create == false)
            return false;
        array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
        reset ( array );
    }
    if (array != NULL)
    {
        CFCString cf_str (s, encoding);
        ::CFArrayAppendValue (array, cf_str.get());
        return true;
    }
    return false;
}

bool
CFCMutableArray::AppendFileSystemRepresentationAsCFString (const char *s, bool can_create)
{
    CFMutableArrayRef array = get();
    if (array == NULL)
    {
        if (can_create == false)
            return false;
        array = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
        reset ( array );
    }
    if (array != NULL)
    {
        CFCString cf_path;
        cf_path.SetFileSystemRepresentation(s);
        ::CFArrayAppendValue (array, cf_path.get());
        return true;
    }
    return false;
}
