1 //===-- ValueObjectList.cpp -------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Core/ValueObjectList.h"
11 
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/Core/ValueObjectChild.h"
17 #include "lldb/Core/ValueObjectRegister.h"
18 #include "lldb/Core/ValueObjectVariable.h"
19 #include "lldb/Target/ExecutionContext.h"
20 #include "lldb/Target/Process.h"
21 
22 using namespace lldb;
23 using namespace lldb_private;
24 
ValueObjectList()25 ValueObjectList::ValueObjectList () :
26     m_value_objects()
27 {
28 }
29 
ValueObjectList(const ValueObjectList & rhs)30 ValueObjectList::ValueObjectList (const ValueObjectList &rhs) :
31     m_value_objects(rhs.m_value_objects)
32 {
33 }
34 
35 
~ValueObjectList()36 ValueObjectList::~ValueObjectList ()
37 {
38 }
39 
40 const ValueObjectList &
operator =(const ValueObjectList & rhs)41 ValueObjectList::operator = (const ValueObjectList &rhs)
42 {
43     if (this != &rhs)
44         m_value_objects = rhs.m_value_objects;
45     return *this;
46 }
47 
48 void
Append(const ValueObjectSP & val_obj_sp)49 ValueObjectList::Append (const ValueObjectSP &val_obj_sp)
50 {
51     m_value_objects.push_back(val_obj_sp);
52 }
53 
54 void
Append(const ValueObjectList & valobj_list)55 ValueObjectList::Append (const ValueObjectList &valobj_list)
56 {
57     std::copy(valobj_list.m_value_objects.begin(),  // source begin
58               valobj_list.m_value_objects.end(),    // source end
59               back_inserter(m_value_objects));      // destination
60 
61 }
62 
63 
64 size_t
GetSize() const65 ValueObjectList::GetSize() const
66 {
67     return m_value_objects.size();
68 }
69 
70 void
Resize(size_t size)71 ValueObjectList::Resize (size_t size)
72 {
73     m_value_objects.resize (size);
74 }
75 
76 lldb::ValueObjectSP
GetValueObjectAtIndex(size_t idx)77 ValueObjectList::GetValueObjectAtIndex (size_t idx)
78 {
79     lldb::ValueObjectSP valobj_sp;
80     if (idx < m_value_objects.size())
81         valobj_sp = m_value_objects[idx];
82     return valobj_sp;
83 }
84 
85 lldb::ValueObjectSP
RemoveValueObjectAtIndex(size_t idx)86 ValueObjectList::RemoveValueObjectAtIndex (size_t idx)
87 {
88     lldb::ValueObjectSP valobj_sp;
89     if (idx < m_value_objects.size())
90     {
91         valobj_sp = m_value_objects[idx];
92         m_value_objects.erase (m_value_objects.begin() + idx);
93     }
94     return valobj_sp;
95 }
96 
97 void
SetValueObjectAtIndex(size_t idx,const ValueObjectSP & valobj_sp)98 ValueObjectList::SetValueObjectAtIndex (size_t idx, const ValueObjectSP &valobj_sp)
99 {
100     if (idx >= m_value_objects.size())
101         m_value_objects.resize (idx + 1);
102     m_value_objects[idx] = valobj_sp;
103 }
104 
105 ValueObjectSP
FindValueObjectByValueName(const char * name)106 ValueObjectList::FindValueObjectByValueName (const char *name)
107 {
108     ConstString name_const_str(name);
109     ValueObjectSP val_obj_sp;
110     collection::iterator pos, end = m_value_objects.end();
111     for (pos = m_value_objects.begin(); pos != end; ++pos)
112     {
113         ValueObject *valobj = (*pos).get();
114         if (valobj && valobj->GetName() == name_const_str)
115         {
116             val_obj_sp = *pos;
117             break;
118         }
119     }
120     return val_obj_sp;
121 }
122 
123 ValueObjectSP
FindValueObjectByUID(lldb::user_id_t uid)124 ValueObjectList::FindValueObjectByUID (lldb::user_id_t uid)
125 {
126     ValueObjectSP valobj_sp;
127     collection::iterator pos, end = m_value_objects.end();
128 
129     for (pos = m_value_objects.begin(); pos != end; ++pos)
130     {
131         // Watch out for NULL objects in our list as the list
132         // might get resized to a specific size and lazily filled in
133         ValueObject *valobj = (*pos).get();
134         if (valobj && valobj->GetID() == uid)
135         {
136             valobj_sp = *pos;
137             break;
138         }
139     }
140     return valobj_sp;
141 }
142 
143 
144 ValueObjectSP
FindValueObjectByPointer(ValueObject * find_valobj)145 ValueObjectList::FindValueObjectByPointer (ValueObject *find_valobj)
146 {
147     ValueObjectSP valobj_sp;
148     collection::iterator pos, end = m_value_objects.end();
149 
150     for (pos = m_value_objects.begin(); pos != end; ++pos)
151     {
152         ValueObject *valobj = (*pos).get();
153         if (valobj && valobj == find_valobj)
154         {
155             valobj_sp = *pos;
156             break;
157         }
158     }
159     return valobj_sp;
160 }
161 
162 void
Swap(ValueObjectList & value_object_list)163 ValueObjectList::Swap (ValueObjectList &value_object_list)
164 {
165     m_value_objects.swap (value_object_list.m_value_objects);
166 }
167