forked from OSchip/llvm-project
Add an iterator for walking the primary base chain.
llvm-svn: 90023
This commit is contained in:
parent
cf0b198827
commit
182498df65
|
@ -64,8 +64,40 @@ public:
|
||||||
|
|
||||||
/// isVirtual - Returns whether the primary base is virtual or not.
|
/// isVirtual - Returns whether the primary base is virtual or not.
|
||||||
bool isVirtual() const { return Value.getInt(); }
|
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:
|
private:
|
||||||
/// CXXRecordLayoutInfo - Contains C++ specific layout information.
|
/// CXXRecordLayoutInfo - Contains C++ specific layout information.
|
||||||
struct CXXRecordLayoutInfo {
|
struct CXXRecordLayoutInfo {
|
||||||
|
@ -212,6 +244,18 @@ public:
|
||||||
|
|
||||||
return CXXInfo->VBaseOffsets[VBase];
|
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
|
} // end namespace clang
|
||||||
|
|
Loading…
Reference in New Issue