1//===-- VariableList.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/Symbol/VariableList.h"
11
12#include "lldb/Core/RegularExpression.h"
13#include "lldb/Symbol/Block.h"
14#include "lldb/Symbol/Function.h"
15#include "lldb/Symbol/CompileUnit.h"
16
17using namespace lldb;
18using namespace lldb_private;
19
20//----------------------------------------------------------------------
21// VariableList constructor
22//----------------------------------------------------------------------
23VariableList::VariableList() :
24    m_variables()
25{
26}
27
28//----------------------------------------------------------------------
29// Destructor
30//----------------------------------------------------------------------
31VariableList::~VariableList()
32{
33}
34
35void
36VariableList::AddVariable(const VariableSP &var_sp)
37{
38    m_variables.push_back(var_sp);
39}
40
41bool
42VariableList::AddVariableIfUnique (const lldb::VariableSP &var_sp)
43{
44    if (FindVariableIndex (var_sp) == UINT32_MAX)
45    {
46        m_variables.push_back(var_sp);
47        return true;
48    }
49    return false;
50}
51
52void
53VariableList::AddVariables(VariableList *variable_list)
54{
55    if (variable_list)
56    {
57        std::copy(variable_list->m_variables.begin(), // source begin
58                  variable_list->m_variables.end(),   // source end
59                  back_inserter(m_variables));        // destination
60    }
61}
62
63void
64VariableList::Clear()
65{
66    m_variables.clear();
67}
68
69VariableSP
70VariableList::GetVariableAtIndex(size_t idx) const
71{
72    VariableSP var_sp;
73    if (idx < m_variables.size())
74        var_sp = m_variables[idx];
75    return var_sp;
76}
77
78VariableSP
79VariableList::RemoveVariableAtIndex(size_t idx)
80{
81    VariableSP var_sp;
82    if (idx < m_variables.size())
83    {
84        var_sp = m_variables[idx];
85        m_variables.erase (m_variables.begin() + idx);
86    }
87    return var_sp;
88}
89
90uint32_t
91VariableList::FindVariableIndex (const VariableSP &var_sp)
92{
93    iterator pos, end = m_variables.end();
94    for (pos = m_variables.begin(); pos != end; ++pos)
95    {
96        if (pos->get() == var_sp.get())
97            return std::distance (m_variables.begin(), pos);
98    }
99    return UINT32_MAX;
100}
101
102VariableSP
103VariableList::FindVariable(const ConstString& name)
104{
105    VariableSP var_sp;
106    iterator pos, end = m_variables.end();
107    for (pos = m_variables.begin(); pos != end; ++pos)
108    {
109        if ((*pos)->NameMatches(name))
110        {
111            var_sp = (*pos);
112            break;
113        }
114    }
115    return var_sp;
116}
117
118size_t
119VariableList::AppendVariablesIfUnique (const RegularExpression& regex, VariableList &var_list, size_t& total_matches)
120{
121    const size_t initial_size = var_list.GetSize();
122    iterator pos, end = m_variables.end();
123    for (pos = m_variables.begin(); pos != end; ++pos)
124    {
125        if ((*pos)->NameMatches (regex))
126        {
127            // Note the total matches found
128            total_matches++;
129            // Only add this variable if it isn't already in the "var_list"
130            var_list.AddVariableIfUnique (*pos);
131        }
132    }
133    // Return the number of new unique variables added to "var_list"
134    return var_list.GetSize() - initial_size;
135}
136
137size_t
138VariableList::AppendVariablesWithScope (lldb::ValueType type,
139                                        VariableList &var_list,
140                                        bool if_unique)
141{
142    const size_t initial_size = var_list.GetSize();
143    iterator pos, end = m_variables.end();
144    for (pos = m_variables.begin(); pos != end; ++pos)
145    {
146        if ((*pos)->GetScope() == type)
147        {
148            if (if_unique)
149                var_list.AddVariableIfUnique (*pos);
150            else
151                var_list.AddVariable(*pos);
152        }
153    }
154    // Return the number of new unique variables added to "var_list"
155    return var_list.GetSize() - initial_size;
156}
157
158uint32_t
159VariableList::FindIndexForVariable (Variable* variable)
160{
161    VariableSP var_sp;
162    iterator pos;
163    const iterator begin = m_variables.begin();
164    const iterator end = m_variables.end();
165    for (pos = m_variables.begin(); pos != end; ++pos)
166    {
167        if ((*pos).get() == variable)
168            return std::distance (begin, pos);
169    }
170    return UINT32_MAX;
171}
172
173size_t
174VariableList::MemorySize() const
175{
176    size_t mem_size = sizeof(VariableList);
177    const_iterator pos, end = m_variables.end();
178    for (pos = m_variables.begin(); pos != end; ++pos)
179        mem_size += (*pos)->MemorySize();
180    return mem_size;
181}
182
183size_t
184VariableList::GetSize() const
185{
186    return m_variables.size();
187}
188
189void
190VariableList::Dump(Stream *s, bool show_context) const
191{
192//  s.Printf("%.*p: ", (int)sizeof(void*) * 2, this);
193//  s.Indent();
194//  s << "VariableList\n";
195
196    const_iterator pos, end = m_variables.end();
197    for (pos = m_variables.begin(); pos != end; ++pos)
198    {
199        (*pos)->Dump(s, show_context);
200    }
201}
202