PathMappingList.h revision 87f0261992eb2fac7a3dee5e100833972a19f22d
1//===-- PathMappingList.h ---------------------------------------*- 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#ifndef liblldb_PathMappingList_h_
11#define liblldb_PathMappingList_h_
12
13// C Includes
14// C++ Includes
15#include <map>
16#include <vector>
17// Other libraries and framework includes
18#include "lldb/Core/ConstString.h"
19#include "lldb/Core/Error.h"
20// Project includes
21
22namespace lldb_private {
23
24class PathMappingList
25{
26public:
27
28    typedef void (*ChangedCallback) (const PathMappingList &path_list,
29                                     void *baton);
30
31    //------------------------------------------------------------------
32    // Constructors and Destructors
33    //------------------------------------------------------------------
34    PathMappingList ();
35
36    PathMappingList (ChangedCallback callback,
37                     void *callback_baton);
38
39    PathMappingList (const PathMappingList &rhs);
40
41    ~PathMappingList ();
42
43    const PathMappingList &
44    operator =(const PathMappingList &rhs);
45
46    void
47    Append (const ConstString &path, const ConstString &replacement, bool notify);
48
49    void
50    Append (const PathMappingList &rhs, bool notify);
51
52    void
53    Clear (bool notify);
54
55    // By default, dump all pairs.
56    void
57    Dump (Stream *s, int pair_index=-1);
58
59    bool
60    IsEmpty() const
61    {
62        return m_pairs.empty();
63    }
64
65    size_t
66    GetSize () const
67    {
68        return m_pairs.size();
69    }
70
71    bool
72    GetPathsAtIndex (uint32_t idx, ConstString &path, ConstString &new_path) const;
73
74    void
75    Insert (const ConstString &path,
76            const ConstString &replacement,
77            uint32_t insert_idx,
78            bool notify);
79
80    bool
81    Remove (off_t index, bool notify);
82
83    bool
84    Remove (const ConstString &path, bool notify);
85
86    bool
87    Replace (const ConstString &path,
88             const ConstString &replacement,
89             bool notify);
90
91    bool
92    Replace (const ConstString &path,
93             const ConstString &replacement,
94             uint32_t index,
95             bool notify);
96    bool
97    RemapPath (const ConstString &path, ConstString &new_path) const;
98
99    //------------------------------------------------------------------
100    /// Remaps a source file given \a path into \a new_path.
101    ///
102    /// Remaps \a path if any source remappings match. This function
103    /// does NOT stat the file system so it can be used in tight loops
104    /// where debug info is being parsed.
105    ///
106    /// @param[in] path
107    ///     The original source file path to try and remap.
108    ///
109    /// @param[out] new_path
110    ///     The newly remapped filespec that is may or may not exist.
111    ///
112    /// @return
113    ///     /b true if \a path was successfully located and \a new_path
114    ///     is filled in with a new source path, \b false otherwise.
115    //------------------------------------------------------------------
116    bool
117    RemapPath (const char *path, std::string &new_path) const;
118
119
120    //------------------------------------------------------------------
121    /// Finds a source file given a file spec using the path remappings.
122    ///
123    /// Tries to resolve \a orig_spec by checking the path remappings.
124    /// It makes sure the file exists by checking with the file system,
125    /// so this call can be expensive if the remappings are on a network
126    /// or are even on the local file system, so use this function
127    /// sparingly (not in a tight debug info parsing loop).
128    ///
129    /// @param[in] orig_spec
130    ///     The original source file path to try and remap.
131    ///
132    /// @param[out] new_spec
133    ///     The newly remapped filespec that is guaranteed to exist.
134    ///
135    /// @return
136    ///     /b true if \a orig_spec was successfully located and
137    ///     \a new_spec is filled in with an existing file spec,
138    ///     \b false otherwise.
139    //------------------------------------------------------------------
140    bool
141    FindFile (const FileSpec &orig_spec, FileSpec &new_spec) const;
142
143    uint32_t
144    FindIndexForPath (const ConstString &path) const;
145
146    uint32_t
147    GetModificationID() const
148    {
149        return m_mod_id;
150    }
151protected:
152    typedef std::pair <ConstString, ConstString> pair;
153    typedef std::vector <pair> collection;
154    typedef collection::iterator iterator;
155    typedef collection::const_iterator const_iterator;
156
157    iterator
158    FindIteratorForPath (const ConstString &path);
159
160    const_iterator
161    FindIteratorForPath (const ConstString &path) const;
162
163    collection m_pairs;
164    ChangedCallback m_callback;
165    void * m_callback_baton;
166    uint32_t m_mod_id; // Incremented anytime anything is added or removed.
167};
168
169} // namespace lldb_private
170
171#endif  // liblldb_PathMappingList_h_
172