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 
12 using namespace lldb;
13 using namespace lldb_private;
14 using namespace lldb_private::formatters;
15 
16 bool
17 lldb_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 
34 namespace 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 
66 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::LibcxxStdAtomicSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
67     SyntheticChildrenFrontEnd(*valobj_sp),
68     m_real_child(nullptr)
69 {
70 }
71 
72 bool
73 lldb_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 
82 bool
83 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::MightHaveChildren()
84 {
85     return true;
86 }
87 
88 size_t
89 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::CalculateNumChildren()
90 {
91     return m_real_child ? m_real_child->GetNumChildren() : 0;
92 }
93 
94 lldb::ValueObjectSP
95 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex(size_t idx)
96 {
97     return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr;
98 }
99 
100 size_t
101 lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetIndexOfChildWithName(const ConstString &name)
102 {
103     return m_real_child ? m_real_child->GetIndexOfChildWithName(name) : UINT32_MAX;
104 }
105 
106 lldb::ValueObjectSP
107 lldb_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 
114 SyntheticChildrenFrontEnd*
115 lldb_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