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