aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-04-07 04:44:08 +0000
committerChris Lattner <sabre@nondot.org>2008-04-07 04:44:08 +0000
commit065f0d7b00c3cd2b3139ebd105f50462fc778859 (patch)
treebb5597966a47b823591f048c3e02e98ccbe02fab
parent3b27546b42bc3d5ec261f3228192350affb370be (diff)
eliminate getReferencedProtocols from
ObjCQualifiedIdType/ObjCQualifiedInterfaceType, adding an interator interface instead. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49308 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/Type.h16
-rw-r--r--lib/AST/ASTContext.cpp78
2 files changed, 49 insertions, 45 deletions
diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h
index 9d4fc10cd0..1b37e39361 100644
--- a/include/clang/AST/Type.h
+++ b/include/clang/AST/Type.h
@@ -1087,7 +1087,7 @@ class ObjCQualifiedInterfaceType : public ObjCInterfaceType,
llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols;
ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D,
- ObjCProtocolDecl **Protos, unsigned NumP) :
+ ObjCProtocolDecl **Protos, unsigned NumP) :
ObjCInterfaceType(ObjCQualifiedInterface, D),
Protocols(Protos, Protos+NumP) { }
friend class ASTContext; // ASTContext creates these.
@@ -1099,9 +1099,11 @@ public:
unsigned getNumProtocols() const {
return Protocols.size();
}
- ObjCProtocolDecl **getReferencedProtocols() {
- return &Protocols[0];
- }
+
+ typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator;
+ qual_iterator qual_begin() const { return Protocols.begin(); }
+ qual_iterator qual_end() const { return Protocols.end(); }
+
virtual void getAsStringInternal(std::string &InnerString) const;
void Profile(llvm::FoldingSetNodeID &ID);
@@ -1135,7 +1137,11 @@ public:
}
ObjCProtocolDecl **getReferencedProtocols() {
return &Protocols[0];
- }
+ }
+
+ typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator;
+ qual_iterator qual_begin() const { return Protocols.begin(); }
+ qual_iterator qual_end() const { return Protocols.end(); }
virtual void getAsStringInternal(std::string &InnerString) const;
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 9131db84f6..bb03479a01 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -811,9 +811,8 @@ QualType ASTContext::getObjCInterfaceType(ObjCInterfaceDecl *Decl) {
return QualType(Decl->TypeForDecl, 0);
}
-/// getObjCQualifiedInterfaceType - Return a
-/// ObjCQualifiedInterfaceType type for the given interface decl and
-/// the conforming protocol list.
+/// getObjCQualifiedInterfaceType - Return a ObjCQualifiedInterfaceType type for
+/// the given interface decl and the conforming protocol list.
QualType ASTContext::getObjCQualifiedInterfaceType(ObjCInterfaceDecl *Decl,
ObjCProtocolDecl **Protocols, unsigned NumProtocols) {
llvm::FoldingSetNodeID ID;
@@ -1443,6 +1442,9 @@ bool ASTContext::objcTypesAreCompatible(QualType LHS, QualType RHS) {
return false;
}
+/// areCompatObjCQualInterfaces - Return true if the two qualified interface
+/// types are compatible for assignment from RHS to LHS.
+///
static bool
areCompatObjCQualInterfaces(const ObjCQualifiedInterfaceType *LHS,
const ObjCQualifiedInterfaceType *RHS) {
@@ -1525,13 +1527,10 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
QualType PointeeTy = PT->getPointeeType();
if (isObjCIdType(PointeeTy) || PointeeTy->isVoidType())
return true;
-
- }
- else if (const PointerType *PT = rhs->getAsPointerType()) {
+ } else if (const PointerType *PT = rhs->getAsPointerType()) {
QualType PointeeTy = PT->getPointeeType();
if (isObjCIdType(PointeeTy) || PointeeTy->isVoidType())
return true;
-
}
ObjCQualifiedInterfaceType *lhsQI = 0;
@@ -1558,15 +1557,13 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
if (!rhsQI && !rhsQID && !rhsID)
return false;
- unsigned numRhsProtocols = 0;
- ObjCProtocolDecl **rhsProtoList = 0;
+ ObjCQualifiedIdType::qual_iterator RHSProtoI, RHSProtoE;
if (rhsQI) {
- numRhsProtocols = rhsQI->getNumProtocols();
- rhsProtoList = rhsQI->getReferencedProtocols();
- }
- else if (rhsQID) {
- numRhsProtocols = rhsQID->getNumProtocols();
- rhsProtoList = rhsQID->getReferencedProtocols();
+ RHSProtoI = rhsQI->qual_begin();
+ RHSProtoE = rhsQI->qual_end();
+ } else if (rhsQID) {
+ RHSProtoI = rhsQID->qual_begin();
+ RHSProtoE = rhsQID->qual_end();
}
for (unsigned i =0; i < lhsQID->getNumProtocols(); i++) {
@@ -1579,13 +1576,14 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
if (rhsID) {
if (ClassImplementsProtocol(lhsProto, rhsID, true))
match = true;
- }
- else for (unsigned j = 0; j < numRhsProtocols; j++) {
- ObjCProtocolDecl *rhsProto = rhsProtoList[j];
- if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
- compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
- match = true;
- break;
+ } else {
+ for (; RHSProtoI != RHSProtoE; ++RHSProtoI) {
+ ObjCProtocolDecl *rhsProto = *RHSProtoI;
+ if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
+ compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
+ match = true;
+ break;
+ }
}
}
if (!match)
@@ -1609,16 +1607,15 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
if (!lhsQI && !lhsQID && !lhsID)
return false;
- unsigned numLhsProtocols = 0;
- ObjCProtocolDecl **lhsProtoList = 0;
+ ObjCQualifiedIdType::qual_iterator LHSProtoI, LHSProtoE;
if (lhsQI) {
- numLhsProtocols = lhsQI->getNumProtocols();
- lhsProtoList = lhsQI->getReferencedProtocols();
+ LHSProtoI = lhsQI->qual_begin();
+ LHSProtoE = lhsQI->qual_end();
+ } else if (lhsQID) {
+ LHSProtoI = lhsQID->qual_begin();
+ LHSProtoE = lhsQID->qual_end();
}
- else if (lhsQID) {
- numLhsProtocols = lhsQID->getNumProtocols();
- lhsProtoList = lhsQID->getReferencedProtocols();
- }
+
bool match = false;
// for static type vs. qualified 'id' type, check that class implements
// one of 'id's protocols.
@@ -1630,16 +1627,17 @@ bool ASTContext::ObjCQualifiedIdTypesAreCompatible(QualType lhs,
break;
}
}
- }
- else for (unsigned i =0; i < numLhsProtocols; i++) {
- match = false;
- ObjCProtocolDecl *lhsProto = lhsProtoList[i];
- for (unsigned j = 0; j < rhsQID->getNumProtocols(); j++) {
- ObjCProtocolDecl *rhsProto = rhsQID->getProtocols(j);
- if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
- compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
- match = true;
- break;
+ } else {
+ for (; LHSProtoI != LHSProtoE; ++LHSProtoI) {
+ match = false;
+ ObjCProtocolDecl *lhsProto = *LHSProtoI;
+ for (unsigned j = 0; j < rhsQID->getNumProtocols(); j++) {
+ ObjCProtocolDecl *rhsProto = rhsQID->getProtocols(j);
+ if (ProtocolCompatibleWithProtocol(lhsProto, rhsProto) ||
+ compare && ProtocolCompatibleWithProtocol(rhsProto, lhsProto)) {
+ match = true;
+ break;
+ }
}
}
}