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