//===-- SBThreadCollection.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/SBThreadCollection.h"
#include "lldb/API/SBThread.h"
#include "lldb/Target/ThreadList.h"

using namespace lldb;
using namespace lldb_private;


SBThreadCollection::SBThreadCollection () :
    m_opaque_sp()
{
}

SBThreadCollection::SBThreadCollection(const SBThreadCollection &rhs) :
    m_opaque_sp (rhs.m_opaque_sp)
{
}

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

SBThreadCollection::SBThreadCollection (const ThreadCollectionSP &threads) :
    m_opaque_sp(threads)
{
}

SBThreadCollection::~SBThreadCollection ()
{
}

void
SBThreadCollection::SetOpaque (const lldb::ThreadCollectionSP &threads)
{
    m_opaque_sp = threads;
}

lldb_private::ThreadCollection *
SBThreadCollection::get() const
{
    return m_opaque_sp.get();
}

lldb_private::ThreadCollection *
SBThreadCollection::operator->() const
{
    return m_opaque_sp.operator->();
}

lldb::ThreadCollectionSP &
SBThreadCollection::operator*()
{
    return m_opaque_sp;
}

const lldb::ThreadCollectionSP &
SBThreadCollection::operator*() const
{
    return m_opaque_sp;
}


bool
SBThreadCollection::IsValid () const
{
    return m_opaque_sp.get() != NULL;
}

size_t
SBThreadCollection::GetSize ()
{
    if (m_opaque_sp)
        return m_opaque_sp->GetSize();
    return 0;
}

SBThread
SBThreadCollection::GetThreadAtIndex(size_t idx)
{
    SBThread thread;
    if (m_opaque_sp && idx < m_opaque_sp->GetSize())
        thread = m_opaque_sp->GetThreadAtIndex(idx);
    return thread;
}
