1 //===-- SBTypeEnumMember.cpp ---------------------------------- -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/API/SBDefines.h"
11 #include "lldb/API/SBType.h"
12 #include "lldb/API/SBTypeEnumMember.h"
13 #include "lldb/API/SBStream.h"
14 #include "lldb/Core/Stream.h"
15 #include "lldb/Symbol/CompilerType.h"
16 #include "lldb/Symbol/Type.h"
17 
18 using namespace lldb;
19 using namespace lldb_private;
20 
21 SBTypeEnumMember::SBTypeEnumMember() :
22     m_opaque_sp()
23 {
24 }
25 
26 SBTypeEnumMember::~SBTypeEnumMember()
27 {
28 }
29 SBTypeEnumMember::SBTypeEnumMember (const lldb::TypeEnumMemberImplSP &enum_member_sp) :
30     m_opaque_sp(enum_member_sp)
31 {
32 }
33 
34 SBTypeEnumMember::SBTypeEnumMember (const SBTypeEnumMember& rhs) :
35     m_opaque_sp()
36 {
37     if (this != &rhs)
38     {
39         if (rhs.IsValid())
40             m_opaque_sp.reset(new TypeEnumMemberImpl(rhs.ref()));
41     }
42 }
43 
44 SBTypeEnumMember&
45 SBTypeEnumMember::operator = (const SBTypeEnumMember& rhs)
46 {
47     if (this != &rhs)
48     {
49         if (rhs.IsValid())
50             m_opaque_sp.reset(new TypeEnumMemberImpl(rhs.ref()));
51     }
52     return *this;
53 }
54 
55 bool
56 SBTypeEnumMember::IsValid() const
57 {
58     return m_opaque_sp.get();
59 }
60 
61 const char *
62 SBTypeEnumMember::GetName ()
63 {
64     if (m_opaque_sp.get())
65         return m_opaque_sp->GetName().GetCString();
66     return NULL;
67 }
68 
69 int64_t
70 SBTypeEnumMember::GetValueAsSigned()
71 {
72     if (m_opaque_sp.get())
73         return m_opaque_sp->GetValueAsSigned();
74     return 0;
75 }
76 
77 uint64_t
78 SBTypeEnumMember::GetValueAsUnsigned()
79 {
80     if (m_opaque_sp.get())
81         return m_opaque_sp->GetValueAsUnsigned();
82     return 0;
83 }
84 
85 SBType
86 SBTypeEnumMember::GetType ()
87 {
88     SBType sb_type;
89     if (m_opaque_sp.get())
90     {
91         sb_type.SetSP(m_opaque_sp->GetIntegerType());
92     }
93     return sb_type;
94 
95 }
96 
97 void
98 SBTypeEnumMember::reset(TypeEnumMemberImpl *type_member_impl)
99 {
100     m_opaque_sp.reset(type_member_impl);
101 }
102 
103 TypeEnumMemberImpl &
104 SBTypeEnumMember::ref ()
105 {
106     if (m_opaque_sp.get() == NULL)
107         m_opaque_sp.reset (new TypeEnumMemberImpl());
108     return *m_opaque_sp.get();
109 }
110 
111 const TypeEnumMemberImpl &
112 SBTypeEnumMember::ref () const
113 {
114     return *m_opaque_sp.get();
115 }
116 
117 
118 SBTypeEnumMemberList::SBTypeEnumMemberList() :
119     m_opaque_ap(new TypeEnumMemberListImpl())
120 {
121 }
122 
123 SBTypeEnumMemberList::SBTypeEnumMemberList(const SBTypeEnumMemberList& rhs) :
124     m_opaque_ap(new TypeEnumMemberListImpl())
125 {
126     for (uint32_t i = 0, rhs_size = const_cast<SBTypeEnumMemberList&>(rhs).GetSize(); i < rhs_size; i++)
127         Append(const_cast<SBTypeEnumMemberList&>(rhs).GetTypeEnumMemberAtIndex(i));
128 }
129 
130 bool
131 SBTypeEnumMemberList::IsValid ()
132 {
133     return (m_opaque_ap.get() != NULL);
134 }
135 
136 SBTypeEnumMemberList&
137 SBTypeEnumMemberList::operator = (const SBTypeEnumMemberList& rhs)
138 {
139     if (this != &rhs)
140     {
141         m_opaque_ap.reset (new TypeEnumMemberListImpl());
142         for (uint32_t i = 0, rhs_size = const_cast<SBTypeEnumMemberList&>(rhs).GetSize(); i < rhs_size; i++)
143             Append(const_cast<SBTypeEnumMemberList&>(rhs).GetTypeEnumMemberAtIndex(i));
144     }
145     return *this;
146 }
147 
148 void
149 SBTypeEnumMemberList::Append (SBTypeEnumMember enum_member)
150 {
151     if (enum_member.IsValid())
152         m_opaque_ap->Append (enum_member.m_opaque_sp);
153 }
154 
155 SBTypeEnumMember
156 SBTypeEnumMemberList::GetTypeEnumMemberAtIndex(uint32_t index)
157 {
158     if (m_opaque_ap.get())
159         return SBTypeEnumMember(m_opaque_ap->GetTypeEnumMemberAtIndex(index));
160     return SBTypeEnumMember();
161 }
162 
163 uint32_t
164 SBTypeEnumMemberList::GetSize()
165 {
166     return m_opaque_ap->GetSize();
167 }
168 
169 SBTypeEnumMemberList::~SBTypeEnumMemberList()
170 {
171 }
172 
173 bool
174 SBTypeEnumMember::GetDescription (lldb::SBStream &description,
175                                   lldb::DescriptionLevel description_level)
176 {
177     Stream &strm = description.ref();
178 
179     if (m_opaque_sp.get())
180     {
181         if( m_opaque_sp->GetIntegerType()->GetDescription(strm, description_level) )
182         {
183             strm.Printf(" %s", m_opaque_sp->GetName().GetCString());
184         }
185     }
186     else
187     {
188         strm.PutCString ("No value");
189     }
190     return true;
191 }
192