1 //===-- SBTypeNameSpecifier.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/SBTypeNameSpecifier.h"
11 
12 #include "lldb/API/SBStream.h"
13 #include "lldb/API/SBType.h"
14 
15 #include "lldb/Core/DataVisualization.h"
16 
17 using namespace lldb;
18 using namespace lldb_private;
19 
20 SBTypeNameSpecifier::SBTypeNameSpecifier() :
21 m_opaque_sp()
22 {
23 }
24 
25 SBTypeNameSpecifier::SBTypeNameSpecifier (const char* name,
26                                           bool is_regex) :
27 m_opaque_sp(new TypeNameSpecifierImpl(name, is_regex))
28 {
29     if (name == NULL || (*name) == 0)
30         m_opaque_sp.reset();
31 }
32 
33 SBTypeNameSpecifier::SBTypeNameSpecifier (SBType type) :
34 m_opaque_sp()
35 {
36     if (type.IsValid())
37         m_opaque_sp = TypeNameSpecifierImplSP(new TypeNameSpecifierImpl(type.m_opaque_sp->GetClangASTType()));
38 }
39 
40 SBTypeNameSpecifier::SBTypeNameSpecifier (const lldb::SBTypeNameSpecifier &rhs) :
41 m_opaque_sp(rhs.m_opaque_sp)
42 {}
43 
44 SBTypeNameSpecifier::~SBTypeNameSpecifier ()
45 {
46 }
47 
48 bool
49 SBTypeNameSpecifier::IsValid() const
50 {
51     return m_opaque_sp.get() != NULL;
52 }
53 
54 const char*
55 SBTypeNameSpecifier::GetName ()
56 {
57     if (!IsValid())
58         return NULL;
59 
60     return m_opaque_sp->GetName();
61 }
62 
63 SBType
64 SBTypeNameSpecifier::GetType ()
65 {
66     if (!IsValid())
67         return SBType();
68     lldb_private::ClangASTType c_type = m_opaque_sp->GetClangASTType();
69     if (c_type.IsValid())
70         return SBType(c_type);
71     return SBType();
72 }
73 
74 bool
75 SBTypeNameSpecifier::IsRegex ()
76 {
77     if (!IsValid())
78         return false;
79 
80     return m_opaque_sp->IsRegex();
81 }
82 
83 bool
84 SBTypeNameSpecifier::GetDescription (lldb::SBStream &description,
85                                      lldb::DescriptionLevel description_level)
86 {
87     if (!IsValid())
88         return false;
89     description.Printf("SBTypeNameSpecifier(%s,%s)", GetName(), IsRegex() ? "regex" : "plain");
90     return true;
91 }
92 
93 lldb::SBTypeNameSpecifier &
94 SBTypeNameSpecifier::operator = (const lldb::SBTypeNameSpecifier &rhs)
95 {
96     if (this != &rhs)
97     {
98         m_opaque_sp = rhs.m_opaque_sp;
99     }
100     return *this;
101 }
102 
103 bool
104 SBTypeNameSpecifier::operator == (lldb::SBTypeNameSpecifier &rhs)
105 {
106     if (IsValid() == false)
107         return !rhs.IsValid();
108     return m_opaque_sp == rhs.m_opaque_sp;
109 }
110 
111 bool
112 SBTypeNameSpecifier::IsEqualTo (lldb::SBTypeNameSpecifier &rhs)
113 {
114     if (IsValid() == false)
115         return !rhs.IsValid();
116 
117     if (IsRegex() != rhs.IsRegex())
118         return false;
119 
120     return (strcmp(GetName(), rhs.GetName()) == 0);
121 }
122 
123 bool
124 SBTypeNameSpecifier::operator != (lldb::SBTypeNameSpecifier &rhs)
125 {
126     if (IsValid() == false)
127         return !rhs.IsValid();
128     return m_opaque_sp != rhs.m_opaque_sp;
129 }
130 
131 lldb::TypeNameSpecifierImplSP
132 SBTypeNameSpecifier::GetSP ()
133 {
134     return m_opaque_sp;
135 }
136 
137 void
138 SBTypeNameSpecifier::SetSP (const lldb::TypeNameSpecifierImplSP &type_namespec_sp)
139 {
140     m_opaque_sp = type_namespec_sp;
141 }
142 
143 SBTypeNameSpecifier::SBTypeNameSpecifier (const lldb::TypeNameSpecifierImplSP &type_namespec_sp) :
144 m_opaque_sp(type_namespec_sp)
145 {
146 }
147