1 //===-- SBTypeFilter.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/lldb-python.h" 11 12 #include "lldb/API/SBTypeFilter.h" 13 14 #include "lldb/API/SBStream.h" 15 16 #include "lldb/DataFormatters/DataVisualization.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 SBTypeFilter::SBTypeFilter() : 22 m_opaque_sp() 23 { 24 } 25 26 SBTypeFilter::SBTypeFilter (uint32_t options) 27 : m_opaque_sp(TypeFilterImplSP(new TypeFilterImpl(options))) 28 { 29 } 30 31 SBTypeFilter::SBTypeFilter (const lldb::SBTypeFilter &rhs) : 32 m_opaque_sp(rhs.m_opaque_sp) 33 { 34 } 35 36 SBTypeFilter::~SBTypeFilter () 37 { 38 } 39 40 bool 41 SBTypeFilter::IsValid() const 42 { 43 return m_opaque_sp.get() != NULL; 44 } 45 46 uint32_t 47 SBTypeFilter::GetOptions() 48 { 49 if (IsValid()) 50 return m_opaque_sp->GetOptions(); 51 return 0; 52 } 53 54 void 55 SBTypeFilter::SetOptions (uint32_t value) 56 { 57 if (CopyOnWrite_Impl()) 58 m_opaque_sp->SetOptions(value); 59 } 60 61 bool 62 SBTypeFilter::GetDescription (lldb::SBStream &description, 63 lldb::DescriptionLevel description_level) 64 { 65 if (!IsValid()) 66 return false; 67 else { 68 description.Printf("%s\n", 69 m_opaque_sp->GetDescription().c_str()); 70 return true; 71 } 72 } 73 74 void 75 SBTypeFilter::Clear() 76 { 77 if (CopyOnWrite_Impl()) 78 m_opaque_sp->Clear(); 79 } 80 81 uint32_t 82 SBTypeFilter::GetNumberOfExpressionPaths() 83 { 84 if (IsValid()) 85 return m_opaque_sp->GetCount(); 86 return 0; 87 } 88 89 const char* 90 SBTypeFilter::GetExpressionPathAtIndex (uint32_t i) 91 { 92 if (IsValid()) 93 { 94 const char* item = m_opaque_sp->GetExpressionPathAtIndex(i); 95 if (item && *item == '.') 96 item++; 97 return item; 98 } 99 return NULL; 100 } 101 102 bool 103 SBTypeFilter::ReplaceExpressionPathAtIndex (uint32_t i, const char* item) 104 { 105 if (CopyOnWrite_Impl()) 106 return m_opaque_sp->SetExpressionPathAtIndex(i, item); 107 else 108 return false; 109 } 110 111 void 112 SBTypeFilter::AppendExpressionPath (const char* item) 113 { 114 if (CopyOnWrite_Impl()) 115 m_opaque_sp->AddExpressionPath(item); 116 } 117 118 lldb::SBTypeFilter & 119 SBTypeFilter::operator = (const lldb::SBTypeFilter &rhs) 120 { 121 if (this != &rhs) 122 { 123 m_opaque_sp = rhs.m_opaque_sp; 124 } 125 return *this; 126 } 127 128 bool 129 SBTypeFilter::operator == (lldb::SBTypeFilter &rhs) 130 { 131 if (IsValid() == false) 132 return !rhs.IsValid(); 133 134 return m_opaque_sp == rhs.m_opaque_sp; 135 } 136 137 bool 138 SBTypeFilter::IsEqualTo (lldb::SBTypeFilter &rhs) 139 { 140 if (IsValid() == false) 141 return !rhs.IsValid(); 142 143 if (GetNumberOfExpressionPaths() != rhs.GetNumberOfExpressionPaths()) 144 return false; 145 146 for (uint32_t j = 0; 147 j < GetNumberOfExpressionPaths(); 148 j++) 149 if ( strcmp(GetExpressionPathAtIndex(j),rhs.GetExpressionPathAtIndex(j)) != 0) 150 return false; 151 152 return GetOptions() == rhs.GetOptions(); 153 } 154 155 bool 156 SBTypeFilter::operator != (lldb::SBTypeFilter &rhs) 157 { 158 if (IsValid() == false) 159 return !rhs.IsValid(); 160 161 return m_opaque_sp != rhs.m_opaque_sp; 162 } 163 164 lldb::TypeFilterImplSP 165 SBTypeFilter::GetSP () 166 { 167 return m_opaque_sp; 168 } 169 170 void 171 SBTypeFilter::SetSP (const lldb::TypeFilterImplSP &typefilter_impl_sp) 172 { 173 m_opaque_sp = typefilter_impl_sp; 174 } 175 176 SBTypeFilter::SBTypeFilter (const lldb::TypeFilterImplSP &typefilter_impl_sp) : 177 m_opaque_sp(typefilter_impl_sp) 178 { 179 } 180 181 bool 182 SBTypeFilter::CopyOnWrite_Impl() 183 { 184 if (!IsValid()) 185 return false; 186 if (m_opaque_sp.unique()) 187 return true; 188 189 TypeFilterImplSP new_sp(new TypeFilterImpl(GetOptions())); 190 191 for (uint32_t j = 0; 192 j < GetNumberOfExpressionPaths(); 193 j++) 194 new_sp->AddExpressionPath(GetExpressionPathAtIndex(j)); 195 196 SetSP(new_sp); 197 198 return true; 199 } 200