1254721Semaste//===-- SBTypeFormat.cpp ------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/lldb-python.h"
11254721Semaste
12254721Semaste#include "lldb/API/SBTypeFormat.h"
13254721Semaste
14254721Semaste#include "lldb/API/SBStream.h"
15254721Semaste
16254721Semaste#include "lldb/DataFormatters/DataVisualization.h"
17254721Semaste
18254721Semasteusing namespace lldb;
19254721Semasteusing namespace lldb_private;
20254721Semaste
21254721SemasteSBTypeFormat::SBTypeFormat() :
22254721Semastem_opaque_sp()
23254721Semaste{
24254721Semaste}
25254721Semaste
26254721SemasteSBTypeFormat::SBTypeFormat (lldb::Format format,
27254721Semaste                            uint32_t options)
28269024Semaste: m_opaque_sp(TypeFormatImplSP(new TypeFormatImpl_Format(format,options)))
29254721Semaste{
30254721Semaste}
31254721Semaste
32269024SemasteSBTypeFormat::SBTypeFormat (const char* type,
33269024Semaste                            uint32_t options)
34269024Semaste: m_opaque_sp(TypeFormatImplSP(new TypeFormatImpl_EnumType(ConstString(type ? type : ""),options)))
35269024Semaste{
36269024Semaste}
37269024Semaste
38254721SemasteSBTypeFormat::SBTypeFormat (const lldb::SBTypeFormat &rhs) :
39254721Semastem_opaque_sp(rhs.m_opaque_sp)
40254721Semaste{
41254721Semaste}
42254721Semaste
43254721SemasteSBTypeFormat::~SBTypeFormat ()
44254721Semaste{
45254721Semaste}
46254721Semaste
47254721Semastebool
48254721SemasteSBTypeFormat::IsValid() const
49254721Semaste{
50254721Semaste    return m_opaque_sp.get() != NULL;
51254721Semaste}
52254721Semaste
53254721Semastelldb::Format
54254721SemasteSBTypeFormat::GetFormat ()
55254721Semaste{
56269024Semaste    if (IsValid() && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeFormat)
57269024Semaste        return ((TypeFormatImpl_Format*)m_opaque_sp.get())->GetFormat();
58254721Semaste    return lldb::eFormatInvalid;
59254721Semaste}
60254721Semaste
61269024Semasteconst char*
62269024SemasteSBTypeFormat::GetTypeName ()
63269024Semaste{
64269024Semaste    if (IsValid() && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeEnum)
65269024Semaste        return ((TypeFormatImpl_EnumType*)m_opaque_sp.get())->GetTypeName().AsCString("");
66269024Semaste    return "";
67269024Semaste}
68269024Semaste
69254721Semasteuint32_t
70254721SemasteSBTypeFormat::GetOptions()
71254721Semaste{
72254721Semaste    if (IsValid())
73254721Semaste        return m_opaque_sp->GetOptions();
74254721Semaste    return 0;
75254721Semaste}
76254721Semaste
77254721Semastevoid
78254721SemasteSBTypeFormat::SetFormat (lldb::Format fmt)
79254721Semaste{
80269024Semaste    if (CopyOnWrite_Impl(Type::eTypeFormat))
81269024Semaste        ((TypeFormatImpl_Format*)m_opaque_sp.get())->SetFormat(fmt);
82254721Semaste}
83254721Semaste
84254721Semastevoid
85269024SemasteSBTypeFormat::SetTypeName (const char* type)
86269024Semaste{
87269024Semaste    if (CopyOnWrite_Impl(Type::eTypeEnum))
88269024Semaste        ((TypeFormatImpl_EnumType*)m_opaque_sp.get())->SetTypeName(ConstString(type ? type : ""));
89269024Semaste}
90269024Semaste
91269024Semastevoid
92254721SemasteSBTypeFormat::SetOptions (uint32_t value)
93254721Semaste{
94269024Semaste    if (CopyOnWrite_Impl(Type::eTypeKeepSame))
95254721Semaste        m_opaque_sp->SetOptions(value);
96254721Semaste}
97254721Semaste
98254721Semastebool
99254721SemasteSBTypeFormat::GetDescription (lldb::SBStream &description,
100254721Semaste                              lldb::DescriptionLevel description_level)
101254721Semaste{
102254721Semaste    if (!IsValid())
103254721Semaste        return false;
104254721Semaste    else {
105254721Semaste        description.Printf("%s\n",
106254721Semaste                           m_opaque_sp->GetDescription().c_str());
107254721Semaste        return true;
108254721Semaste    }
109254721Semaste}
110254721Semaste
111254721Semastelldb::SBTypeFormat &
112254721SemasteSBTypeFormat::operator = (const lldb::SBTypeFormat &rhs)
113254721Semaste{
114254721Semaste    if (this != &rhs)
115254721Semaste    {
116254721Semaste        m_opaque_sp = rhs.m_opaque_sp;
117254721Semaste    }
118254721Semaste    return *this;
119254721Semaste}
120254721Semaste
121254721Semastebool
122254721SemasteSBTypeFormat::operator == (lldb::SBTypeFormat &rhs)
123254721Semaste{
124254721Semaste    if (IsValid() == false)
125254721Semaste        return !rhs.IsValid();
126254721Semaste    return m_opaque_sp == rhs.m_opaque_sp;
127254721Semaste}
128254721Semaste
129254721Semastebool
130254721SemasteSBTypeFormat::IsEqualTo (lldb::SBTypeFormat &rhs)
131254721Semaste{
132254721Semaste    if (IsValid() == false)
133254721Semaste        return !rhs.IsValid();
134254721Semaste
135254721Semaste    if (GetFormat() == rhs.GetFormat())
136254721Semaste        return GetOptions() == rhs.GetOptions();
137254721Semaste    else
138254721Semaste        return false;
139254721Semaste}
140254721Semaste
141254721Semastebool
142254721SemasteSBTypeFormat::operator != (lldb::SBTypeFormat &rhs)
143254721Semaste{
144254721Semaste    if (IsValid() == false)
145254721Semaste        return !rhs.IsValid();
146254721Semaste    return m_opaque_sp != rhs.m_opaque_sp;
147254721Semaste}
148254721Semaste
149254721Semastelldb::TypeFormatImplSP
150254721SemasteSBTypeFormat::GetSP ()
151254721Semaste{
152254721Semaste    return m_opaque_sp;
153254721Semaste}
154254721Semaste
155254721Semastevoid
156254721SemasteSBTypeFormat::SetSP (const lldb::TypeFormatImplSP &typeformat_impl_sp)
157254721Semaste{
158254721Semaste    m_opaque_sp = typeformat_impl_sp;
159254721Semaste}
160254721Semaste
161254721SemasteSBTypeFormat::SBTypeFormat (const lldb::TypeFormatImplSP &typeformat_impl_sp) :
162254721Semaste    m_opaque_sp(typeformat_impl_sp)
163254721Semaste{
164254721Semaste}
165254721Semaste
166254721Semastebool
167269024SemasteSBTypeFormat::CopyOnWrite_Impl(Type type)
168254721Semaste{
169254721Semaste    if (!IsValid())
170254721Semaste        return false;
171269024Semaste
172269024Semaste    if (m_opaque_sp.unique() &&
173269024Semaste        ((type == Type::eTypeKeepSame) ||
174269024Semaste         (type == Type::eTypeFormat && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeFormat) ||
175269024Semaste         (type == Type::eTypeEnum && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeEnum))
176269024Semaste        )
177254721Semaste        return true;
178254721Semaste
179269024Semaste    if (type == Type::eTypeKeepSame)
180269024Semaste    {
181269024Semaste        if (m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeFormat)
182269024Semaste            type = Type::eTypeFormat;
183269024Semaste        else
184269024Semaste            type = Type::eTypeEnum;
185269024Semaste    }
186269024Semaste
187269024Semaste    if (type == Type::eTypeFormat)
188269024Semaste        SetSP(TypeFormatImplSP(new TypeFormatImpl_Format(GetFormat(),GetOptions())));
189269024Semaste    else
190269024Semaste        SetSP(TypeFormatImplSP(new TypeFormatImpl_EnumType(ConstString(GetTypeName()),GetOptions())));
191269024Semaste
192254721Semaste    return true;
193254721Semaste}
194