1254721Semaste//===-- SBValueList.cpp -----------------------------------------*- C++ -*-===//
2254721Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6254721Semaste//
7254721Semaste//===----------------------------------------------------------------------===//
8254721Semaste
9254721Semaste#include "lldb/API/SBValueList.h"
10353358Sdim#include "SBReproducerPrivate.h"
11314564Sdim#include "lldb/API/SBStream.h"
12254721Semaste#include "lldb/API/SBValue.h"
13254721Semaste#include "lldb/Core/ValueObjectList.h"
14254721Semaste
15254721Semaste#include <vector>
16254721Semaste
17254721Semasteusing namespace lldb;
18254721Semasteusing namespace lldb_private;
19254721Semaste
20314564Sdimclass ValueListImpl {
21254721Semastepublic:
22314564Sdim  ValueListImpl() : m_values() {}
23314564Sdim
24314564Sdim  ValueListImpl(const ValueListImpl &rhs) : m_values(rhs.m_values) {}
25314564Sdim
26314564Sdim  ValueListImpl &operator=(const ValueListImpl &rhs) {
27314564Sdim    if (this == &rhs)
28314564Sdim      return *this;
29314564Sdim    m_values = rhs.m_values;
30314564Sdim    return *this;
31314564Sdim  }
32314564Sdim
33314564Sdim  uint32_t GetSize() { return m_values.size(); }
34314564Sdim
35314564Sdim  void Append(const lldb::SBValue &sb_value) { m_values.push_back(sb_value); }
36314564Sdim
37314564Sdim  void Append(const ValueListImpl &list) {
38314564Sdim    for (auto val : list.m_values)
39314564Sdim      Append(val);
40314564Sdim  }
41314564Sdim
42314564Sdim  lldb::SBValue GetValueAtIndex(uint32_t index) {
43314564Sdim    if (index >= GetSize())
44314564Sdim      return lldb::SBValue();
45314564Sdim    return m_values[index];
46314564Sdim  }
47314564Sdim
48314564Sdim  lldb::SBValue FindValueByUID(lldb::user_id_t uid) {
49314564Sdim    for (auto val : m_values) {
50314564Sdim      if (val.IsValid() && val.GetID() == uid)
51314564Sdim        return val;
52254721Semaste    }
53314564Sdim    return lldb::SBValue();
54314564Sdim  }
55314564Sdim
56314564Sdim  lldb::SBValue GetFirstValueByName(const char *name) const {
57314564Sdim    if (name) {
58314564Sdim      for (auto val : m_values) {
59314564Sdim        if (val.IsValid() && val.GetName() && strcmp(name, val.GetName()) == 0)
60314564Sdim          return val;
61314564Sdim      }
62254721Semaste    }
63314564Sdim    return lldb::SBValue();
64314564Sdim  }
65254721Semaste
66254721Semasteprivate:
67314564Sdim  std::vector<lldb::SBValue> m_values;
68254721Semaste};
69254721Semaste
70353358SdimSBValueList::SBValueList() : m_opaque_up() {
71353358Sdim  LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBValueList);
72353358Sdim}
73254721Semaste
74353358SdimSBValueList::SBValueList(const SBValueList &rhs) : m_opaque_up() {
75353358Sdim  LLDB_RECORD_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &), rhs);
76254721Semaste
77314564Sdim  if (rhs.IsValid())
78353358Sdim    m_opaque_up.reset(new ValueListImpl(*rhs));
79353358Sdim}
80254721Semaste
81353358SdimSBValueList::SBValueList(const ValueListImpl *lldb_object_ptr) : m_opaque_up() {
82353358Sdim  if (lldb_object_ptr)
83353358Sdim    m_opaque_up.reset(new ValueListImpl(*lldb_object_ptr));
84254721Semaste}
85254721Semaste
86353358SdimSBValueList::~SBValueList() {}
87254721Semaste
88353358Sdimbool SBValueList::IsValid() const {
89353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, IsValid);
90353358Sdim  return this->operator bool();
91353358Sdim}
92353358SdimSBValueList::operator bool() const {
93353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBValueList, operator bool);
94254721Semaste
95353358Sdim  return (m_opaque_up != nullptr);
96254721Semaste}
97254721Semaste
98353358Sdimvoid SBValueList::Clear() {
99353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(void, SBValueList, Clear);
100254721Semaste
101353358Sdim  m_opaque_up.reset();
102353358Sdim}
103254721Semaste
104353358Sdimconst SBValueList &SBValueList::operator=(const SBValueList &rhs) {
105353358Sdim  LLDB_RECORD_METHOD(const lldb::SBValueList &,
106353358Sdim                     SBValueList, operator=,(const lldb::SBValueList &), rhs);
107254721Semaste
108314564Sdim  if (this != &rhs) {
109314564Sdim    if (rhs.IsValid())
110353358Sdim      m_opaque_up.reset(new ValueListImpl(*rhs));
111314564Sdim    else
112353358Sdim      m_opaque_up.reset();
113314564Sdim  }
114353358Sdim  return LLDB_RECORD_RESULT(*this);
115254721Semaste}
116254721Semaste
117353358SdimValueListImpl *SBValueList::operator->() { return m_opaque_up.get(); }
118254721Semaste
119353358SdimValueListImpl &SBValueList::operator*() { return *m_opaque_up; }
120254721Semaste
121314564Sdimconst ValueListImpl *SBValueList::operator->() const {
122353358Sdim  return m_opaque_up.get();
123254721Semaste}
124254721Semaste
125353358Sdimconst ValueListImpl &SBValueList::operator*() const { return *m_opaque_up; }
126254721Semaste
127314564Sdimvoid SBValueList::Append(const SBValue &val_obj) {
128353358Sdim  LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValue &),
129353358Sdim                     val_obj);
130353358Sdim
131314564Sdim  CreateIfNeeded();
132353358Sdim  m_opaque_up->Append(val_obj);
133254721Semaste}
134254721Semaste
135314564Sdimvoid SBValueList::Append(lldb::ValueObjectSP &val_obj_sp) {
136314564Sdim  if (val_obj_sp) {
137314564Sdim    CreateIfNeeded();
138353358Sdim    m_opaque_up->Append(SBValue(val_obj_sp));
139314564Sdim  }
140254721Semaste}
141254721Semaste
142314564Sdimvoid SBValueList::Append(const lldb::SBValueList &value_list) {
143353358Sdim  LLDB_RECORD_METHOD(void, SBValueList, Append, (const lldb::SBValueList &),
144353358Sdim                     value_list);
145353358Sdim
146314564Sdim  if (value_list.IsValid()) {
147314564Sdim    CreateIfNeeded();
148353358Sdim    m_opaque_up->Append(*value_list);
149314564Sdim  }
150254721Semaste}
151254721Semaste
152314564SdimSBValue SBValueList::GetValueAtIndex(uint32_t idx) const {
153353358Sdim  LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex,
154353358Sdim                           (uint32_t), idx);
155254721Semaste
156254721Semaste
157314564Sdim  SBValue sb_value;
158353358Sdim  if (m_opaque_up)
159353358Sdim    sb_value = m_opaque_up->GetValueAtIndex(idx);
160254721Semaste
161353358Sdim  return LLDB_RECORD_RESULT(sb_value);
162254721Semaste}
163254721Semaste
164314564Sdimuint32_t SBValueList::GetSize() const {
165353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBValueList, GetSize);
166254721Semaste
167314564Sdim  uint32_t size = 0;
168353358Sdim  if (m_opaque_up)
169353358Sdim    size = m_opaque_up->GetSize();
170254721Semaste
171314564Sdim  return size;
172254721Semaste}
173254721Semaste
174314564Sdimvoid SBValueList::CreateIfNeeded() {
175353358Sdim  if (m_opaque_up == nullptr)
176353358Sdim    m_opaque_up.reset(new ValueListImpl());
177254721Semaste}
178254721Semaste
179314564SdimSBValue SBValueList::FindValueObjectByUID(lldb::user_id_t uid) {
180353358Sdim  LLDB_RECORD_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID,
181353358Sdim                     (lldb::user_id_t), uid);
182353358Sdim
183314564Sdim  SBValue sb_value;
184353358Sdim  if (m_opaque_up)
185353358Sdim    sb_value = m_opaque_up->FindValueByUID(uid);
186353358Sdim  return LLDB_RECORD_RESULT(sb_value);
187254721Semaste}
188254721Semaste
189314564SdimSBValue SBValueList::GetFirstValueByName(const char *name) const {
190353358Sdim  LLDB_RECORD_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName,
191353358Sdim                           (const char *), name);
192353358Sdim
193314564Sdim  SBValue sb_value;
194353358Sdim  if (m_opaque_up)
195353358Sdim    sb_value = m_opaque_up->GetFirstValueByName(name);
196353358Sdim  return LLDB_RECORD_RESULT(sb_value);
197280031Sdim}
198280031Sdim
199353358Sdimvoid *SBValueList::opaque_ptr() { return m_opaque_up.get(); }
200254721Semaste
201314564SdimValueListImpl &SBValueList::ref() {
202314564Sdim  CreateIfNeeded();
203353358Sdim  return *m_opaque_up;
204254721Semaste}
205353358Sdim
206353358Sdimnamespace lldb_private {
207353358Sdimnamespace repro {
208353358Sdim
209353358Sdimtemplate <>
210353358Sdimvoid RegisterMethods<SBValueList>(Registry &R) {
211353358Sdim  LLDB_REGISTER_CONSTRUCTOR(SBValueList, ());
212353358Sdim  LLDB_REGISTER_CONSTRUCTOR(SBValueList, (const lldb::SBValueList &));
213353358Sdim  LLDB_REGISTER_METHOD_CONST(bool, SBValueList, IsValid, ());
214353358Sdim  LLDB_REGISTER_METHOD_CONST(bool, SBValueList, operator bool, ());
215353358Sdim  LLDB_REGISTER_METHOD(void, SBValueList, Clear, ());
216353358Sdim  LLDB_REGISTER_METHOD(const lldb::SBValueList &,
217353358Sdim                       SBValueList, operator=,(const lldb::SBValueList &));
218353358Sdim  LLDB_REGISTER_METHOD(void, SBValueList, Append, (const lldb::SBValue &));
219353358Sdim  LLDB_REGISTER_METHOD(void, SBValueList, Append,
220353358Sdim                       (const lldb::SBValueList &));
221353358Sdim  LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetValueAtIndex,
222353358Sdim                             (uint32_t));
223353358Sdim  LLDB_REGISTER_METHOD_CONST(uint32_t, SBValueList, GetSize, ());
224353358Sdim  LLDB_REGISTER_METHOD(lldb::SBValue, SBValueList, FindValueObjectByUID,
225353358Sdim                       (lldb::user_id_t));
226353358Sdim  LLDB_REGISTER_METHOD_CONST(lldb::SBValue, SBValueList, GetFirstValueByName,
227353358Sdim                             (const char *));
228353358Sdim}
229353358Sdim
230353358Sdim}
231353358Sdim}
232