LibCxxAtomic.cpp revision 303241
1//===-- LibCxxAtomic.cpp ------------------------------------------*- 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#include "LibCxxAtomic.h"
11
12using namespace lldb;
13using namespace lldb_private;
14using namespace lldb_private::formatters;
15
16bool
17lldb_private::formatters::LibCxxAtomicSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options)
18{
19    static ConstString g___a_("__a_");
20
21    if (ValueObjectSP child = valobj.GetChildMemberWithName(g___a_, true))
22    {
23        std::string summary;
24        if (child->GetSummaryAsCString(summary, options) && summary.size() > 0)
25        {
26            stream.Printf("%s", summary.c_str());
27            return true;
28        }
29    }
30
31    return false;
32}
33
34namespace lldb_private {
35    namespace formatters {
36        class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd
37        {
38        public:
39            LibcxxStdAtomicSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
40
41            ~LibcxxStdAtomicSyntheticFrontEnd() override = default;
42
43            size_t
44            CalculateNumChildren() override;
45
46            lldb::ValueObjectSP
47            GetChildAtIndex(size_t idx) override;
48
49            bool
50            Update() override;
51
52            bool
53            MightHaveChildren() override;
54
55            size_t
56            GetIndexOfChildWithName(const ConstString &name) override;
57
58            lldb::ValueObjectSP
59            GetSyntheticValue () override;
60        private:
61            ValueObject *m_real_child;
62        };
63    } // namespace formatters
64} // namespace lldb_private
65
66lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::LibcxxStdAtomicSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
67    SyntheticChildrenFrontEnd(*valobj_sp),
68    m_real_child(nullptr)
69{
70}
71
72bool
73lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::Update()
74{
75    static ConstString g___a_("__a_");
76
77    m_real_child = m_backend.GetChildMemberWithName(g___a_, true).get();
78
79    return false;
80}
81
82bool
83lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::MightHaveChildren()
84{
85    return true;
86}
87
88size_t
89lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::CalculateNumChildren()
90{
91    return m_real_child ? m_real_child->GetNumChildren() : 0;
92}
93
94lldb::ValueObjectSP
95lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex(size_t idx)
96{
97    return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr;
98}
99
100size_t
101lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetIndexOfChildWithName(const ConstString &name)
102{
103    return m_real_child ? m_real_child->GetIndexOfChildWithName(name) : UINT32_MAX;
104}
105
106lldb::ValueObjectSP
107lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetSyntheticValue ()
108{
109    if (m_real_child && m_real_child->CanProvideValue())
110        return m_real_child->GetSP();
111    return nullptr;
112}
113
114SyntheticChildrenFrontEnd*
115lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
116{
117    if (valobj_sp)
118        return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp);
119    return nullptr;
120}
121
122