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