blob: f94bdae83c01aef9041390347a9db1aaa86dcefa [file] [log] [blame]
//===-- FileSpecList.h ------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_FileSpecList_h_
#define liblldb_FileSpecList_h_
#if defined(__cplusplus)
#include "lldb/lldb-private.h"
#include "lldb/Host/FileSpec.h"
#include <vector>
namespace lldb_private {
//----------------------------------------------------------------------
/// @class FileSpecList FileSpecList.h "lldb/Core/FileSpecList.h"
/// @brief A file collection class.
///
/// A class that contains a mutable list of FileSpec objects.
//----------------------------------------------------------------------
class FileSpecList
{
public:
//------------------------------------------------------------------
/// Default constructor.
///
/// Initialize this object with an empty file list.
//------------------------------------------------------------------
FileSpecList ();
//------------------------------------------------------------------
/// Copy constructor.
///
/// Initialize this object with a copy of the file list from \a rhs.
///
/// @param[in] rhs
/// A const reference to another file list object.
//------------------------------------------------------------------
FileSpecList (const FileSpecList &rhs);
//------------------------------------------------------------------
/// Destructor.
//------------------------------------------------------------------
~FileSpecList ();
//------------------------------------------------------------------
/// Assignment operator.
///
/// Replace the file list in this object with the file list from
/// \a rhs.
///
/// @param[in] rhs
/// A file list object to copy.
///
/// @return
/// A const reference to this object.
//------------------------------------------------------------------
const FileSpecList&
operator= (const FileSpecList &rhs);
//------------------------------------------------------------------
/// Append a FileSpec object to the list.
///
/// Appends \a file to the end of the file list.
///
/// @param[in] file
/// A new file to append to this file list.
//------------------------------------------------------------------
void
Append (const FileSpec &file);
//------------------------------------------------------------------
/// Append a FileSpec object if unique.
///
/// Appends \a file to the end of the file list if it doesn't
/// already exist in the file list.
///
/// @param[in] file
/// A new file to append to this file list.
///
/// @return
/// \b true if the file was appended, \b false otherwise.
//------------------------------------------------------------------
bool
AppendIfUnique (const FileSpec &file);
//------------------------------------------------------------------
/// Clears the file list.
//------------------------------------------------------------------
void
Clear ();
//------------------------------------------------------------------
/// Dumps the file list to the supplied stream pointer "s".
///
/// @param[in] s
/// The stream that will be used to dump the object description.
//------------------------------------------------------------------
void
Dump (Stream *s, const char *separator_cstr = "\n") const;
//------------------------------------------------------------------
/// Find a file index.
///
/// Find the index of the file in the file spec list that matches
/// \a file starting \a idx entries into the file spec list.
///
/// @param[in] idx
/// An index into the file list.
///
/// @param[in] file
/// The file specification to search for.
///
/// @param[in] full
/// Should FileSpec::Equal be called with "full" true or false.
///
/// @return
/// The index of the file that matches \a file if it is found,
/// else UINT32_MAX is returned.
//------------------------------------------------------------------
size_t
FindFileIndex (size_t idx, const FileSpec &file, bool full) const;
//------------------------------------------------------------------
/// Get file at index.
///
/// Gets a file from the file list. If \a idx is not a valid index,
/// an empty FileSpec object will be returned. The file objects
/// that are returned can be tested using
/// FileSpec::operator void*().
///
/// @param[in] idx
/// An index into the file list.
///
/// @return
/// A copy of the FileSpec object at index \a idx. If \a idx
/// is out of range, then an empty FileSpec object will be
/// returned.
//------------------------------------------------------------------
const FileSpec &
GetFileSpecAtIndex (size_t idx) const;
//------------------------------------------------------------------
/// Get file specification pointer at index.
///
/// Gets a file from the file list. The file objects that are
/// returned can be tested using FileSpec::operator void*().
///
/// @param[in] idx
/// An index into the file list.
///
/// @return
/// A pointer to a contained FileSpec object at index \a idx.
/// If \a idx is out of range, then an NULL is returned.
//------------------------------------------------------------------
const FileSpec *
GetFileSpecPointerAtIndex (size_t idx) const;
//------------------------------------------------------------------
/// Get the memory cost of this object.
///
/// Return the size in bytes that this object takes in memory. This
/// returns the size in bytes of this object, not any shared string
/// values it may refer to.
///
/// @return
/// The number of bytes that this object occupies in memory.
///
/// @see ConstString::StaticMemorySize ()
//------------------------------------------------------------------
size_t
MemorySize () const;
bool
IsEmpty() const
{
return m_files.empty();
}
//------------------------------------------------------------------
/// Get the number of files in the file list.
///
/// @return
/// The number of files in the file spec list.
//------------------------------------------------------------------
size_t
GetSize () const;
bool
Insert (size_t idx, const FileSpec &file)
{
if (idx < m_files.size())
{
m_files.insert(m_files.begin() + idx, file);
return true;
}
else if (idx == m_files.size())
{
m_files.push_back(file);
return true;
}
return false;
}
bool
Replace (size_t idx, const FileSpec &file)
{
if (idx < m_files.size())
{
m_files[idx] = file;
return true;
}
return false;
}
bool
Remove (size_t idx)
{
if (idx < m_files.size())
{
m_files.erase(m_files.begin() + idx);
return true;
}
return false;
}
static size_t GetFilesMatchingPartialPath (const char *path, bool dir_okay, FileSpecList &matches);
protected:
typedef std::vector<FileSpec> collection; ///< The collection type for the file list.
collection m_files; ///< A collection of FileSpec objects.
};
} // namespace lldb_private
#endif // #if defined(__cplusplus)
#endif // liblldb_FileSpecList_h_