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

#include "lldb/API/SBStringList.h"

#include "lldb/Core/StringList.h"

using namespace lldb;
using namespace lldb_private;

SBStringList::SBStringList () :
    m_opaque_ap ()
{
}

SBStringList::SBStringList (const lldb_private::StringList *lldb_strings_ptr) :
    m_opaque_ap ()
{
    if (lldb_strings_ptr)
        m_opaque_ap.reset (new lldb_private::StringList (*lldb_strings_ptr));
}

SBStringList::SBStringList (const SBStringList  &rhs) :
    m_opaque_ap ()
{
    if (rhs.IsValid())
        m_opaque_ap.reset (new lldb_private::StringList(*rhs));
}


const SBStringList &
SBStringList::operator = (const SBStringList &rhs)
{
    if (this != &rhs)
    {
        if (rhs.IsValid())
            m_opaque_ap.reset(new lldb_private::StringList(*rhs));
        else
            m_opaque_ap.reset();
    }
    return *this;
}

SBStringList::~SBStringList ()
{
}

const lldb_private::StringList *
SBStringList::operator->() const
{
    return m_opaque_ap.get();
}

const lldb_private::StringList &
SBStringList::operator*() const
{
    return *m_opaque_ap;
}

bool
SBStringList::IsValid() const
{
    return (m_opaque_ap.get() != NULL);
}

void
SBStringList::AppendString (const char *str)
{
    if (str != NULL)
    {
        if (IsValid())
            m_opaque_ap->AppendString (str);
        else
            m_opaque_ap.reset (new lldb_private::StringList (str));
    }

}

void
SBStringList::AppendList (const char **strv, int strc)
{
    if ((strv != NULL)
        && (strc > 0))
    {
        if (IsValid())
            m_opaque_ap->AppendList (strv, strc);
        else
            m_opaque_ap.reset (new lldb_private::StringList (strv, strc));
    }
}

void
SBStringList::AppendList (const SBStringList &strings)
{
    if (strings.IsValid())
    {
        if (! IsValid())
            m_opaque_ap.reset (new lldb_private::StringList());
        m_opaque_ap->AppendList (*(strings.m_opaque_ap));
    }
}

uint32_t
SBStringList::GetSize () const
{
    if (IsValid())
    {
        return m_opaque_ap->GetSize();
    }
    return 0;
}

const char *
SBStringList::GetStringAtIndex (size_t idx)
{
    if (IsValid())
    {
        return m_opaque_ap->GetStringAtIndex (idx);
    }
    return NULL;
}

void
SBStringList::Clear ()
{
    if (IsValid())
    {
        m_opaque_ap->Clear();
    }
}
