FileSpecList.h revision 73844aa19a7360b662e2be710fc3c969d6c86606
1//===-- FileSpecList.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_FileSpecList_h_
11#define liblldb_FileSpecList_h_
12#if defined(__cplusplus)
13
14#include "lldb/lldb-private.h"
15#include "lldb/Host/FileSpec.h"
16#include <vector>
17
18namespace lldb_private {
19
20//----------------------------------------------------------------------
21/// @class FileSpecList FileSpecList.h "lldb/Core/FileSpecList.h"
22/// @brief A file collection class.
23///
24/// A class that contains a mutable list of FileSpec objects.
25//----------------------------------------------------------------------
26class FileSpecList
27{
28public:
29    //------------------------------------------------------------------
30    /// Default constructor.
31    ///
32    /// Initialize this object with an empty file list.
33    //------------------------------------------------------------------
34    FileSpecList ();
35
36    //------------------------------------------------------------------
37    /// Copy constructor.
38    ///
39    /// Initialize this object with a copy of the file list from \a rhs.
40    ///
41    /// @param[in] rhs
42    ///     A const reference to another file list object.
43    //------------------------------------------------------------------
44    FileSpecList (const FileSpecList &rhs);
45
46    //------------------------------------------------------------------
47    /// Destructor.
48    //------------------------------------------------------------------
49    ~FileSpecList ();
50
51    //------------------------------------------------------------------
52    /// Assignment operator.
53    ///
54    /// Replace the file list in this object with the file list from
55    /// \a rhs.
56    ///
57    /// @param[in] rhs
58    ///     A file list object to copy.
59    ///
60    /// @return
61    ///     A const reference to this object.
62    //------------------------------------------------------------------
63    const FileSpecList&
64    operator= (const FileSpecList &rhs);
65
66    //------------------------------------------------------------------
67    /// Append a FileSpec object to the list.
68    ///
69    /// Appends \a file to the end of the file list.
70    ///
71    /// @param[in] file
72    ///     A new file to append to this file list.
73    //------------------------------------------------------------------
74    void
75    Append (const FileSpec &file);
76
77    //------------------------------------------------------------------
78    /// Append a FileSpec object if unique.
79    ///
80    /// Appends \a file to the end of the file list if it doesn't
81    /// already exist in the file list.
82    ///
83    /// @param[in] file
84    ///     A new file to append to this file list.
85    ///
86    /// @return
87    ///     \b true if the file was appended, \b false otherwise.
88    //------------------------------------------------------------------
89    bool
90    AppendIfUnique (const FileSpec &file);
91
92    //------------------------------------------------------------------
93    /// Clears the file list.
94    //------------------------------------------------------------------
95    void
96    Clear ();
97
98    //------------------------------------------------------------------
99    /// Dumps the file list to the supplied stream pointer "s".
100    ///
101    /// @param[in] s
102    ///     The stream that will be used to dump the object description.
103    //------------------------------------------------------------------
104    void
105    Dump (Stream *s, const char *separator_cstr = "\n") const;
106
107    //------------------------------------------------------------------
108    /// Find a file index.
109    ///
110    /// Find the index of the file in the file spec list that matches
111    /// \a file starting \a idx entries into the file spec list.
112    ///
113    /// @param[in] idx
114    ///     An index into the file list.
115    ///
116    /// @param[in] file
117    ///     The file specification to search for.
118    ///
119    /// @param[in] full
120    ///     Should FileSpec::Equal be called with "full" true or false.
121    ///
122    /// @return
123    ///     The index of the file that matches \a file if it is found,
124    ///     else UINT32_MAX is returned.
125    //------------------------------------------------------------------
126    uint32_t
127    FindFileIndex (uint32_t idx, const FileSpec &file, bool full) const;
128
129    //------------------------------------------------------------------
130    /// Get file at index.
131    ///
132    /// Gets a file from the file list. If \a idx is not a valid index,
133    /// an empty FileSpec object will be returned. The file objects
134    /// that are returned can be tested using
135    /// FileSpec::operator void*().
136    ///
137    /// @param[in] idx
138    ///     An index into the file list.
139    ///
140    /// @return
141    ///     A copy of the FileSpec object at index \a idx. If \a idx
142    ///     is out of range, then an empty FileSpec object will be
143    ///     returned.
144    //------------------------------------------------------------------
145    const FileSpec &
146    GetFileSpecAtIndex (uint32_t idx) const;
147
148    //------------------------------------------------------------------
149    /// Get file specification pointer at index.
150    ///
151    /// Gets a file from the file list. The file objects that are
152    /// returned can be tested using FileSpec::operator void*().
153    ///
154    /// @param[in] idx
155    ///     An index into the file list.
156    ///
157    /// @return
158    ///     A pointer to a contained FileSpec object at index \a idx.
159    ///     If \a idx is out of range, then an NULL is returned.
160    //------------------------------------------------------------------
161    const FileSpec *
162    GetFileSpecPointerAtIndex (uint32_t idx) const;
163
164    //------------------------------------------------------------------
165    /// Get the memory cost of this object.
166    ///
167    /// Return the size in bytes that this object takes in memory. This
168    /// returns the size in bytes of this object, not any shared string
169    /// values it may refer to.
170    ///
171    /// @return
172    ///     The number of bytes that this object occupies in memory.
173    ///
174    /// @see ConstString::StaticMemorySize ()
175    //------------------------------------------------------------------
176    size_t
177    MemorySize () const;
178
179    //------------------------------------------------------------------
180    /// Get the number of files in the file list.
181    ///
182    /// @return
183    ///     The number of files in the file spec list.
184    //------------------------------------------------------------------
185    uint32_t
186    GetSize () const;
187
188    bool
189    Insert (uint32_t idx, const FileSpec &file)
190    {
191        if (idx < m_files.size())
192        {
193            m_files.insert(m_files.begin() + idx, file);
194            return true;
195        }
196        else if (idx == m_files.size())
197        {
198            m_files.push_back(file);
199            return true;
200        }
201        return false;
202    }
203
204    bool
205    Replace (uint32_t idx, const FileSpec &file)
206    {
207        if (idx < m_files.size())
208        {
209            m_files[idx] = file;
210            return true;
211        }
212        return false;
213    }
214
215    bool
216    Remove (uint32_t idx)
217    {
218        if (idx < m_files.size())
219        {
220            m_files.erase(m_files.begin() + idx);
221            return true;
222        }
223        return false;
224    }
225
226    static size_t GetFilesMatchingPartialPath (const char *path, bool dir_okay, FileSpecList &matches);
227
228protected:
229    typedef std::vector<FileSpec> collection;   ///< The collection type for the file list.
230    collection m_files; ///< A collection of FileSpec objects.
231};
232
233} // namespace lldb_private
234
235
236#endif  // #if defined(__cplusplus)
237#endif  // liblldb_FileSpecList_h_
238