void Destroy(ASTContext& C);
unsigned size() const { return NumDecls; }
+
Decl*& operator[](unsigned i) {
assert (i < NumDecls && "Out-of-bounds access.");
return *((Decl**) (this+1));
}
- const Decl*& operator[](unsigned i) const {
+ Decl* const& operator[](unsigned i) const {
assert (i < NumDecls && "Out-of-bounds access.");
- return *((const Decl**) (this+1));
+ return *((Decl* const*) (this+1));
}
/// Emit - Serialize a DeclGroup to Bitcode.
: D((Decl*) (reinterpret_cast<uintptr_t>(dg) | DeclGroupKind)) {}
typedef Decl** iterator;
+ typedef Decl* const * const_iterator;
+
+ bool hasSolitaryDecl() const {
+ return getKind() == DeclKind;
+ }
iterator begin() {
if (getKind() == DeclKind) return D ? &D : 0;
DeclGroup& G = *((DeclGroup*) (reinterpret_cast<uintptr_t>(D) & ~Mask));
return &G[0] + G.size();
}
+
+ const_iterator begin() const {
+ if (getKind() == DeclKind) return D ? &D : 0;
+ DeclGroup& G = *((DeclGroup*) (reinterpret_cast<uintptr_t>(D) & ~Mask));
+ return &G[0];
+ }
+
+ const_iterator end() const {
+ if (getKind() == DeclKind) return D ? &D + 1 : 0;
+ DeclGroup& G = *((DeclGroup*) (reinterpret_cast<uintptr_t>(D) & ~Mask));
+ return &G[0] + G.size();
+ }
/// Emit - Serialize a DeclGroupRef to Bitcode.
void Emit(llvm::Serializer& S) const;
class DeclGroupOwningRef : public DeclGroupRef {
public:
+ explicit DeclGroupOwningRef() : DeclGroupRef((Decl*)0) {}
explicit DeclGroupOwningRef(Decl* d) : DeclGroupRef(d) {}
explicit DeclGroupOwningRef(DeclGroup* dg) : DeclGroupRef(dg) {}
void Emit(llvm::Serializer& S) const;
/// Read - Deserialize a DeclGroupOwningRef from Bitcode.
- static DeclGroupOwningRef ReadVal(llvm::Deserializer& D, ASTContext& C);
+ DeclGroupOwningRef& Read(llvm::Deserializer& D, ASTContext& C);
};
} // end clang namespace
using namespace clang;
DeclGroup* DeclGroup::Create(ASTContext& C, unsigned numdecls, Decl** decls) {
+ assert (numdecls > 0);
unsigned size = sizeof(DeclGroup) + sizeof(Decl*) * numdecls;
unsigned alignment = llvm::AlignOf<DeclGroup>::Alignment;
void* mem = C.getAllocator().Allocate(size, alignment);
return DG;
}
-DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) {
+DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) : NumDecls(numdecls) {
assert (numdecls > 0);
assert (decls);
memcpy(this+1, decls, numdecls * sizeof(*decls));
}
}
-DeclGroupOwningRef DeclGroupOwningRef::ReadVal(llvm::Deserializer& D,
- ASTContext& C) {
- if (D.ReadBool()) {
- DeclGroupOwningRef DG(D.ReadOwnedPtr<Decl>(C));
- return DG;
+DeclGroupOwningRef& DeclGroupOwningRef::Read(llvm::Deserializer& Dezr,
+ ASTContext& C) {
+
+ if (!Dezr.ReadBool())
+ D = Dezr.ReadOwnedPtr<Decl>(C);
+ else {
+ uintptr_t x = reinterpret_cast<uintptr_t>(Dezr.ReadOwnedPtr<DeclGroup>(C));
+ D = reinterpret_cast<Decl*>(x | DeclGroupKind);
}
-
- DeclGroupOwningRef DG(D.ReadOwnedPtr<DeclGroup>(C));
- return DG;
+
+ return *this;
}