27 explicit LibStdcppTupleSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
31 lldb::ValueObjectSP GetChildAtIndex(
size_t idx)
override;
33 bool Update()
override;
35 bool MightHaveChildren()
override;
37 size_t GetIndexOfChildWithName(
ConstString name)
override;
45 std::vector<ValueObject*> m_members;
50 LibStdcppTupleSyntheticFrontEnd::LibStdcppTupleSyntheticFrontEnd(
51 lldb::ValueObjectSP valobj_sp)
56 bool LibStdcppTupleSyntheticFrontEnd::Update() {
59 ValueObjectSP valobj_backend_sp = m_backend.GetSP();
60 if (!valobj_backend_sp)
63 ValueObjectSP next_child_sp = valobj_backend_sp->GetNonSyntheticValue();
64 while (next_child_sp !=
nullptr) {
65 ValueObjectSP current_child = next_child_sp;
66 next_child_sp =
nullptr;
68 size_t child_count = current_child->GetNumChildren();
69 for (
size_t i = 0; i < child_count; ++i) {
70 ValueObjectSP child_sp = current_child->GetChildAtIndex(i,
true);
71 llvm::StringRef name_str = child_sp->GetName().GetStringRef();
72 if (name_str.startswith(
"std::_Tuple_impl<")) {
73 next_child_sp = child_sp;
74 }
else if (name_str.startswith(
"std::_Head_base<")) {
75 ValueObjectSP value_sp =
76 child_sp->GetChildMemberWithName(
ConstString(
"_M_head_impl"),
true);
79 name.
Printf(
"[%zd]", m_members.size());
89 bool LibStdcppTupleSyntheticFrontEnd::MightHaveChildren() {
return true; }
92 LibStdcppTupleSyntheticFrontEnd::GetChildAtIndex(
size_t idx) {
93 if (idx < m_members.size() && m_members[idx])
94 return m_members[idx]->GetSP();
95 return lldb::ValueObjectSP();
99 return m_members.size();
102 size_t LibStdcppTupleSyntheticFrontEnd::GetIndexOfChildWithName(
110 return (valobj_sp ?
new LibStdcppTupleSyntheticFrontEnd(valobj_sp) :
nullptr);