/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Utility/FileSpecList.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- FileSpecList.h ------------------------------------------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #ifndef LLDB_CORE_FILESPECLIST_H |
10 | | #define LLDB_CORE_FILESPECLIST_H |
11 | | |
12 | | #include "lldb/Utility/FileSpec.h" |
13 | | |
14 | | #include <cstddef> |
15 | | #include <vector> |
16 | | |
17 | | namespace lldb_private { |
18 | | class Stream; |
19 | | |
20 | | /// \class FileSpecList FileSpecList.h "lldb/Utility/FileSpecList.h" |
21 | | /// A file collection class. |
22 | | /// |
23 | | /// A class that contains a mutable list of FileSpec objects. |
24 | | class FileSpecList { |
25 | | public: |
26 | | typedef std::vector<FileSpec> collection; |
27 | | typedef collection::const_iterator const_iterator; |
28 | | |
29 | | /// Default constructor. |
30 | | /// |
31 | | /// Initialize this object with an empty file list. |
32 | | FileSpecList(); |
33 | | |
34 | | /// Copy constructor. |
35 | 499k | FileSpecList(const FileSpecList &rhs) = default; |
36 | | |
37 | | /// Move constructor |
38 | 693k | FileSpecList(FileSpecList &&rhs) = default; |
39 | | |
40 | | /// Initialize this object from a vector of FileSpecs |
41 | 14 | FileSpecList(std::vector<FileSpec> &&rhs) : m_files(std::move(rhs)) {} |
42 | | |
43 | | /// Destructor. |
44 | | ~FileSpecList(); |
45 | | |
46 | | /// Assignment operator. |
47 | | /// |
48 | | /// Replace the file list in this object with the file list from \a rhs. |
49 | | /// |
50 | | /// \param[in] rhs |
51 | | /// A file list object to copy. |
52 | | /// |
53 | | /// \return |
54 | | /// A const reference to this object. |
55 | 4.19k | FileSpecList &operator=(const FileSpecList &rhs) = default; |
56 | | |
57 | | /// Move-assignment operator. |
58 | 4.21k | FileSpecList &operator=(FileSpecList &&rhs) = default; |
59 | | |
60 | | /// Append a FileSpec object to the list. |
61 | | /// |
62 | | /// Appends \a file to the end of the file list. |
63 | | /// |
64 | | /// \param[in] file |
65 | | /// A new file to append to this file list. |
66 | | void Append(const FileSpec &file); |
67 | | |
68 | | /// Append a FileSpec object if unique. |
69 | | /// |
70 | | /// Appends \a file to the end of the file list if it doesn't already exist |
71 | | /// in the file list. |
72 | | /// |
73 | | /// \param[in] file |
74 | | /// A new file to append to this file list. |
75 | | /// |
76 | | /// \return |
77 | | /// \b true if the file was appended, \b false otherwise. |
78 | | bool AppendIfUnique(const FileSpec &file); |
79 | | |
80 | | /// Inserts a new FileSpec into the FileSpecList constructed in-place with |
81 | | /// the given arguments. |
82 | | /// |
83 | | /// \param[in] args |
84 | | /// Arguments to create the FileSpec |
85 | 45.7k | template <class... Args> void EmplaceBack(Args &&...args) { |
86 | 45.7k | m_files.emplace_back(std::forward<Args>(args)...); |
87 | 45.7k | } void lldb_private::FileSpecList::EmplaceBack<llvm::StringRef&>(llvm::StringRef&) Line | Count | Source | 85 | 15 | template <class... Args> void EmplaceBack(Args &&...args) { | 86 | 15 | m_files.emplace_back(std::forward<Args>(args)...); | 87 | 15 | } |
void lldb_private::FileSpecList::EmplaceBack<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, llvm::sys::path::Style&>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, llvm::sys::path::Style&) Line | Count | Source | 85 | 39.5k | template <class... Args> void EmplaceBack(Args &&...args) { | 86 | 39.5k | m_files.emplace_back(std::forward<Args>(args)...); | 87 | 39.5k | } |
void lldb_private::FileSpecList::EmplaceBack<char const (&) [16]>(char const (&) [16]) Line | Count | Source | 85 | 992 | template <class... Args> void EmplaceBack(Args &&...args) { | 86 | 992 | m_files.emplace_back(std::forward<Args>(args)...); | 87 | 992 | } |
void lldb_private::FileSpecList::EmplaceBack<char const (&) [18]>(char const (&) [18]) Line | Count | Source | 85 | 1.98k | template <class... Args> void EmplaceBack(Args &&...args) { | 86 | 1.98k | m_files.emplace_back(std::forward<Args>(args)...); | 87 | 1.98k | } |
void lldb_private::FileSpecList::EmplaceBack<char const (&) [20]>(char const (&) [20]) Line | Count | Source | 85 | 992 | template <class... Args> void EmplaceBack(Args &&...args) { | 86 | 992 | m_files.emplace_back(std::forward<Args>(args)...); | 87 | 992 | } |
Unexecuted instantiation: void lldb_private::FileSpecList::EmplaceBack<llvm::SmallString<128u>&>(llvm::SmallString<128u>&) void lldb_private::FileSpecList::EmplaceBack<char const*&>(char const*&) Line | Count | Source | 85 | 2.16k | template <class... Args> void EmplaceBack(Args &&...args) { | 86 | 2.16k | m_files.emplace_back(std::forward<Args>(args)...); | 87 | 2.16k | } |
|
88 | | |
89 | | /// Clears the file list. |
90 | | void Clear(); |
91 | | |
92 | | /// Dumps the file list to the supplied stream pointer "s". |
93 | | /// |
94 | | /// \param[in] s |
95 | | /// The stream that will be used to dump the object description. |
96 | | void Dump(Stream *s, const char *separator_cstr = "\n") const; |
97 | | |
98 | | /// Find a file index. |
99 | | /// |
100 | | /// Find the index of the file in the file spec list that matches \a file |
101 | | /// starting \a idx entries into the file spec list. |
102 | | /// |
103 | | /// \param[in] idx |
104 | | /// An index into the file list. |
105 | | /// |
106 | | /// \param[in] file |
107 | | /// The file specification to search for. |
108 | | /// |
109 | | /// \param[in] full |
110 | | /// Should FileSpec::Equal be called with "full" true or false. |
111 | | /// |
112 | | /// \return |
113 | | /// The index of the file that matches \a file if it is found, |
114 | | /// else UINT32_MAX is returned. |
115 | | size_t FindFileIndex(size_t idx, const FileSpec &file, bool full) const; |
116 | | |
117 | | /// Find a compatible file index. |
118 | | /// |
119 | | /// Find the index of a compatible file in the file spec list that matches \a |
120 | | /// file starting \a idx entries into the file spec list. A file is considered |
121 | | /// compatible if: |
122 | | /// - The file matches exactly (only filename if \a file has no directory) |
123 | | /// - If \a file is relative and any file in the list has this same suffix |
124 | | /// - If any file in the list is relative and the relative path is a suffix |
125 | | /// of \a file |
126 | | /// |
127 | | /// This is used to implement better matching for setting breakpoints in |
128 | | /// source files where an IDE might specify a full path when setting the |
129 | | /// breakpoint and debug info contains relative paths, if a user specifies |
130 | | /// a relative path when setting a breakpoint. |
131 | | /// |
132 | | /// \param[in] idx |
133 | | /// An index into the file list. |
134 | | /// |
135 | | /// \param[in] file |
136 | | /// The file specification to search for. |
137 | | /// |
138 | | /// \return |
139 | | /// The index of the file that matches \a file if it is found, |
140 | | /// else UINT32_MAX is returned. |
141 | | size_t FindCompatibleIndex(size_t idx, const FileSpec &file) const; |
142 | | |
143 | | /// Get file at index. |
144 | | /// |
145 | | /// Gets a file from the file list. If \a idx is not a valid index, an empty |
146 | | /// FileSpec object will be returned. The file objects that are returned can |
147 | | /// be tested using FileSpec::operator void*(). |
148 | | /// |
149 | | /// \param[in] idx |
150 | | /// An index into the file list. |
151 | | /// |
152 | | /// \return |
153 | | /// A copy of the FileSpec object at index \a idx. If \a idx |
154 | | /// is out of range, then an empty FileSpec object will be |
155 | | /// returned. |
156 | | const FileSpec &GetFileSpecAtIndex(size_t idx) const; |
157 | | |
158 | | /// Get file specification pointer at index. |
159 | | /// |
160 | | /// Gets a file from the file list. The file objects that are returned can |
161 | | /// be tested using FileSpec::operator void*(). |
162 | | /// |
163 | | /// \param[in] idx |
164 | | /// An index into the file list. |
165 | | /// |
166 | | /// \return |
167 | | /// A pointer to a contained FileSpec object at index \a idx. |
168 | | /// If \a idx is out of range, then an NULL is returned. |
169 | | const FileSpec *GetFileSpecPointerAtIndex(size_t idx) const; |
170 | | |
171 | | /// Get the memory cost of this object. |
172 | | /// |
173 | | /// Return the size in bytes that this object takes in memory. This returns |
174 | | /// the size in bytes of this object, not any shared string values it may |
175 | | /// refer to. |
176 | | /// |
177 | | /// \return |
178 | | /// The number of bytes that this object occupies in memory. |
179 | | size_t MemorySize() const; |
180 | | |
181 | 46 | bool IsEmpty() const { return m_files.empty(); } |
182 | | |
183 | | /// Get the number of files in the file list. |
184 | | /// |
185 | | /// \return |
186 | | /// The number of files in the file spec list. |
187 | | size_t GetSize() const; |
188 | | |
189 | 0 | bool Insert(size_t idx, const FileSpec &file) { |
190 | 0 | if (idx < m_files.size()) { |
191 | 0 | m_files.insert(m_files.begin() + idx, file); |
192 | 0 | return true; |
193 | 0 | } else if (idx == m_files.size()) { |
194 | 0 | m_files.push_back(file); |
195 | 0 | return true; |
196 | 0 | } |
197 | 0 | return false; |
198 | 0 | } |
199 | | |
200 | 1 | bool Replace(size_t idx, const FileSpec &file) { |
201 | 1 | if (idx < m_files.size()) { |
202 | 1 | m_files[idx] = file; |
203 | 1 | return true; |
204 | 1 | } |
205 | 0 | return false; |
206 | 1 | } |
207 | | |
208 | 0 | bool Remove(size_t idx) { |
209 | 0 | if (idx < m_files.size()) { |
210 | 0 | m_files.erase(m_files.begin() + idx); |
211 | 0 | return true; |
212 | 0 | } |
213 | 0 | return false; |
214 | 0 | } |
215 | | |
216 | | static size_t GetFilesMatchingPartialPath(const char *path, bool dir_okay, |
217 | | FileSpecList &matches); |
218 | | |
219 | 762 | const_iterator begin() const { return m_files.begin(); } |
220 | 762 | const_iterator end() const { return m_files.end(); } |
221 | | |
222 | | protected: |
223 | | collection m_files; ///< A collection of FileSpec objects. |
224 | | }; |
225 | | |
226 | | } // namespace lldb_private |
227 | | |
228 | | #endif // LLDB_CORE_FILESPECLIST_H |