1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#ifndef cmXCodeObject_h
#define cmXCodeObject_h
#include "cmConfigure.h" // IWYU pragma: keep
#include <algorithm>
#include <iosfwd>
#include <map>
#include <string>
#include <utility>
#include <vector>
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);
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); }
bool HasObject(cmXCodeObject* o) const
{
return !(std::find(this->List.begin(), this->List.end(), o) ==
this->List.end());
}
void AddUniqueObject(cmXCodeObject* value)
{
if (std::find(this->List.begin(), this->List.end(), value) ==
this->List.end()) {
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* GetObject(const char* name) const
{
std::map<std::string, cmXCodeObject*>::const_iterator 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;
};
#endif
|