//===-- FileSpecList.h ------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_FileSpecList_h_
#define liblldb_FileSpecList_h_
#if defined(__cplusplus)

#include "lldb/Utility/FileSpec.h"

#include <vector>

#include <stddef.h>

namespace lldb_private {
class Stream;
}

namespace lldb_private {

//----------------------------------------------------------------------
/// @class FileSpecList FileSpecList.h "lldb/Core/FileSpecList.h"
/// 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.
  FileSpecList(const FileSpecList &rhs) = default;

  /// Move constructor
  FileSpecList(FileSpecList &&rhs) = default;

  /// Initialize this object from a vector of FileSpecs
  FileSpecList(std::vector<FileSpec> &&rhs) : m_files(std::move(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.
  //------------------------------------------------------------------
  FileSpecList &operator=(const FileSpecList &rhs) = default;

  /// Move-assignment operator.
  FileSpecList &operator=(FileSpecList &&rhs) = default;

  //------------------------------------------------------------------
  /// 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_
