1254721Semaste//===-- OptionValueArray.h --------------------------------------*- 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#ifndef liblldb_OptionValueArray_h_
11254721Semaste#define liblldb_OptionValueArray_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste#include <vector>
16254721Semaste
17254721Semaste// Other libraries and framework includes
18254721Semaste// Project includes
19254721Semaste#include "lldb/Interpreter/OptionValue.h"
20254721Semaste
21254721Semastenamespace lldb_private {
22254721Semaste
23254721Semasteclass OptionValueArray : public OptionValue
24254721Semaste{
25254721Semastepublic:
26254721Semaste    OptionValueArray (uint32_t type_mask = UINT32_MAX, bool raw_value_dump = false) :
27254721Semaste        m_type_mask (type_mask),
28254721Semaste        m_values (),
29254721Semaste        m_raw_value_dump(raw_value_dump)
30254721Semaste    {
31254721Semaste    }
32254721Semaste
33254721Semaste    virtual
34254721Semaste    ~OptionValueArray()
35254721Semaste    {
36254721Semaste    }
37254721Semaste
38254721Semaste    //---------------------------------------------------------------------
39254721Semaste    // Virtual subclass pure virtual overrides
40254721Semaste    //---------------------------------------------------------------------
41254721Semaste
42254721Semaste    virtual OptionValue::Type
43254721Semaste    GetType () const
44254721Semaste    {
45254721Semaste        return eTypeArray;
46254721Semaste    }
47254721Semaste
48254721Semaste    virtual void
49254721Semaste    DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask);
50254721Semaste
51254721Semaste    virtual Error
52254721Semaste    SetValueFromCString (const char *value,
53254721Semaste                         VarSetOperationType op = eVarSetOperationAssign);
54254721Semaste
55254721Semaste    virtual bool
56254721Semaste    Clear ()
57254721Semaste    {
58254721Semaste        m_values.clear();
59254721Semaste        m_value_was_set = false;
60254721Semaste        return true;
61254721Semaste    }
62254721Semaste
63254721Semaste    virtual lldb::OptionValueSP
64254721Semaste    DeepCopy () const;
65254721Semaste
66254721Semaste    virtual bool
67254721Semaste    IsAggregateValue () const
68254721Semaste    {
69254721Semaste        return true;
70254721Semaste    }
71254721Semaste
72254721Semaste    virtual lldb::OptionValueSP
73254721Semaste    GetSubValue (const ExecutionContext *exe_ctx,
74254721Semaste                 const char *name,
75254721Semaste                 bool will_modify,
76254721Semaste                 Error &error) const;
77254721Semaste
78254721Semaste    //---------------------------------------------------------------------
79254721Semaste    // Subclass specific functions
80254721Semaste    //---------------------------------------------------------------------
81254721Semaste
82254721Semaste    size_t
83254721Semaste    GetSize () const
84254721Semaste    {
85254721Semaste        return m_values.size();
86254721Semaste    }
87254721Semaste
88254721Semaste    lldb::OptionValueSP
89254721Semaste    operator[](size_t idx) const
90254721Semaste    {
91254721Semaste        lldb::OptionValueSP value_sp;
92254721Semaste        if (idx < m_values.size())
93254721Semaste            value_sp = m_values[idx];
94254721Semaste        return value_sp;
95254721Semaste    }
96254721Semaste
97254721Semaste    lldb::OptionValueSP
98254721Semaste    GetValueAtIndex (size_t idx) const
99254721Semaste    {
100254721Semaste        lldb::OptionValueSP value_sp;
101254721Semaste        if (idx < m_values.size())
102254721Semaste            value_sp = m_values[idx];
103254721Semaste        return value_sp;
104254721Semaste    }
105254721Semaste
106254721Semaste    bool
107254721Semaste    AppendValue (const lldb::OptionValueSP &value_sp)
108254721Semaste    {
109254721Semaste        // Make sure the value_sp object is allowed to contain
110254721Semaste        // values of the type passed in...
111254721Semaste        if (value_sp && (m_type_mask & value_sp->GetTypeAsMask()))
112254721Semaste        {
113254721Semaste            m_values.push_back(value_sp);
114254721Semaste            return true;
115254721Semaste        }
116254721Semaste        return false;
117254721Semaste    }
118254721Semaste
119254721Semaste    bool
120254721Semaste    InsertValue (size_t idx, const lldb::OptionValueSP &value_sp)
121254721Semaste    {
122254721Semaste        // Make sure the value_sp object is allowed to contain
123254721Semaste        // values of the type passed in...
124254721Semaste        if (value_sp && (m_type_mask & value_sp->GetTypeAsMask()))
125254721Semaste        {
126254721Semaste            if (idx < m_values.size())
127254721Semaste                m_values.insert(m_values.begin() + idx, value_sp);
128254721Semaste            else
129254721Semaste                m_values.push_back(value_sp);
130254721Semaste            return true;
131254721Semaste        }
132254721Semaste        return false;
133254721Semaste    }
134254721Semaste
135254721Semaste    bool
136254721Semaste    ReplaceValue (size_t idx, const lldb::OptionValueSP &value_sp)
137254721Semaste    {
138254721Semaste        // Make sure the value_sp object is allowed to contain
139254721Semaste        // values of the type passed in...
140254721Semaste        if (value_sp && (m_type_mask & value_sp->GetTypeAsMask()))
141254721Semaste        {
142254721Semaste            if (idx < m_values.size())
143254721Semaste            {
144254721Semaste                m_values[idx] = value_sp;
145254721Semaste                return true;
146254721Semaste            }
147254721Semaste        }
148254721Semaste        return false;
149254721Semaste    }
150254721Semaste
151254721Semaste    bool
152254721Semaste    DeleteValue (size_t idx)
153254721Semaste    {
154254721Semaste        if (idx < m_values.size())
155254721Semaste        {
156254721Semaste            m_values.erase (m_values.begin() + idx);
157254721Semaste            return true;
158254721Semaste        }
159254721Semaste        return false;
160254721Semaste    }
161254721Semaste
162254721Semaste    size_t
163254721Semaste    GetArgs (Args &args) const;
164254721Semaste
165254721Semaste    Error
166254721Semaste    SetArgs (const Args &args, VarSetOperationType op);
167254721Semaste
168254721Semasteprotected:
169254721Semaste    typedef std::vector<lldb::OptionValueSP> collection;
170254721Semaste
171254721Semaste    uint32_t m_type_mask;
172254721Semaste    collection m_values;
173254721Semaste    bool m_raw_value_dump;
174254721Semaste};
175254721Semaste
176254721Semaste} // namespace lldb_private
177254721Semaste
178254721Semaste#endif  // liblldb_OptionValueArray_h_
179