summaryrefslogtreecommitdiffstats
path: root/Source/cmSourceGroup.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmSourceGroup.cxx')
-rw-r--r--Source/cmSourceGroup.cxx173
1 files changed, 173 insertions, 0 deletions
diff --git a/Source/cmSourceGroup.cxx b/Source/cmSourceGroup.cxx
new file mode 100644
index 0000000..d9529a2
--- /dev/null
+++ b/Source/cmSourceGroup.cxx
@@ -0,0 +1,173 @@
+/*============================================================================
+ CMake - Cross Platform Makefile Generator
+ Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
+
+ Distributed under the OSI-approved BSD License (the "License");
+ see accompanying file Copyright.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even the
+ implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the License for more information.
+============================================================================*/
+#include "cmSourceGroup.h"
+
+class cmSourceGroupInternals
+{
+public:
+ std::vector<cmSourceGroup> GroupChildren;
+};
+
+cmSourceGroup::cmSourceGroup(const char* name, const char* regex,
+ const char* parentName)
+ : Name(name)
+{
+ this->Internal = new cmSourceGroupInternals;
+ this->SetGroupRegex(regex);
+ if (parentName) {
+ this->FullName = parentName;
+ this->FullName += "\\";
+ }
+ this->FullName += this->Name;
+}
+
+cmSourceGroup::~cmSourceGroup()
+{
+ delete this->Internal;
+}
+
+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 = new 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);
+}
+
+const char* cmSourceGroup::GetName() const
+{
+ return this->Name.c_str();
+}
+
+const char* cmSourceGroup::GetFullName() const
+{
+ return this->FullName.c_str();
+}
+
+bool cmSourceGroup::MatchesRegex(const char* name)
+{
+ return this->GroupRegex.find(name);
+}
+
+bool cmSourceGroup::MatchesFiles(const char* name)
+{
+ return this->GroupFiles.find(name) != this->GroupFiles.end();
+}
+
+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 char* name) const
+{
+ // initializing iterators
+ std::vector<cmSourceGroup>::const_iterator iter =
+ this->Internal->GroupChildren.begin();
+ const std::vector<cmSourceGroup>::const_iterator end =
+ this->Internal->GroupChildren.end();
+
+ // st
+ for (; iter != end; ++iter) {
+ std::string sgName = iter->GetName();
+
+ // look if descenened is the one were looking for
+ if (sgName == name) {
+ return const_cast<cmSourceGroup*>(&(*iter)); // if it so return it
+ }
+ }
+
+ // if no child with this name was found return NULL
+ return CM_NULLPTR;
+}
+
+cmSourceGroup* cmSourceGroup::MatchChildrenFiles(const char* name)
+{
+ // initializing iterators
+ std::vector<cmSourceGroup>::iterator iter =
+ this->Internal->GroupChildren.begin();
+ std::vector<cmSourceGroup>::iterator end =
+ this->Internal->GroupChildren.end();
+
+ if (this->MatchesFiles(name)) {
+ return this;
+ }
+ for (; iter != end; ++iter) {
+ cmSourceGroup* result = iter->MatchChildrenFiles(name);
+ if (result) {
+ return result;
+ }
+ }
+ return CM_NULLPTR;
+}
+
+cmSourceGroup* cmSourceGroup::MatchChildrenRegex(const char* name)
+{
+ // initializing iterators
+ std::vector<cmSourceGroup>::iterator iter =
+ this->Internal->GroupChildren.begin();
+ std::vector<cmSourceGroup>::iterator end =
+ this->Internal->GroupChildren.end();
+
+ for (; iter != end; ++iter) {
+ cmSourceGroup* result = iter->MatchChildrenRegex(name);
+ if (result) {
+ return result;
+ }
+ }
+ if (this->MatchesRegex(name)) {
+ return this;
+ }
+
+ return CM_NULLPTR;
+}
+
+std::vector<cmSourceGroup> const& cmSourceGroup::GetGroupChildren() const
+{
+ return this->Internal->GroupChildren;
+}