1 //===-- SBTypeEnumMember.cpp ---------------------------------- -*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "lldb/API/SBTypeEnumMember.h"
10 #include "Utils.h"
11 #include "lldb/API/SBDefines.h"
12 #include "lldb/API/SBStream.h"
13 #include "lldb/API/SBType.h"
14 #include "lldb/Symbol/CompilerType.h"
15 #include "lldb/Symbol/Type.h"
16 #include "lldb/Utility/Stream.h"
17 
18 #include <memory>
19 
20 using namespace lldb;
21 using namespace lldb_private;
22 
23 SBTypeEnumMember::SBTypeEnumMember() : m_opaque_sp() {}
24 
25 SBTypeEnumMember::~SBTypeEnumMember() {}
26 
27 SBTypeEnumMember::SBTypeEnumMember(
28     const lldb::TypeEnumMemberImplSP &enum_member_sp)
29     : m_opaque_sp(enum_member_sp) {}
30 
31 SBTypeEnumMember::SBTypeEnumMember(const SBTypeEnumMember &rhs)
32     : m_opaque_sp() {
33   m_opaque_sp = clone(rhs.m_opaque_sp);
34 }
35 
36 SBTypeEnumMember &SBTypeEnumMember::operator=(const SBTypeEnumMember &rhs) {
37   if (this != &rhs)
38     m_opaque_sp = clone(rhs.m_opaque_sp);
39   return *this;
40 }
41 
42 bool SBTypeEnumMember::IsValid() const { return m_opaque_sp.get(); }
43 
44 const char *SBTypeEnumMember::GetName() {
45   if (m_opaque_sp.get())
46     return m_opaque_sp->GetName().GetCString();
47   return NULL;
48 }
49 
50 int64_t SBTypeEnumMember::GetValueAsSigned() {
51   if (m_opaque_sp.get())
52     return m_opaque_sp->GetValueAsSigned();
53   return 0;
54 }
55 
56 uint64_t SBTypeEnumMember::GetValueAsUnsigned() {
57   if (m_opaque_sp.get())
58     return m_opaque_sp->GetValueAsUnsigned();
59   return 0;
60 }
61 
62 SBType SBTypeEnumMember::GetType() {
63   SBType sb_type;
64   if (m_opaque_sp.get()) {
65     sb_type.SetSP(m_opaque_sp->GetIntegerType());
66   }
67   return sb_type;
68 }
69 
70 void SBTypeEnumMember::reset(TypeEnumMemberImpl *type_member_impl) {
71   m_opaque_sp.reset(type_member_impl);
72 }
73 
74 TypeEnumMemberImpl &SBTypeEnumMember::ref() {
75   if (m_opaque_sp.get() == NULL)
76     m_opaque_sp = std::make_shared<TypeEnumMemberImpl>();
77   return *m_opaque_sp.get();
78 }
79 
80 const TypeEnumMemberImpl &SBTypeEnumMember::ref() const {
81   return *m_opaque_sp.get();
82 }
83 
84 SBTypeEnumMemberList::SBTypeEnumMemberList()
85     : m_opaque_up(new TypeEnumMemberListImpl()) {}
86 
87 SBTypeEnumMemberList::SBTypeEnumMemberList(const SBTypeEnumMemberList &rhs)
88     : m_opaque_up(new TypeEnumMemberListImpl()) {
89   for (uint32_t i = 0,
90                 rhs_size = const_cast<SBTypeEnumMemberList &>(rhs).GetSize();
91        i < rhs_size; i++)
92     Append(const_cast<SBTypeEnumMemberList &>(rhs).GetTypeEnumMemberAtIndex(i));
93 }
94 
95 bool SBTypeEnumMemberList::IsValid() { return (m_opaque_up != NULL); }
96 
97 SBTypeEnumMemberList &SBTypeEnumMemberList::
98 operator=(const SBTypeEnumMemberList &rhs) {
99   if (this != &rhs) {
100     m_opaque_up.reset(new TypeEnumMemberListImpl());
101     for (uint32_t i = 0,
102                   rhs_size = const_cast<SBTypeEnumMemberList &>(rhs).GetSize();
103          i < rhs_size; i++)
104       Append(
105           const_cast<SBTypeEnumMemberList &>(rhs).GetTypeEnumMemberAtIndex(i));
106   }
107   return *this;
108 }
109 
110 void SBTypeEnumMemberList::Append(SBTypeEnumMember enum_member) {
111   if (enum_member.IsValid())
112     m_opaque_up->Append(enum_member.m_opaque_sp);
113 }
114 
115 SBTypeEnumMember
116 SBTypeEnumMemberList::GetTypeEnumMemberAtIndex(uint32_t index) {
117   if (m_opaque_up)
118     return SBTypeEnumMember(m_opaque_up->GetTypeEnumMemberAtIndex(index));
119   return SBTypeEnumMember();
120 }
121 
122 uint32_t SBTypeEnumMemberList::GetSize() { return m_opaque_up->GetSize(); }
123 
124 SBTypeEnumMemberList::~SBTypeEnumMemberList() {}
125 
126 bool SBTypeEnumMember::GetDescription(
127     lldb::SBStream &description, lldb::DescriptionLevel description_level) {
128   Stream &strm = description.ref();
129 
130   if (m_opaque_sp.get()) {
131     if (m_opaque_sp->GetIntegerType()->GetDescription(strm,
132                                                       description_level)) {
133       strm.Printf(" %s", m_opaque_sp->GetName().GetCString());
134     }
135   } else {
136     strm.PutCString("No value");
137   }
138   return true;
139 }
140