| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #include "cmSourceGroup.h" |
| |
| #include <utility> |
| |
| #include <cm/memory> |
| |
| #include "cmStringAlgorithms.h" |
| |
| class cmSourceGroupInternals |
| { |
| public: |
| std::vector<cmSourceGroup> GroupChildren; |
| }; |
| |
| cmSourceGroup::cmSourceGroup(std::string name, const char* regex, |
| const char* parentName) |
| : Name(std::move(name)) |
| { |
| this->Internal = cm::make_unique<cmSourceGroupInternals>(); |
| this->SetGroupRegex(regex); |
| if (parentName) { |
| this->FullName = cmStrCat(parentName, '\\'); |
| } |
| this->FullName += this->Name; |
| } |
| |
| cmSourceGroup::~cmSourceGroup() = default; |
| |
| cmSourceGroup::cmSourceGroup(cmSourceGroup const& r) |
| { |
| this->Name = r.Name; |
| this->FullName = r.FullName; |
| this->GroupRegex = r.GroupRegex; |
| this->GroupFiles = r.GroupFiles; |
| this->SourceFiles = r.SourceFiles; |
| this->Internal = cm::make_unique<cmSourceGroupInternals>(*r.Internal); |
| } |
| |
| cmSourceGroup& cmSourceGroup::operator=(cmSourceGroup const& r) |
| { |
| this->Name = r.Name; |
| this->GroupRegex = r.GroupRegex; |
| this->GroupFiles = r.GroupFiles; |
| this->SourceFiles = r.SourceFiles; |
| *(this->Internal) = *(r.Internal); |
| return *this; |
| } |
| |
| void cmSourceGroup::SetGroupRegex(const char* regex) |
| { |
| if (regex) { |
| this->GroupRegex.compile(regex); |
| } else { |
| this->GroupRegex.compile("^$"); |
| } |
| } |
| |
| void cmSourceGroup::AddGroupFile(const std::string& name) |
| { |
| this->GroupFiles.insert(name); |
| } |
| |
| std::string const& cmSourceGroup::GetName() const |
| { |
| return this->Name; |
| } |
| |
| std::string const& cmSourceGroup::GetFullName() const |
| { |
| return this->FullName; |
| } |
| |
| bool cmSourceGroup::MatchesRegex(const std::string& name) |
| { |
| return this->GroupRegex.find(name); |
| } |
| |
| bool cmSourceGroup::MatchesFiles(const std::string& name) const |
| { |
| return this->GroupFiles.find(name) != this->GroupFiles.cend(); |
| } |
| |
| void cmSourceGroup::AssignSource(const cmSourceFile* sf) |
| { |
| this->SourceFiles.push_back(sf); |
| } |
| |
| const std::vector<const cmSourceFile*>& cmSourceGroup::GetSourceFiles() const |
| { |
| return this->SourceFiles; |
| } |
| |
| void cmSourceGroup::AddChild(cmSourceGroup const& child) |
| { |
| this->Internal->GroupChildren.push_back(child); |
| } |
| |
| cmSourceGroup* cmSourceGroup::LookupChild(const std::string& name) |
| { |
| for (cmSourceGroup& group : this->Internal->GroupChildren) { |
| // look if descenened is the one were looking for |
| if (group.GetName() == name) { |
| return (&group); // if it so return it |
| } |
| } |
| |
| // if no child with this name was found return NULL |
| return nullptr; |
| } |
| |
| cmSourceGroup* cmSourceGroup::MatchChildrenFiles(const std::string& name) |
| { |
| if (this->MatchesFiles(name)) { |
| return this; |
| } |
| for (cmSourceGroup& group : this->Internal->GroupChildren) { |
| cmSourceGroup* result = group.MatchChildrenFiles(name); |
| if (result) { |
| return result; |
| } |
| } |
| return nullptr; |
| } |
| |
| cmSourceGroup* cmSourceGroup::MatchChildrenRegex(const std::string& name) |
| { |
| for (cmSourceGroup& group : this->Internal->GroupChildren) { |
| cmSourceGroup* result = group.MatchChildrenRegex(name); |
| if (result) { |
| return result; |
| } |
| } |
| if (this->MatchesRegex(name)) { |
| return this; |
| } |
| |
| return nullptr; |
| } |
| |
| std::vector<cmSourceGroup> const& cmSourceGroup::GetGroupChildren() const |
| { |
| return this->Internal->GroupChildren; |
| } |