| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file Copyright.txt or https://cmake.org/licensing for details. */ |
| #pragma once |
| |
| #include "cmConfigure.h" // IWYU pragma: keep |
| |
| #include <algorithm> |
| #include <cstddef> |
| #include <iosfwd> |
| #include <map> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include <cmext/algorithm> |
| |
| class cmGeneratorTarget; |
| |
| class cmXCodeObject |
| { |
| public: |
| enum Type |
| { |
| OBJECT_LIST, |
| STRING, |
| ATTRIBUTE_GROUP, |
| OBJECT_REF, |
| OBJECT |
| }; |
| enum PBXType |
| { |
| PBXGroup, |
| PBXBuildStyle, |
| PBXProject, |
| PBXHeadersBuildPhase, |
| PBXSourcesBuildPhase, |
| PBXFrameworksBuildPhase, |
| PBXNativeTarget, |
| PBXFileReference, |
| PBXBuildFile, |
| PBXContainerItemProxy, |
| PBXTargetDependency, |
| PBXShellScriptBuildPhase, |
| PBXResourcesBuildPhase, |
| PBXApplicationReference, |
| PBXExecutableFileReference, |
| PBXLibraryReference, |
| PBXToolTarget, |
| PBXLibraryTarget, |
| PBXAggregateTarget, |
| XCBuildConfiguration, |
| XCConfigurationList, |
| PBXCopyFilesBuildPhase, |
| None |
| }; |
| class StringVec : public std::vector<std::string> |
| { |
| }; |
| static const char* PBXTypeNames[]; |
| virtual ~cmXCodeObject(); |
| cmXCodeObject(PBXType ptype, Type type, std::string id); |
| Type GetType() const { return this->TypeValue; } |
| PBXType GetIsA() const { return this->IsA; } |
| |
| bool IsEmpty() const; |
| |
| void SetString(const std::string& s); |
| const std::string& GetString() const { return this->String; } |
| |
| void AddAttribute(const std::string& name, cmXCodeObject* value) |
| { |
| this->ObjectAttributes[name] = value; |
| } |
| |
| void AddAttributeIfNotEmpty(const std::string& name, cmXCodeObject* value) |
| { |
| if (value && !value->IsEmpty()) { |
| AddAttribute(name, value); |
| } |
| } |
| |
| void SetObject(cmXCodeObject* value) { this->Object = value; } |
| cmXCodeObject* GetObject() { return this->Object; } |
| void AddObject(cmXCodeObject* value) { this->List.push_back(value); } |
| size_t GetObjectCount() { return this->List.size(); } |
| void InsertObject(size_t position, cmXCodeObject* value) |
| { |
| if (position < GetObjectCount()) { |
| this->List.insert(this->List.begin() + position, value); |
| } |
| } |
| void PrependObject(cmXCodeObject* value) |
| { |
| this->List.insert(this->List.begin(), value); |
| } |
| bool HasObject(cmXCodeObject* o) const |
| { |
| return cm::contains(this->List, o); |
| } |
| void AddUniqueObject(cmXCodeObject* value) |
| { |
| if (!cm::contains(this->List, value)) { |
| this->List.push_back(value); |
| } |
| } |
| static void Indent(int level, std::ostream& out); |
| void Print(std::ostream& out); |
| void PrintAttribute(std::ostream& out, int level, |
| const std::string& separator, int factor, |
| const std::string& name, const cmXCodeObject* object, |
| const cmXCodeObject* parent); |
| virtual void PrintComment(std::ostream&) {} |
| |
| static void PrintList(std::vector<cmXCodeObject*> const&, std::ostream& out); |
| const std::string& GetId() const { return this->Id; } |
| void SetId(const std::string& id) { this->Id = id; } |
| cmGeneratorTarget* GetTarget() const { return this->Target; } |
| void SetTarget(cmGeneratorTarget* t) { this->Target = t; } |
| const std::string& GetComment() const { return this->Comment; } |
| bool HasComment() const { return (!this->Comment.empty()); } |
| cmXCodeObject* GetAttribute(const char* name) const |
| { |
| auto const i = this->ObjectAttributes.find(name); |
| if (i != this->ObjectAttributes.end()) { |
| return i->second; |
| } |
| return nullptr; |
| } |
| // search the attribute list for an object of the specified type |
| cmXCodeObject* GetObject(cmXCodeObject::PBXType t) const |
| { |
| for (auto* o : this->List) { |
| if (o->IsA == t) { |
| return o; |
| } |
| } |
| return nullptr; |
| } |
| |
| void CopyAttributes(cmXCodeObject*); |
| |
| void AddDependLibrary(const std::string& configName, const std::string& l) |
| { |
| this->DependLibraries[configName].push_back(l); |
| } |
| std::map<std::string, StringVec> const& GetDependLibraries() const |
| { |
| return this->DependLibraries; |
| } |
| void AddDependTarget(const std::string& configName, const std::string& tName) |
| { |
| this->DependTargets[configName].push_back(tName); |
| } |
| std::map<std::string, StringVec> const& GetDependTargets() const |
| { |
| return this->DependTargets; |
| } |
| std::vector<cmXCodeObject*> const& GetObjectList() const |
| { |
| return this->List; |
| } |
| void SetComment(const std::string& c) { this->Comment = c; } |
| static void PrintString(std::ostream& os, const std::string& String); |
| |
| protected: |
| void PrintString(std::ostream& os) const; |
| |
| cmGeneratorTarget* Target; |
| Type TypeValue; |
| std::string Id; |
| PBXType IsA; |
| int Version; |
| std::string Comment; |
| std::string String; |
| cmXCodeObject* Object; |
| std::vector<cmXCodeObject*> List; |
| std::map<std::string, StringVec> DependLibraries; |
| std::map<std::string, StringVec> DependTargets; |
| std::map<std::string, cmXCodeObject*> ObjectAttributes; |
| }; |