Home | History | Annotate | Download | only in Interpreter
      1 //===-- OptionValueArray.h --------------------------------------*- 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 #ifndef liblldb_OptionValueArray_h_
     11 #define liblldb_OptionValueArray_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 #include <vector>
     16 
     17 // Other libraries and framework includes
     18 // Project includes
     19 #include "lldb/Interpreter/OptionValue.h"
     20 
     21 namespace lldb_private {
     22 
     23 class OptionValueArray : public OptionValue
     24 {
     25 public:
     26     OptionValueArray (uint32_t type_mask = UINT32_MAX, bool raw_value_dump = false) :
     27         m_type_mask (type_mask),
     28         m_values (),
     29         m_raw_value_dump(raw_value_dump)
     30     {
     31     }
     32 
     33     virtual
     34     ~OptionValueArray()
     35     {
     36     }
     37 
     38     //---------------------------------------------------------------------
     39     // Virtual subclass pure virtual overrides
     40     //---------------------------------------------------------------------
     41 
     42     virtual OptionValue::Type
     43     GetType () const
     44     {
     45         return eTypeArray;
     46     }
     47 
     48     virtual void
     49     DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask);
     50 
     51     virtual Error
     52     SetValueFromCString (const char *value,
     53                          VarSetOperationType op = eVarSetOperationAssign);
     54 
     55     virtual bool
     56     Clear ()
     57     {
     58         m_values.clear();
     59         m_value_was_set = false;
     60         return true;
     61     }
     62 
     63     virtual lldb::OptionValueSP
     64     DeepCopy () const;
     65 
     66     virtual bool
     67     IsAggregateValue () const
     68     {
     69         return true;
     70     }
     71 
     72     virtual lldb::OptionValueSP
     73     GetSubValue (const ExecutionContext *exe_ctx,
     74                  const char *name,
     75                  bool will_modify,
     76                  Error &error) const;
     77 
     78     //---------------------------------------------------------------------
     79     // Subclass specific functions
     80     //---------------------------------------------------------------------
     81 
     82     size_t
     83     GetSize () const
     84     {
     85         return m_values.size();
     86     }
     87 
     88     lldb::OptionValueSP
     89     operator[](size_t idx) const
     90     {
     91         lldb::OptionValueSP value_sp;
     92         if (idx < m_values.size())
     93             value_sp = m_values[idx];
     94         return value_sp;
     95     }
     96 
     97     lldb::OptionValueSP
     98     GetValueAtIndex (size_t idx) const
     99     {
    100         lldb::OptionValueSP value_sp;
    101         if (idx < m_values.size())
    102             value_sp = m_values[idx];
    103         return value_sp;
    104     }
    105 
    106     bool
    107     AppendValue (const lldb::OptionValueSP &value_sp)
    108     {
    109         // Make sure the value_sp object is allowed to contain
    110         // values of the type passed in...
    111         if (value_sp && (m_type_mask & value_sp->GetTypeAsMask()))
    112         {
    113             m_values.push_back(value_sp);
    114             return true;
    115         }
    116         return false;
    117     }
    118 
    119     bool
    120     InsertValue (size_t idx, const lldb::OptionValueSP &value_sp)
    121     {
    122         // Make sure the value_sp object is allowed to contain
    123         // values of the type passed in...
    124         if (value_sp && (m_type_mask & value_sp->GetTypeAsMask()))
    125         {
    126             if (idx < m_values.size())
    127                 m_values.insert(m_values.begin() + idx, value_sp);
    128             else
    129                 m_values.push_back(value_sp);
    130             return true;
    131         }
    132         return false;
    133     }
    134 
    135     bool
    136     ReplaceValue (size_t idx, const lldb::OptionValueSP &value_sp)
    137     {
    138         // Make sure the value_sp object is allowed to contain
    139         // values of the type passed in...
    140         if (value_sp && (m_type_mask & value_sp->GetTypeAsMask()))
    141         {
    142             if (idx < m_values.size())
    143             {
    144                 m_values[idx] = value_sp;
    145                 return true;
    146             }
    147         }
    148         return false;
    149     }
    150 
    151     bool
    152     DeleteValue (size_t idx)
    153     {
    154         if (idx < m_values.size())
    155         {
    156             m_values.erase (m_values.begin() + idx);
    157             return true;
    158         }
    159         return false;
    160     }
    161 
    162     size_t
    163     GetArgs (Args &args) const;
    164 
    165     Error
    166     SetArgs (const Args &args, VarSetOperationType op);
    167 
    168 protected:
    169     typedef std::vector<lldb::OptionValueSP> collection;
    170 
    171     uint32_t m_type_mask;
    172     collection m_values;
    173     bool m_raw_value_dump;
    174 };
    175 
    176 } // namespace lldb_private
    177 
    178 #endif  // liblldb_OptionValueArray_h_
    179