1254721Semaste//===-- SBValueList.cpp -----------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste
11254721Semaste#include "lldb/API/SBValueList.h"
12254721Semaste#include "lldb/API/SBValue.h"
13254721Semaste#include "lldb/API/SBStream.h"
14254721Semaste#include "lldb/Core/Log.h"
15254721Semaste#include "lldb/Core/ValueObjectList.h"
16254721Semaste
17254721Semaste#include <vector>
18254721Semaste
19254721Semasteusing namespace lldb;
20254721Semasteusing namespace lldb_private;
21254721Semaste
22254721Semasteclass ValueListImpl
23254721Semaste{
24254721Semastepublic:
25254721Semaste    ValueListImpl () :
26254721Semaste    m_values()
27254721Semaste    {
28254721Semaste    }
29254721Semaste
30254721Semaste    ValueListImpl (const ValueListImpl& rhs) :
31254721Semaste    m_values(rhs.m_values)
32254721Semaste    {
33254721Semaste    }
34254721Semaste
35254721Semaste    ValueListImpl&
36254721Semaste    operator = (const ValueListImpl& rhs)
37254721Semaste    {
38254721Semaste        if (this == &rhs)
39254721Semaste            return *this;
40254721Semaste        m_values = rhs.m_values;
41254721Semaste        return *this;
42254721Semaste    };
43254721Semaste
44254721Semaste    uint32_t
45254721Semaste    GetSize ()
46254721Semaste    {
47254721Semaste        return m_values.size();
48254721Semaste    }
49254721Semaste
50254721Semaste    void
51254721Semaste    Append (const lldb::SBValue& sb_value)
52254721Semaste    {
53254721Semaste        m_values.push_back(sb_value);
54254721Semaste    }
55254721Semaste
56254721Semaste    void
57254721Semaste    Append (const ValueListImpl& list)
58254721Semaste    {
59254721Semaste        for (auto val : list.m_values)
60254721Semaste            Append (val);
61254721Semaste    }
62254721Semaste
63254721Semaste    lldb::SBValue
64254721Semaste    GetValueAtIndex (uint32_t index)
65254721Semaste    {
66254721Semaste        if (index >= GetSize())
67254721Semaste            return lldb::SBValue();
68254721Semaste        return m_values[index];
69254721Semaste    }
70254721Semaste
71254721Semaste    lldb::SBValue
72254721Semaste    FindValueByUID (lldb::user_id_t uid)
73254721Semaste    {
74254721Semaste        for (auto val : m_values)
75254721Semaste        {
76254721Semaste            if (val.IsValid() && val.GetID() == uid)
77254721Semaste                return val;
78254721Semaste        }
79254721Semaste        return lldb::SBValue();
80254721Semaste    }
81254721Semaste
82254721Semasteprivate:
83254721Semaste    std::vector<lldb::SBValue> m_values;
84254721Semaste};
85254721Semaste
86254721SemasteSBValueList::SBValueList () :
87254721Semaste    m_opaque_ap ()
88254721Semaste{
89254721Semaste}
90254721Semaste
91254721SemasteSBValueList::SBValueList (const SBValueList &rhs) :
92254721Semaste    m_opaque_ap ()
93254721Semaste{
94254721Semaste    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
95254721Semaste
96254721Semaste    if (rhs.IsValid())
97254721Semaste        m_opaque_ap.reset (new ValueListImpl (*rhs));
98254721Semaste
99254721Semaste    if (log)
100254721Semaste    {
101254721Semaste        log->Printf ("SBValueList::SBValueList (rhs.ap=%p) => this.ap = %p",
102254721Semaste                     (rhs.IsValid() ? rhs.m_opaque_ap.get() : NULL),
103254721Semaste                     m_opaque_ap.get());
104254721Semaste    }
105254721Semaste}
106254721Semaste
107254721SemasteSBValueList::SBValueList (const ValueListImpl *lldb_object_ptr) :
108254721Semaste    m_opaque_ap ()
109254721Semaste{
110254721Semaste    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
111254721Semaste
112254721Semaste    if (lldb_object_ptr)
113254721Semaste        m_opaque_ap.reset (new ValueListImpl (*lldb_object_ptr));
114254721Semaste
115254721Semaste    if (log)
116254721Semaste    {
117254721Semaste        log->Printf ("SBValueList::SBValueList (lldb_object_ptr=%p) => this.ap = %p",
118254721Semaste                     lldb_object_ptr,
119254721Semaste                     m_opaque_ap.get());
120254721Semaste    }
121254721Semaste}
122254721Semaste
123254721SemasteSBValueList::~SBValueList ()
124254721Semaste{
125254721Semaste}
126254721Semaste
127254721Semastebool
128254721SemasteSBValueList::IsValid () const
129254721Semaste{
130254721Semaste    return (m_opaque_ap.get() != NULL);
131254721Semaste}
132254721Semaste
133254721Semastevoid
134254721SemasteSBValueList::Clear()
135254721Semaste{
136254721Semaste    m_opaque_ap.reset();
137254721Semaste}
138254721Semaste
139254721Semasteconst SBValueList &
140254721SemasteSBValueList::operator = (const SBValueList &rhs)
141254721Semaste{
142254721Semaste    if (this != &rhs)
143254721Semaste    {
144254721Semaste        if (rhs.IsValid())
145254721Semaste            m_opaque_ap.reset (new ValueListImpl (*rhs));
146254721Semaste        else
147254721Semaste            m_opaque_ap.reset ();
148254721Semaste    }
149254721Semaste    return *this;
150254721Semaste}
151254721Semaste
152254721SemasteValueListImpl *
153254721SemasteSBValueList::operator->()
154254721Semaste{
155254721Semaste    return m_opaque_ap.get();
156254721Semaste}
157254721Semaste
158254721SemasteValueListImpl &
159254721SemasteSBValueList::operator*()
160254721Semaste{
161254721Semaste    return *m_opaque_ap;
162254721Semaste}
163254721Semaste
164254721Semasteconst ValueListImpl *
165254721SemasteSBValueList::operator->() const
166254721Semaste{
167254721Semaste    return m_opaque_ap.get();
168254721Semaste}
169254721Semaste
170254721Semasteconst ValueListImpl &
171254721SemasteSBValueList::operator*() const
172254721Semaste{
173254721Semaste    return *m_opaque_ap;
174254721Semaste}
175254721Semaste
176254721Semastevoid
177254721SemasteSBValueList::Append (const SBValue &val_obj)
178254721Semaste{
179254721Semaste    CreateIfNeeded ();
180254721Semaste    m_opaque_ap->Append (val_obj);
181254721Semaste}
182254721Semaste
183254721Semastevoid
184254721SemasteSBValueList::Append (lldb::ValueObjectSP& val_obj_sp)
185254721Semaste{
186254721Semaste    if (val_obj_sp)
187254721Semaste    {
188254721Semaste        CreateIfNeeded ();
189254721Semaste        m_opaque_ap->Append (SBValue(val_obj_sp));
190254721Semaste    }
191254721Semaste}
192254721Semaste
193254721Semastevoid
194254721SemasteSBValueList::Append (const lldb::SBValueList& value_list)
195254721Semaste{
196254721Semaste    if (value_list.IsValid())
197254721Semaste    {
198254721Semaste        CreateIfNeeded ();
199254721Semaste        m_opaque_ap->Append (*value_list);
200254721Semaste    }
201254721Semaste}
202254721Semaste
203254721Semaste
204254721SemasteSBValue
205254721SemasteSBValueList::GetValueAtIndex (uint32_t idx) const
206254721Semaste{
207254721Semaste    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
208254721Semaste
209254721Semaste    //if (log)
210254721Semaste    //    log->Printf ("SBValueList::GetValueAtIndex (uint32_t idx) idx = %d", idx);
211254721Semaste
212254721Semaste    SBValue sb_value;
213254721Semaste    if (m_opaque_ap.get())
214254721Semaste        sb_value = m_opaque_ap->GetValueAtIndex (idx);
215254721Semaste
216254721Semaste    if (log)
217254721Semaste    {
218254721Semaste        SBStream sstr;
219254721Semaste        sb_value.GetDescription (sstr);
220254721Semaste        log->Printf ("SBValueList::GetValueAtIndex (this.ap=%p, idx=%d) => SBValue (this.sp = %p, '%s')",
221254721Semaste                     m_opaque_ap.get(), idx, sb_value.GetSP().get(), sstr.GetData());
222254721Semaste    }
223254721Semaste
224254721Semaste    return sb_value;
225254721Semaste}
226254721Semaste
227254721Semasteuint32_t
228254721SemasteSBValueList::GetSize () const
229254721Semaste{
230254721Semaste    Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
231254721Semaste
232254721Semaste    //if (log)
233254721Semaste    //    log->Printf ("SBValueList::GetSize ()");
234254721Semaste
235254721Semaste    uint32_t size = 0;
236254721Semaste    if (m_opaque_ap.get())
237254721Semaste        size = m_opaque_ap->GetSize();
238254721Semaste
239254721Semaste    if (log)
240254721Semaste        log->Printf ("SBValueList::GetSize (this.ap=%p) => %d", m_opaque_ap.get(), size);
241254721Semaste
242254721Semaste    return size;
243254721Semaste}
244254721Semaste
245254721Semastevoid
246254721SemasteSBValueList::CreateIfNeeded ()
247254721Semaste{
248254721Semaste    if (m_opaque_ap.get() == NULL)
249254721Semaste        m_opaque_ap.reset (new ValueListImpl());
250254721Semaste}
251254721Semaste
252254721Semaste
253254721SemasteSBValue
254254721SemasteSBValueList::FindValueObjectByUID (lldb::user_id_t uid)
255254721Semaste{
256254721Semaste    SBValue sb_value;
257254721Semaste    if (m_opaque_ap.get())
258254721Semaste        sb_value = m_opaque_ap->FindValueByUID(uid);
259254721Semaste    return sb_value;
260254721Semaste}
261254721Semaste
262254721Semastevoid *
263254721SemasteSBValueList::opaque_ptr ()
264254721Semaste{
265254721Semaste    return m_opaque_ap.get();
266254721Semaste}
267254721Semaste
268254721SemasteValueListImpl &
269254721SemasteSBValueList::ref ()
270254721Semaste{
271254721Semaste    CreateIfNeeded();
272254721Semaste    return *m_opaque_ap.get();
273254721Semaste}
274254721Semaste
275254721Semaste
276