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
22using namespace lldb;
23using namespace lldb_private;
24
25ValueObjectList::ValueObjectList () :
26    m_value_objects()
27{
28}
29
30ValueObjectList::ValueObjectList (const ValueObjectList &rhs) :
31    m_value_objects(rhs.m_value_objects)
32{
33}
34
35
36ValueObjectList::~ValueObjectList ()
37{
38}
39
40const ValueObjectList &
41ValueObjectList::operator = (const ValueObjectList &rhs)
42{
43    if (this != &rhs)
44        m_value_objects = rhs.m_value_objects;
45    return *this;
46}
47
48void
49ValueObjectList::Append (const ValueObjectSP &val_obj_sp)
50{
51    m_value_objects.push_back(val_obj_sp);
52}
53
54void
55ValueObjectList::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
64size_t
65ValueObjectList::GetSize() const
66{
67    return m_value_objects.size();
68}
69
70void
71ValueObjectList::Resize (size_t size)
72{
73    m_value_objects.resize (size);
74}
75
76lldb::ValueObjectSP
77ValueObjectList::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
85lldb::ValueObjectSP
86ValueObjectList::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
97void
98ValueObjectList::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
105ValueObjectSP
106ValueObjectList::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
123ValueObjectSP
124ValueObjectList::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
144ValueObjectSP
145ValueObjectList::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
162void
163ValueObjectList::Swap (ValueObjectList &value_object_list)
164{
165    m_value_objects.swap (value_object_list.m_value_objects);
166}
167