//===-- 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/Utility/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));
  }
}

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

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;
}

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

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