Add an iterator for walking the primary base chain.

llvm-svn: 90023
This commit is contained in:
Anders Carlsson 2009-11-28 00:50:23 +00:00
parent cf0b198827
commit 182498df65
1 changed files with 44 additions and 0 deletions

View File

@ -64,8 +64,40 @@ public:
/// isVirtual - Returns whether the primary base is virtual or not.
bool isVirtual() const { return Value.getInt(); }
friend bool operator==(const PrimaryBaseInfo &X, const PrimaryBaseInfo &Y) {
return X.Value == Y.Value;
}
};
/// primary_base_info_iterator - An iterator for iterating the primary base
/// class chain.
class primary_base_info_iterator {
/// Current - The current base class info.
PrimaryBaseInfo Current;
public:
primary_base_info_iterator() {}
primary_base_info_iterator(PrimaryBaseInfo Info) : Current(Info) {}
const PrimaryBaseInfo &operator*() const { return Current; }
primary_base_info_iterator& operator++() {
const CXXRecordDecl *RD = Current.getBase();
Current = RD->getASTContext().getASTRecordLayout(RD).getPrimaryBaseInfo();
return *this;
}
friend bool operator==(const primary_base_info_iterator &X,
const primary_base_info_iterator &Y) {
return X.Current == Y.Current;
}
friend bool operator!=(const primary_base_info_iterator &X,
const primary_base_info_iterator &Y) {
return !(X == Y);
}
};
private:
/// CXXRecordLayoutInfo - Contains C++ specific layout information.
struct CXXRecordLayoutInfo {
@ -212,6 +244,18 @@ public:
return CXXInfo->VBaseOffsets[VBase];
}
primary_base_info_iterator primary_base_begin() const {
assert(CXXInfo && "Record layout does not have C++ specific info!");
return primary_base_info_iterator(getPrimaryBaseInfo());
}
primary_base_info_iterator primary_base_end() const {
assert(CXXInfo && "Record layout does not have C++ specific info!");
return primary_base_info_iterator();
}
};
} // end namespace clang