1 //===-- LibCxxTuple.cpp -----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 #include "lldb/DataFormatters/FormattersHelpers.h"
14 using namespace lldb_private;
18 class TupleFrontEnd: public SyntheticChildrenFrontEnd {
20 TupleFrontEnd(ValueObject &valobj) : SyntheticChildrenFrontEnd(valobj) {
24 size_t GetIndexOfChildWithName(const ConstString &name) override {
25 return formatters::ExtractIndexFromString(name.GetCString());
28 bool MightHaveChildren() override { return true; }
29 bool Update() override;
30 size_t CalculateNumChildren() override { return m_elements.size(); }
31 ValueObjectSP GetChildAtIndex(size_t idx) override;
34 std::vector<ValueObjectSP> m_elements;
35 ValueObjectSP m_base_sp;
39 bool TupleFrontEnd::Update() {
41 m_base_sp = m_backend.GetChildMemberWithName(ConstString("__base_"), true);
43 // Pre r304382 name of the base element.
44 m_base_sp = m_backend.GetChildMemberWithName(ConstString("base_"), true);
48 m_elements.assign(m_base_sp->GetCompilerType().GetNumDirectBaseClasses(),
53 ValueObjectSP TupleFrontEnd::GetChildAtIndex(size_t idx) {
54 if (idx >= m_elements.size())
55 return ValueObjectSP();
57 return ValueObjectSP();
59 return m_elements[idx];
61 CompilerType holder_type =
62 m_base_sp->GetCompilerType().GetDirectBaseClassAtIndex(idx, nullptr);
64 return ValueObjectSP();
65 ValueObjectSP holder_sp = m_base_sp->GetChildAtIndex(idx, true);
67 return ValueObjectSP();
69 ValueObjectSP elem_sp = holder_sp->GetChildAtIndex(0, true);
72 elem_sp->Clone(ConstString(llvm::formatv("[{0}]", idx).str()));
74 return m_elements[idx];
77 SyntheticChildrenFrontEnd *
78 formatters::LibcxxTupleFrontEndCreator(CXXSyntheticChildren *,
79 lldb::ValueObjectSP valobj_sp) {
81 return new TupleFrontEnd(*valobj_sp);