//===-- SBTypeFormat.cpp ------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "lldb/lldb-python.h" #include "lldb/API/SBTypeFormat.h" #include "lldb/API/SBStream.h" #include "lldb/DataFormatters/DataVisualization.h" using namespace lldb; using namespace lldb_private; SBTypeFormat::SBTypeFormat() : m_opaque_sp() { } SBTypeFormat::SBTypeFormat (lldb::Format format, uint32_t options) : m_opaque_sp(TypeFormatImplSP(new TypeFormatImpl_Format(format,options))) { } SBTypeFormat::SBTypeFormat (const char* type, uint32_t options) : m_opaque_sp(TypeFormatImplSP(new TypeFormatImpl_EnumType(ConstString(type ? type : ""),options))) { } SBTypeFormat::SBTypeFormat (const lldb::SBTypeFormat &rhs) : m_opaque_sp(rhs.m_opaque_sp) { } SBTypeFormat::~SBTypeFormat () { } bool SBTypeFormat::IsValid() const { return m_opaque_sp.get() != NULL; } lldb::Format SBTypeFormat::GetFormat () { if (IsValid() && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeFormat) return ((TypeFormatImpl_Format*)m_opaque_sp.get())->GetFormat(); return lldb::eFormatInvalid; } const char* SBTypeFormat::GetTypeName () { if (IsValid() && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeEnum) return ((TypeFormatImpl_EnumType*)m_opaque_sp.get())->GetTypeName().AsCString(""); return ""; } uint32_t SBTypeFormat::GetOptions() { if (IsValid()) return m_opaque_sp->GetOptions(); return 0; } void SBTypeFormat::SetFormat (lldb::Format fmt) { if (CopyOnWrite_Impl(Type::eTypeFormat)) ((TypeFormatImpl_Format*)m_opaque_sp.get())->SetFormat(fmt); } void SBTypeFormat::SetTypeName (const char* type) { if (CopyOnWrite_Impl(Type::eTypeEnum)) ((TypeFormatImpl_EnumType*)m_opaque_sp.get())->SetTypeName(ConstString(type ? type : "")); } void SBTypeFormat::SetOptions (uint32_t value) { if (CopyOnWrite_Impl(Type::eTypeKeepSame)) m_opaque_sp->SetOptions(value); } bool SBTypeFormat::GetDescription (lldb::SBStream &description, lldb::DescriptionLevel description_level) { if (!IsValid()) return false; else { description.Printf("%s\n", m_opaque_sp->GetDescription().c_str()); return true; } } lldb::SBTypeFormat & SBTypeFormat::operator = (const lldb::SBTypeFormat &rhs) { if (this != &rhs) { m_opaque_sp = rhs.m_opaque_sp; } return *this; } bool SBTypeFormat::operator == (lldb::SBTypeFormat &rhs) { if (IsValid() == false) return !rhs.IsValid(); return m_opaque_sp == rhs.m_opaque_sp; } bool SBTypeFormat::IsEqualTo (lldb::SBTypeFormat &rhs) { if (IsValid() == false) return !rhs.IsValid(); if (GetFormat() == rhs.GetFormat()) return GetOptions() == rhs.GetOptions(); else return false; } bool SBTypeFormat::operator != (lldb::SBTypeFormat &rhs) { if (IsValid() == false) return !rhs.IsValid(); return m_opaque_sp != rhs.m_opaque_sp; } lldb::TypeFormatImplSP SBTypeFormat::GetSP () { return m_opaque_sp; } void SBTypeFormat::SetSP (const lldb::TypeFormatImplSP &typeformat_impl_sp) { m_opaque_sp = typeformat_impl_sp; } SBTypeFormat::SBTypeFormat (const lldb::TypeFormatImplSP &typeformat_impl_sp) : m_opaque_sp(typeformat_impl_sp) { } bool SBTypeFormat::CopyOnWrite_Impl(Type type) { if (!IsValid()) return false; if (m_opaque_sp.unique() && ((type == Type::eTypeKeepSame) || (type == Type::eTypeFormat && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeFormat) || (type == Type::eTypeEnum && m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeEnum)) ) return true; if (type == Type::eTypeKeepSame) { if (m_opaque_sp->GetType() == TypeFormatImpl::Type::eTypeFormat) type = Type::eTypeFormat; else type = Type::eTypeEnum; } if (type == Type::eTypeFormat) SetSP(TypeFormatImplSP(new TypeFormatImpl_Format(GetFormat(),GetOptions()))); else SetSP(TypeFormatImplSP(new TypeFormatImpl_EnumType(ConstString(GetTypeName()),GetOptions()))); return true; }