resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmSourceFileLocation.h
1 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2    file Copyright.txt or https://cmake.org/licensing for details.  */
3 #pragma once
4
5 #include "cmConfigure.h" // IWYU pragma: keep
6
7 #include <string>
8
9 #include "cmSourceFileLocationKind.h"
10
11 class cmMakefile;
12
13 /** \class cmSourceFileLocation
14  * \brief cmSourceFileLocation tracks knowledge about a source file location
15  *
16  * Source files can be referenced by a variety of names.  The
17  * directory and/or extension may be omitted leading to a certain
18  * level of ambiguity about the source file location.  This class is
19  * used by cmSourceFile to keep track of what is known about the
20  * source file location.  Each reference may add some information
21  * about the directory or extension of the file.
22  */
23 class cmSourceFileLocation
24 {
25 public:
26   /**
27    * Construct for a source file created in a given cmMakefile
28    * instance with an initial name.
29    */
30   cmSourceFileLocation(
31     cmMakefile const* mf, const std::string& name,
32     cmSourceFileLocationKind kind = cmSourceFileLocationKind::Ambiguous);
33   cmSourceFileLocation();
34   cmSourceFileLocation(const cmSourceFileLocation& loc);
35
36   cmSourceFileLocation& operator=(cmSourceFileLocation const&) = delete;
37
38   /**
39    * Return whether the given source file location could refers to the
40    * same source file as this location given the level of ambiguity in
41    * each location.
42    */
43   bool Matches(cmSourceFileLocation const& loc);
44
45   /**
46    * Explicitly state that the source file is located in the source tree.
47    */
48   void DirectoryUseSource();
49
50   /**
51    * Explicitly state that the source file is located in the build tree.
52    */
53   void DirectoryUseBinary();
54
55   /**
56    * Return whether the directory containing the source is ambiguous.
57    */
58   bool DirectoryIsAmbiguous() const { return this->AmbiguousDirectory; }
59
60   /**
61    * Return whether the extension of the source name is ambiguous.
62    */
63   bool ExtensionIsAmbiguous() const { return this->AmbiguousExtension; }
64
65   /**
66    * Get the directory containing the file as best is currently known.
67    * If DirectoryIsAmbiguous() returns false this will be a full path.
68    * Otherwise it will be a relative path (possibly empty) that is
69    * either with respect to the source or build tree.
70    */
71   const std::string& GetDirectory() const { return this->Directory; }
72
73   /**
74    * Get the file name as best is currently known.  If
75    * ExtensionIsAmbiguous() returns true this name may not be the
76    * final name (but could be).  Otherwise the returned name is the
77    * final name.
78    */
79   const std::string& GetName() const { return this->Name; }
80
81   /**
82    * Get the full file path composed of GetDirectory() and GetName().
83    */
84   std::string GetFullPath() const;
85
86   /**
87    * Get the cmMakefile instance for which the source file was created.
88    */
89   cmMakefile const* GetMakefile() const { return this->Makefile; }
90
91 private:
92   cmMakefile const* const Makefile = nullptr;
93   bool AmbiguousDirectory = true;
94   bool AmbiguousExtension = true;
95   std::string Directory;
96   std::string Name;
97
98   bool MatchesAmbiguousExtension(cmSourceFileLocation const& loc) const;
99
100   // Update the location with additional knowledge.
101   void Update(cmSourceFileLocation const& loc);
102   void UpdateExtension(const std::string& name);
103 };