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