LibCxxAtomic.cpp revision 314564
1//===-- LibCxxAtomic.cpp ------------------------------------------*- C++
2//-*-===//
3//
4//                     The LLVM Compiler Infrastructure
5//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#include "LibCxxAtomic.h"
12
13using namespace lldb;
14using namespace lldb_private;
15using namespace lldb_private::formatters;
16
17bool lldb_private::formatters::LibCxxAtomicSummaryProvider(
18    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
19  static ConstString g___a_("__a_");
20
21  if (ValueObjectSP child = valobj.GetChildMemberWithName(g___a_, true)) {
22    std::string summary;
23    if (child->GetSummaryAsCString(summary, options) && summary.size() > 0) {
24      stream.Printf("%s", summary.c_str());
25      return true;
26    }
27  }
28
29  return false;
30}
31
32namespace lldb_private {
33namespace formatters {
34class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd {
35public:
36  LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
37
38  ~LibcxxStdAtomicSyntheticFrontEnd() override = default;
39
40  size_t CalculateNumChildren() override;
41
42  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
43
44  bool Update() override;
45
46  bool MightHaveChildren() override;
47
48  size_t GetIndexOfChildWithName(const ConstString &name) override;
49
50  lldb::ValueObjectSP GetSyntheticValue() override;
51
52private:
53  ValueObject *m_real_child;
54};
55} // namespace formatters
56} // namespace lldb_private
57
58lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
59    LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
60    : SyntheticChildrenFrontEnd(*valobj_sp), m_real_child(nullptr) {}
61
62bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::Update() {
63  static ConstString g___a_("__a_");
64
65  m_real_child = m_backend.GetChildMemberWithName(g___a_, true).get();
66
67  return false;
68}
69
70bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
71    MightHaveChildren() {
72  return true;
73}
74
75size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
76    CalculateNumChildren() {
77  return m_real_child ? m_real_child->GetNumChildren() : 0;
78}
79
80lldb::ValueObjectSP
81lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex(
82    size_t idx) {
83  return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr;
84}
85
86size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
87    GetIndexOfChildWithName(const ConstString &name) {
88  return m_real_child ? m_real_child->GetIndexOfChildWithName(name)
89                      : UINT32_MAX;
90}
91
92lldb::ValueObjectSP lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::
93    GetSyntheticValue() {
94  if (m_real_child && m_real_child->CanProvideValue())
95    return m_real_child->GetSP();
96  return nullptr;
97}
98
99SyntheticChildrenFrontEnd *
100lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator(
101    CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) {
102  if (valobj_sp)
103    return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp);
104  return nullptr;
105}
106