Mangled.h revision 3f69eacbb218a37390822c89d3675bd740590382
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===-- Mangled.h -----------------------------------------------*- C++ -*-===//
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//                     The LLVM Compiler Infrastructure
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// This file is distributed under the University of Illinois Open Source
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// License. See LICENSE.TXT for details.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef liblldb_Mangled_h_
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define liblldb_Mangled_h_
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(__cplusplus)
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lldb/lldb-private.h"
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "lldb/Core/ConstString.h"
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <vector>
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectnamespace lldb_private {
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//----------------------------------------------------------------------
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// @class Mangled Mangled.h "lldb/Core/Mangled.h"
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// @brief A class that handles mangled names.
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project///
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// Designed to handle mangled names. The demangled version of any names
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// will be computed when the demangled name is accessed through the
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// Demangled() acccessor. This class can also tokenize the demangled
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// version of the name for powerful searches. Functions and symbols
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// could make instances of this class for their mangled names. Uniqued
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// string pools are used for the mangled, demangled, and token string
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/// values to allow for faster comparisons and for efficient memory use.
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//----------------------------------------------------------------------
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectclass Mangled
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpublic:
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //------------------------------------------------------------------
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Token type enumerations.
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //------------------------------------------------------------------
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    enum TokenType
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eInvalid,       ///< Invalid token value (unitialized value)
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eNameSpace,     ///< The token is a namespace name.
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eMethodName,    ///< The token is a global or class method name
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eType,          ///< The token is a language type
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eTemplate,      ///< The token is a template class
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eTemplateBeg,   ///< The token that indicates the start of a template parameters
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eTemplateEnd,   ///< The token that indicates the end of a template parameters
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eParamsBeg,     ///< The start of a method's parameters (the open parenthesis)
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eParamsEnd,     ///< The end of a method's parameters (the open parenthesis)
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eQualifier,     ///< A language qualifier
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        eError          ///< The token failed to parse
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    };
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    enum NamePreference
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ePreferMangled,
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ePreferDemangled
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    };
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //------------------------------------------------------------------
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Mangled::Token structure
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// As demangled names get tokenized, they get broken up into chunks
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// that have type enumerations (TokenType) and string values. Some of
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// the tokens are scopes (eTemplateBeg, eTemplateEnd, eParamsBeg,
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// eParamsEnd) that can indicate depth and searches can take
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// advantage of these to match using wildcards.
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// For example the mangled string:
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     "_ZNSbIhSt11char_traitsIhESaIhEE5eraseEmm"
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Demangles to:
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     "std::basic_string<unsigned char, std::char_traits<unsigned char>, std::allocator<unsigned char> >::erase(unsigned long, unsigned long)"
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// And tokenizes to:
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eNameSpace ("std")
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplate ("basic_string")
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplateBeg ()
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eType ("unsigned char")
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eNameSpace ("std")
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplate ("char_traits")
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplateBeg ()
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eType ("unsigned char")
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplateEnd ()
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eNameSpace ("std")
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplate ("allocator")
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplateBeg ()
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eType ("unsigned char"
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplateEnd ()
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eTemplateEnd ()
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eMethodName ("erase")
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eParamsBeg ()
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eType ("unsigned long")
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eType ("unsigned long")
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li eParamsEnd ()
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///------------------------------------------------------------------
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    struct Token
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Default constructor.
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Constructs this objet with an invalid token type and an
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// empty string.
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Token();
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Equal to operator.
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Tests if this object is equal to \a rhs.
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @param[in] rhs
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     A const Mangled::Token object reference to compare
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     this object to.
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @return
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     \b true if this object is equal to \a rhs, \b false
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     otherwise.
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        bool
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        operator== (const Token& rhs) const;
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Dump a description of this object to a Stream \a s.
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @param[in] s
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     The stream to which to dump the object descripton.
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        void
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Dump (Stream *s) const;
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Test if this token is a wildcard token.
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @return
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     Returns \b true if this token is a wildcard, \b false
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     otherwise.
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        bool
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        IsWildcard() const;
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Members
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        TokenType       type;   ///< The type of the token (Mangled::TokenType)
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ConstString value;  ///< The ConstString value associated with this token
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    };
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //------------------------------------------------------------------
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// A collection of tokens.
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// This class can be instantiated with a demangled names that can
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// be used as a query using the
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Mangled::TokenList::MatchesQuery(const TokenList&) const
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// function.
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //------------------------------------------------------------------
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    class TokenList
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    public:
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Construct with a demangled name.
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// If demangled is valid the token list will parse up the
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// demangled string it is given, else the object will
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// initialize an empty token list.
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        TokenList (const char *demangled = NULL);
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Destructor
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ~TokenList ();
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Clear the token list.
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        void
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Clear ();
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Dump a description of this object to a Stream \a s.
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @param[in] s
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     The stream to which to dump the object descripton.
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        void
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Dump (Stream *s) const;
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Find a token by Mangled::TokenType.
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Find the first token in the list that has \a token_type as
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// its type.
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        const Token*
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Find (TokenType token_type) const;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Get a token by index.
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @return
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     The token at index \a idx, or NULL if the index is out
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     of range.
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        const Token*
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        GetTokenAtIndex (uint32_t idx) const;
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Given a token list, see if it matches this object's tokens.
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// \a token_list can contain wild card values to enable powerful
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// matching. Matching the std::string::erase(*) example that was
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// tokenized above we could use a token list such as:
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     token           name
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     -----------     ----------------------------------------
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eNameSpace      "std"
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eTemplate       "basic_string"
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eTemplateBeg
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eInvalid        "*"
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eTemplateEnd
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eMethodName     "erase"
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eParamsBeg
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eInvalid        "*"
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     eParamsEnd
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @return
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     Returns \b true if it \a token_list matches this
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     object's tokens, \b false otherwise.
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        bool
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        MatchesQuery (const TokenList& token_list) const;
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Parses \a demangled into tokens.
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// This allows complex comparisons to be done on demangled names. Comparisons can
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// include wildcards at the namespace, method name, template,
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// and template and parameter type levels.
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Example queries include:
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// "std::basic_string<*>"  // Find all std::basic_string variants
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// "std::basic_string<*>::erase(*)"    // Find all std::basic_string::erase variants with any number of parameters
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// "*::clear()"            // Find all functions with a method name of
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///                         // "clear" that are in any namespace that
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///                         // have no parameters
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// "::printf"      // Find the printf function in the global namespace
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// "printf"        // Ditto
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// "foo::*(int)"   // Find all functions in the class or namespace "foo" that take a single integer argument
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @return
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     The number of tokens that were decoded, or zero if
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     decoding fails.
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        size_t
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Parse (const char *demangled);
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// Get the number of tokens in the list.
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        /// @return
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ///     The number of tokens in the token list.
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        size_t
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        Size () const;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    protected:
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        // Member variables.
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        //--------------------------------------------------------------
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        typedef std::vector<Token> collection; ///< The collection type for a list of Token objects.
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        collection m_tokens; ///< The token list.
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    private:
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        DISALLOW_COPY_AND_ASSIGN (TokenList);
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    };
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Default constructor.
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Initialize with both mangled and demangled names empty.
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Mangled ();
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Construct with name.
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Constructor with an optional string and a boolean indicating if it is
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// the mangled version.
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] name
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     The name to copy into this object.
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] is_mangled
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     If \b true then \a name is a mangled name, if \b false then
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     \a name is demangled.
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    explicit
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Mangled (const char *name, bool is_mangled);
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Destructor
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Releases its ref counts on the mangled and demangled strings that
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// live in the global string pool.
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ~Mangled ();
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Convert to pointer operator.
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// This allows code to check a Mangled object to see if it contains
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// a valid mangled name using code such as:
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @code
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Mangled mangled(...);
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// if (mangled)
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// { ...
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @endcode
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A pointer to this object if either the mangled or unmangled
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     name is set, NULL otherwise.
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    operator
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    void*() const;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Logical NOT operator.
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// This allows code to check a Mangled object to see if it contains
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// an empty mangled name using code such as:
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @code
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Mangled mangled(...);
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// if (!mangled)
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// { ...
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @endcode
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     Returns \b true if the object has an empty mangled and
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     unmangled name, \b false otherwise.
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    operator!() const;
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Clear the mangled and demangled values.
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    void
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Clear ();
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Compare the mangled string values
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Compares the Mangled::GetName() string in \a lhs and \a rhs.
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] lhs
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A const reference to the Left Hand Side object to compare.
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] rhs
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A const reference to the Right Hand Side object to compare.
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li -1 if \a lhs is less than \a rhs
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li 0 if \a lhs is equal to \a rhs
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     @li 1 if \a lhs is greater than \a rhs
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    static int
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Compare (const Mangled& lhs, const Mangled& rhs);
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Dump a description of this object to a Stream \a s.
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Dump a Mangled object to stream \a s. We don't force our
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// demangled name to be computed currently (we don't use the accessor).
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] s
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     The stream to which to dump the object descripton.
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    void
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    Dump (Stream *s) const;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Dump a debug description of this object to a Stream \a s.
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] s
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     The stream to which to dump the object descripton.
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    void
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    DumpDebug (Stream *s) const;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Demangled name get accessor.
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A const reference to the demangled name string object.
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const ConstString&
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    GetDemangledName () const;
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    void
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SetDemangledName (const char *name)
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        m_demangled.SetCString (name);
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    void
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SetMangledName (const char *name)
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        m_mangled.SetCString (name);
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Mangled name get accessor.
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A reference to the mangled name string object.
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ConstString&
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    GetMangledName ()
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return m_mangled;
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Mangled name get accessor.
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A const reference to the mangled name string object.
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const ConstString&
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    GetMangledName () const
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return m_mangled;
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Best name get accessor.
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] preference
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     Which name would you prefer to get?
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A const reference to the the preferred name string object if this
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     object has a valid name of that kind, else a const reference to the
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     other name is returned.
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const ConstString&
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    GetName (NamePreference preference = ePreferDemangled) const;
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Check if "name" matches either the mangled or demangled name.
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] name
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A name to match against both strings.
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     \b True if \a name matches either name, \b false otherwise.
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NameMatches (const ConstString &name) const
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (m_mangled == name)
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            return true;
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        return GetDemangledName () == name;
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NameMatches (const RegularExpression& regex) const;
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Generate the tokens from the demangled name.
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[out] tokens
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     A token list that will get filled in with the demangled tokens.
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     The number of tokens that were parsed and stored in \a tokens.
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    GetTokens (Mangled::TokenList &tokens) const;
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Get the memory cost of this object.
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Return the size in bytes that this object takes in memory. This
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// returns the size in bytes of this object, not any shared string
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// values it may refer to.
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @return
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     The number of bytes that this object occupies in memory.
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @see ConstString::StaticMemorySize ()
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MemorySize () const;
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Set the string value in this object.
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// If \a is_mangled is \b true, then the mangled named is set to \a
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// name, else the demangled name is set to \a name.
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] name
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     The name to copy into this object.
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// @param[in] is_mangled
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     If \b true then \a name is a mangled name, if \b false then
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///     \a name is demangled.
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    void
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SetValue (const char *name, bool is_mangled);
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectprivate:
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// Mangled member variables.
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //----------------------------------------------------------------------
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            ConstString m_mangled;      ///< The mangled version of the name
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    mutable ConstString m_demangled;    ///< Mutable so we can get it on demand with a const version of this object
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectStream& operator << (Stream& s, const Mangled& obj);
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectStream& operator << (Stream& s, const Mangled::TokenList& obj);
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectStream& operator << (Stream& s, const Mangled::Token& obj);
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} // namespace lldb_private
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif  // #if defined(__cplusplus)
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif  // liblldb_Mangled_h_
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project