aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cmakeprojectmanager/3rdparty/cmake/cmListFileCache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cmakeprojectmanager/3rdparty/cmake/cmListFileCache.h')
-rw-r--r--src/plugins/cmakeprojectmanager/3rdparty/cmake/cmListFileCache.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/plugins/cmakeprojectmanager/3rdparty/cmake/cmListFileCache.h b/src/plugins/cmakeprojectmanager/3rdparty/cmake/cmListFileCache.h
new file mode 100644
index 00000000000..4b419e7a5a4
--- /dev/null
+++ b/src/plugins/cmakeprojectmanager/3rdparty/cmake/cmListFileCache.h
@@ -0,0 +1,114 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#pragma once
+
+#include <algorithm>
+#include <iosfwd>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+/** \class cmListFileCache
+ * \brief A class to cache list file contents.
+ *
+ * cmListFileCache is a class used to cache the contents of parsed
+ * cmake list files.
+ */
+
+struct cmListFileArgument
+{
+ enum Delimiter
+ {
+ Unquoted,
+ Quoted,
+ Bracket
+ };
+ cmListFileArgument() = default;
+ cmListFileArgument(std::string v, Delimiter d, long line, long column)
+ : Value(std::move(v))
+ , Delim(d)
+ , Line(line)
+ , Column(column)
+ {
+ }
+ bool operator==(const cmListFileArgument& r) const
+ {
+ return (this->Value == r.Value) && (this->Delim == r.Delim);
+ }
+ bool operator!=(const cmListFileArgument& r) const { return !(*this == r); }
+ std::string Value;
+ Delimiter Delim = Unquoted;
+ long Line = 0;
+ long Column = 0;
+};
+
+class cmListFileFunction
+{
+public:
+ cmListFileFunction(std::string name, long line, long lineEnd,
+ std::vector<cmListFileArgument> args)
+ : Impl{ std::make_shared<Implementation>(std::move(name), line, lineEnd,
+ std::move(args)) }
+ {
+ }
+
+ std::string const& OriginalName() const noexcept
+ {
+ return this->Impl->OriginalName;
+ }
+
+ std::string const& LowerCaseName() const noexcept
+ {
+ return this->Impl->LowerCaseName;
+ }
+
+ long Line() const noexcept { return this->Impl->Line; }
+ long LineEnd() const noexcept { return this->Impl->LineEnd; }
+
+ std::vector<cmListFileArgument> const& Arguments() const noexcept
+ {
+ return this->Impl->Arguments;
+ }
+
+private:
+ struct Implementation
+ {
+ Implementation(std::string name, long line, long lineEnd,
+ std::vector<cmListFileArgument> args)
+ : OriginalName{ std::move(name) }
+ , LowerCaseName{ tolower(this->OriginalName) }
+ , Line{ line }
+ , LineEnd{ lineEnd }
+ , Arguments{ std::move(args) }
+ {
+ }
+
+ // taken from yaml-cpp
+ static bool IsLower(char ch) { return 'a' <= ch && ch <= 'z'; }
+ static bool IsUpper(char ch) { return 'A' <= ch && ch <= 'Z'; }
+ static char ToLower(char ch) { return IsUpper(ch) ? ch + 'a' - 'A' : ch; }
+
+ std::string tolower(const std::string& str)
+ {
+ std::string s(str);
+ std::transform(s.begin(), s.end(), s.begin(), ToLower);
+ return s;
+ }
+
+ std::string OriginalName;
+ std::string LowerCaseName;
+ long Line = 0;
+ long LineEnd = 0;
+ std::vector<cmListFileArgument> Arguments;
+ };
+
+ std::shared_ptr<Implementation const> Impl;
+};
+
+struct cmListFile
+{
+ bool ParseString(const std::string &str, const std::string &virtual_filename, std::string &error);
+
+ std::vector<cmListFileFunction> Functions;
+};