//===-- FileSpec.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 LLDB_UTILITY_FILESPEC_H #define LLDB_UTILITY_FILESPEC_H #include <functional> #include <optional> #include <string> #include "lldb/Utility/ConstString.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Path.h" #include <cstddef> #include <cstdint> namespace lldb_private { class Stream; } namespace llvm { class Triple; } namespace llvm { class raw_ostream; } namespace llvm { template <typename T> class SmallVectorImpl; } namespace lldb_private { /// \class FileSpec FileSpec.h "lldb/Utility/FileSpec.h" /// A file utility class. /// /// A file specification class that divides paths up into a directory /// and basename. These string values of the paths are put into uniqued string /// pools for fast comparisons and efficient memory usage. /// /// Another reason the paths are split into the directory and basename is to /// allow efficient debugger searching. Often in a debugger the user types in /// the basename of the file, for example setting a breakpoint by file and /// line, or specifying a module (shared library) to limit the scope in which /// to execute a command. The user rarely types in a full path. When the paths /// are already split up, it makes it easy for us to compare only the /// basenames of a lot of file specifications without having to split up the /// file path each time to get to the basename. class FileSpec { … }; /// Dump a FileSpec object to a stream Stream &operator<<(Stream &s, const FileSpec &f); } // namespace lldb_private namespace llvm { /// Implementation of format_provider<T> for FileSpec. /// /// The options string of a FileSpec has the grammar: /// /// file_spec_options :: (empty) | F | D /// /// ======================================================= /// | style | Meaning | Example | /// ------------------------------------------------------- /// | | | Input | Output | /// ======================================================= /// | F | Only print filename | /foo/bar | bar | /// | D | Only print directory | /foo/bar | /foo/ | /// | (empty) | Print file and dir | | | /// ======================================================= /// /// Any other value is considered an invalid format string. /// template <> struct format_provider<lldb_private::FileSpec> { … }; } // namespace llvm #endif // LLDB_UTILITY_FILESPEC_H