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