1*dda28197Spatrick //===-- LibCxxQueue.cpp ---------------------------------------------------===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9061da546Spatrick #include "LibCxx.h" 10061da546Spatrick #include "lldb/DataFormatters/FormattersHelpers.h" 11061da546Spatrick 12061da546Spatrick using namespace lldb; 13061da546Spatrick using namespace lldb_private; 14061da546Spatrick 15061da546Spatrick namespace { 16061da546Spatrick 17061da546Spatrick class QueueFrontEnd : public SyntheticChildrenFrontEnd { 18061da546Spatrick public: QueueFrontEnd(ValueObject & valobj)19061da546Spatrick QueueFrontEnd(ValueObject &valobj) : SyntheticChildrenFrontEnd(valobj) { 20061da546Spatrick Update(); 21061da546Spatrick } 22061da546Spatrick GetIndexOfChildWithName(ConstString name)23061da546Spatrick size_t GetIndexOfChildWithName(ConstString name) override { 24061da546Spatrick return m_container_sp ? m_container_sp->GetIndexOfChildWithName(name) 25061da546Spatrick : UINT32_MAX; 26061da546Spatrick } 27061da546Spatrick MightHaveChildren()28061da546Spatrick bool MightHaveChildren() override { return true; } 29061da546Spatrick bool Update() override; 30061da546Spatrick CalculateNumChildren()31061da546Spatrick size_t CalculateNumChildren() override { 32061da546Spatrick return m_container_sp ? m_container_sp->GetNumChildren() : 0; 33061da546Spatrick } 34061da546Spatrick GetChildAtIndex(size_t idx)35061da546Spatrick ValueObjectSP GetChildAtIndex(size_t idx) override { 36061da546Spatrick return m_container_sp ? m_container_sp->GetChildAtIndex(idx, true) 37061da546Spatrick : nullptr; 38061da546Spatrick } 39061da546Spatrick 40061da546Spatrick private: 41061da546Spatrick // The lifetime of a ValueObject and all its derivative ValueObjects 42061da546Spatrick // (children, clones, etc.) is managed by a ClusterManager. These 43061da546Spatrick // objects are only destroyed when every shared pointer to any of them 44061da546Spatrick // is destroyed, so we must not store a shared pointer to any ValueObject 45061da546Spatrick // derived from our backend ValueObject (since we're in the same cluster). 46061da546Spatrick ValueObject* m_container_sp = nullptr; 47061da546Spatrick }; 48061da546Spatrick } // namespace 49061da546Spatrick Update()50061da546Spatrickbool QueueFrontEnd::Update() { 51061da546Spatrick m_container_sp = nullptr; 52061da546Spatrick ValueObjectSP c_sp = m_backend.GetChildMemberWithName(ConstString("c"), true); 53061da546Spatrick if (!c_sp) 54061da546Spatrick return false; 55061da546Spatrick m_container_sp = c_sp->GetSyntheticValue().get(); 56061da546Spatrick return false; 57061da546Spatrick } 58061da546Spatrick 59061da546Spatrick SyntheticChildrenFrontEnd * LibcxxQueueFrontEndCreator(CXXSyntheticChildren *,lldb::ValueObjectSP valobj_sp)60061da546Spatrickformatters::LibcxxQueueFrontEndCreator(CXXSyntheticChildren *, 61061da546Spatrick lldb::ValueObjectSP valobj_sp) { 62061da546Spatrick if (valobj_sp) 63061da546Spatrick return new QueueFrontEnd(*valobj_sp); 64061da546Spatrick return nullptr; 65061da546Spatrick } 66