//===-- SBSymbolContextList.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/SBSymbolContextList.h"
#include "lldb/API/SBStream.h"
#include "lldb/Symbol/SymbolContext.h"

using namespace lldb;
using namespace lldb_private;

SBSymbolContextList::SBSymbolContextList () :
    m_opaque_ap (new SymbolContextList())
{
}

SBSymbolContextList::SBSymbolContextList (const SBSymbolContextList& rhs) :
    m_opaque_ap (new SymbolContextList(*rhs.m_opaque_ap))
{
}

SBSymbolContextList::~SBSymbolContextList ()
{
}

const SBSymbolContextList &
SBSymbolContextList::operator = (const SBSymbolContextList &rhs)
{
    if (this != &rhs)
    {
        *m_opaque_ap = *rhs.m_opaque_ap;
    }
    return *this;
}

uint32_t
SBSymbolContextList::GetSize() const
{
    if (m_opaque_ap.get())
        return m_opaque_ap->GetSize();
    return 0;
}

SBSymbolContext
SBSymbolContextList::GetContextAtIndex (uint32_t idx)
{
    SBSymbolContext sb_sc;
    if (m_opaque_ap.get())
    {
        SymbolContext sc;
        if (m_opaque_ap->GetContextAtIndex (idx, sc))
        {
            sb_sc.SetSymbolContext(&sc);
        }
    }
    return sb_sc;
}

void
SBSymbolContextList::Clear()
{
    if (m_opaque_ap.get())
        m_opaque_ap->Clear();
}

void
SBSymbolContextList::Append(SBSymbolContext &sc)
{
    if (sc.IsValid() && m_opaque_ap.get())
        m_opaque_ap->Append(*sc);
}

void
SBSymbolContextList::Append(SBSymbolContextList &sc_list)
{
    if (sc_list.IsValid() && m_opaque_ap.get())
        m_opaque_ap->Append(*sc_list);
}


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



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


lldb_private::SymbolContextList&
SBSymbolContextList::operator*() const
{
    assert (m_opaque_ap.get());
    return *m_opaque_ap.get();
}

bool
SBSymbolContextList::GetDescription (lldb::SBStream &description)
{
    Stream &strm = description.ref();    
    if (m_opaque_ap.get())
        m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL);
    return true;
}


