xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Language/CPlusPlus/LibCxxQueue.cpp (revision dda2819751e49c83612958492e38917049128b41)
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()50061da546Spatrick bool 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)60061da546Spatrick formatters::LibcxxQueueFrontEndCreator(CXXSyntheticChildren *,
61061da546Spatrick                                        lldb::ValueObjectSP valobj_sp) {
62061da546Spatrick   if (valobj_sp)
63061da546Spatrick     return new QueueFrontEnd(*valobj_sp);
64061da546Spatrick   return nullptr;
65061da546Spatrick }
66