180814287SRaphael Isemann //===-- SBTypeEnumMember.cpp ----------------------------------------------===//
2732215f9STodd Fiala //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6732215f9STodd Fiala //
7732215f9STodd Fiala //===----------------------------------------------------------------------===//
8732215f9STodd Fiala 
9bf9a7730SZachary Turner #include "lldb/API/SBTypeEnumMember.h"
10bd4bf82aSJonas Devlieghere #include "Utils.h"
11b9c1b51eSKate Stone #include "lldb/API/SBDefines.h"
12732215f9STodd Fiala #include "lldb/API/SBStream.h"
13bf9a7730SZachary Turner #include "lldb/API/SBType.h"
14a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h"
15732215f9STodd Fiala #include "lldb/Symbol/Type.h"
16*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
17bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
18732215f9STodd Fiala 
19796ac80bSJonas Devlieghere #include <memory>
20796ac80bSJonas Devlieghere 
21732215f9STodd Fiala using namespace lldb;
22732215f9STodd Fiala using namespace lldb_private;
23732215f9STodd Fiala 
SBTypeEnumMember()24*1755f5b1SJonas Devlieghere SBTypeEnumMember::SBTypeEnumMember() { LLDB_INSTRUMENT_VA(this); }
25732215f9STodd Fiala 
26866b7a65SJonas Devlieghere SBTypeEnumMember::~SBTypeEnumMember() = default;
27bd4bf82aSJonas Devlieghere 
SBTypeEnumMember(const lldb::TypeEnumMemberImplSP & enum_member_sp)28b9c1b51eSKate Stone SBTypeEnumMember::SBTypeEnumMember(
29b9c1b51eSKate Stone     const lldb::TypeEnumMemberImplSP &enum_member_sp)
30b9c1b51eSKate Stone     : m_opaque_sp(enum_member_sp) {}
31732215f9STodd Fiala 
SBTypeEnumMember(const SBTypeEnumMember & rhs)32a3436f73SKazu Hirata SBTypeEnumMember::SBTypeEnumMember(const SBTypeEnumMember &rhs) {
33*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
34baf5664fSJonas Devlieghere 
35bd4bf82aSJonas Devlieghere   m_opaque_sp = clone(rhs.m_opaque_sp);
36732215f9STodd Fiala }
37732215f9STodd Fiala 
operator =(const SBTypeEnumMember & rhs)38b9c1b51eSKate Stone SBTypeEnumMember &SBTypeEnumMember::operator=(const SBTypeEnumMember &rhs) {
39*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
40baf5664fSJonas Devlieghere 
41bd4bf82aSJonas Devlieghere   if (this != &rhs)
42bd4bf82aSJonas Devlieghere     m_opaque_sp = clone(rhs.m_opaque_sp);
43d232abc3SJonas Devlieghere   return *this;
44732215f9STodd Fiala }
45732215f9STodd Fiala 
IsValid() const46baf5664fSJonas Devlieghere bool SBTypeEnumMember::IsValid() const {
47*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
487f5237bcSPavel Labath   return this->operator bool();
497f5237bcSPavel Labath }
operator bool() const507f5237bcSPavel Labath SBTypeEnumMember::operator bool() const {
51*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
52baf5664fSJonas Devlieghere 
53baf5664fSJonas Devlieghere   return m_opaque_sp.get();
54baf5664fSJonas Devlieghere }
55732215f9STodd Fiala 
GetName()56b9c1b51eSKate Stone const char *SBTypeEnumMember::GetName() {
57*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
58baf5664fSJonas Devlieghere 
59732215f9STodd Fiala   if (m_opaque_sp.get())
60732215f9STodd Fiala     return m_opaque_sp->GetName().GetCString();
61248a1305SKonrad Kleine   return nullptr;
62732215f9STodd Fiala }
63732215f9STodd Fiala 
GetValueAsSigned()64b9c1b51eSKate Stone int64_t SBTypeEnumMember::GetValueAsSigned() {
65*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
66baf5664fSJonas Devlieghere 
67732215f9STodd Fiala   if (m_opaque_sp.get())
68732215f9STodd Fiala     return m_opaque_sp->GetValueAsSigned();
69732215f9STodd Fiala   return 0;
70732215f9STodd Fiala }
71732215f9STodd Fiala 
GetValueAsUnsigned()72b9c1b51eSKate Stone uint64_t SBTypeEnumMember::GetValueAsUnsigned() {
73*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
74baf5664fSJonas Devlieghere 
75732215f9STodd Fiala   if (m_opaque_sp.get())
76732215f9STodd Fiala     return m_opaque_sp->GetValueAsUnsigned();
77732215f9STodd Fiala   return 0;
78732215f9STodd Fiala }
79732215f9STodd Fiala 
GetType()80b9c1b51eSKate Stone SBType SBTypeEnumMember::GetType() {
81*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
82baf5664fSJonas Devlieghere 
83732215f9STodd Fiala   SBType sb_type;
84b9c1b51eSKate Stone   if (m_opaque_sp.get()) {
85732215f9STodd Fiala     sb_type.SetSP(m_opaque_sp->GetIntegerType());
86732215f9STodd Fiala   }
87d232abc3SJonas Devlieghere   return sb_type;
88732215f9STodd Fiala }
89732215f9STodd Fiala 
reset(TypeEnumMemberImpl * type_member_impl)90b9c1b51eSKate Stone void SBTypeEnumMember::reset(TypeEnumMemberImpl *type_member_impl) {
91732215f9STodd Fiala   m_opaque_sp.reset(type_member_impl);
92732215f9STodd Fiala }
93732215f9STodd Fiala 
ref()94b9c1b51eSKate Stone TypeEnumMemberImpl &SBTypeEnumMember::ref() {
95248a1305SKonrad Kleine   if (m_opaque_sp.get() == nullptr)
96796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<TypeEnumMemberImpl>();
97732215f9STodd Fiala   return *m_opaque_sp.get();
98732215f9STodd Fiala }
99732215f9STodd Fiala 
ref() const100b9c1b51eSKate Stone const TypeEnumMemberImpl &SBTypeEnumMember::ref() const {
101732215f9STodd Fiala   return *m_opaque_sp.get();
102732215f9STodd Fiala }
103732215f9STodd Fiala 
SBTypeEnumMemberList()104b9c1b51eSKate Stone SBTypeEnumMemberList::SBTypeEnumMemberList()
105baf5664fSJonas Devlieghere     : m_opaque_up(new TypeEnumMemberListImpl()) {
106*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
107baf5664fSJonas Devlieghere }
108732215f9STodd Fiala 
SBTypeEnumMemberList(const SBTypeEnumMemberList & rhs)109b9c1b51eSKate Stone SBTypeEnumMemberList::SBTypeEnumMemberList(const SBTypeEnumMemberList &rhs)
110d5b44036SJonas Devlieghere     : m_opaque_up(new TypeEnumMemberListImpl()) {
111*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
112baf5664fSJonas Devlieghere 
113b9c1b51eSKate Stone   for (uint32_t i = 0,
114b9c1b51eSKate Stone                 rhs_size = const_cast<SBTypeEnumMemberList &>(rhs).GetSize();
115b9c1b51eSKate Stone        i < rhs_size; i++)
116732215f9STodd Fiala     Append(const_cast<SBTypeEnumMemberList &>(rhs).GetTypeEnumMemberAtIndex(i));
117732215f9STodd Fiala }
118732215f9STodd Fiala 
IsValid()119baf5664fSJonas Devlieghere bool SBTypeEnumMemberList::IsValid() {
120*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1217f5237bcSPavel Labath   return this->operator bool();
1227f5237bcSPavel Labath }
operator bool() const1237f5237bcSPavel Labath SBTypeEnumMemberList::operator bool() const {
124*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
125baf5664fSJonas Devlieghere 
126248a1305SKonrad Kleine   return (m_opaque_up != nullptr);
127baf5664fSJonas Devlieghere }
128732215f9STodd Fiala 
129b9c1b51eSKate Stone SBTypeEnumMemberList &SBTypeEnumMemberList::
operator =(const SBTypeEnumMemberList & rhs)130b9c1b51eSKate Stone operator=(const SBTypeEnumMemberList &rhs) {
131*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
132baf5664fSJonas Devlieghere 
133b9c1b51eSKate Stone   if (this != &rhs) {
1341c0bbe43SJonas Devlieghere     m_opaque_up = std::make_unique<TypeEnumMemberListImpl>();
135b9c1b51eSKate Stone     for (uint32_t i = 0,
136b9c1b51eSKate Stone                   rhs_size = const_cast<SBTypeEnumMemberList &>(rhs).GetSize();
137b9c1b51eSKate Stone          i < rhs_size; i++)
138b9c1b51eSKate Stone       Append(
139b9c1b51eSKate Stone           const_cast<SBTypeEnumMemberList &>(rhs).GetTypeEnumMemberAtIndex(i));
140732215f9STodd Fiala   }
141d232abc3SJonas Devlieghere   return *this;
142732215f9STodd Fiala }
143732215f9STodd Fiala 
Append(SBTypeEnumMember enum_member)144b9c1b51eSKate Stone void SBTypeEnumMemberList::Append(SBTypeEnumMember enum_member) {
145*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, enum_member);
146baf5664fSJonas Devlieghere 
147732215f9STodd Fiala   if (enum_member.IsValid())
148d5b44036SJonas Devlieghere     m_opaque_up->Append(enum_member.m_opaque_sp);
149732215f9STodd Fiala }
150732215f9STodd Fiala 
151732215f9STodd Fiala SBTypeEnumMember
GetTypeEnumMemberAtIndex(uint32_t index)152b9c1b51eSKate Stone SBTypeEnumMemberList::GetTypeEnumMemberAtIndex(uint32_t index) {
153*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, index);
154baf5664fSJonas Devlieghere 
155d5b44036SJonas Devlieghere   if (m_opaque_up)
156d232abc3SJonas Devlieghere     return SBTypeEnumMember(m_opaque_up->GetTypeEnumMemberAtIndex(index));
157d232abc3SJonas Devlieghere   return SBTypeEnumMember();
158732215f9STodd Fiala }
159732215f9STodd Fiala 
GetSize()160baf5664fSJonas Devlieghere uint32_t SBTypeEnumMemberList::GetSize() {
161*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
162baf5664fSJonas Devlieghere 
163baf5664fSJonas Devlieghere   return m_opaque_up->GetSize();
164baf5664fSJonas Devlieghere }
165732215f9STodd Fiala 
166866b7a65SJonas Devlieghere SBTypeEnumMemberList::~SBTypeEnumMemberList() = default;
167732215f9STodd Fiala 
GetDescription(lldb::SBStream & description,lldb::DescriptionLevel description_level)168b9c1b51eSKate Stone bool SBTypeEnumMember::GetDescription(
169b9c1b51eSKate Stone     lldb::SBStream &description, lldb::DescriptionLevel description_level) {
170*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description, description_level);
171baf5664fSJonas Devlieghere 
172732215f9STodd Fiala   Stream &strm = description.ref();
173732215f9STodd Fiala 
174b9c1b51eSKate Stone   if (m_opaque_sp.get()) {
175b9c1b51eSKate Stone     if (m_opaque_sp->GetIntegerType()->GetDescription(strm,
176b9c1b51eSKate Stone                                                       description_level)) {
177732215f9STodd Fiala       strm.Printf(" %s", m_opaque_sp->GetName().GetCString());
178732215f9STodd Fiala     }
179b9c1b51eSKate Stone   } else {
180732215f9STodd Fiala     strm.PutCString("No value");
181732215f9STodd Fiala   }
182732215f9STodd Fiala   return true;
183732215f9STodd Fiala }
184