[cfe-commits] r56611 - in /cfe/trunk: include/clang/AST/DeclGroup.h lib/AST/DeclGroup.cpp
Ted Kremenek
kremenek at apple.com
Thu Sep 25 10:13:41 PDT 2008
Author: kremenek
Date: Thu Sep 25 12:13:40 2008
New Revision: 56611
URL: http://llvm.org/viewvc/llvm-project?rev=56611&view=rev
Log:
Added prototype implementation of the DeclGroup, DeclGroupRef, and DeclGroupOwningRef classes.
Documentation and testing are pending.
Added:
cfe/trunk/include/clang/AST/DeclGroup.h
cfe/trunk/lib/AST/DeclGroup.cpp
Added: cfe/trunk/include/clang/AST/DeclGroup.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclGroup.h?rev=56611&view=auto
==============================================================================
--- cfe/trunk/include/clang/AST/DeclGroup.h (added)
+++ cfe/trunk/include/clang/AST/DeclGroup.h Thu Sep 25 12:13:40 2008
@@ -0,0 +1,96 @@
+//===--- DeclGroup.h - Classes for representing groups of Decls -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the DeclGroup, DeclGroupRef, and OwningDeclGroup classes.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_AST_DECLGROUP_H
+#define LLVM_CLANG_AST_DECLGROUP_H
+
+#include "llvm/Support/DataTypes.h"
+#include <cassert>
+
+namespace clang {
+
+class ASTContext;
+class Decl;
+class DeclGroup;
+class DeclGroupIterator;
+
+class DeclGroup {
+ // FIXME: Include a TypeSpecifier object.
+ unsigned NumDecls;
+
+private:
+ DeclGroup(unsigned numdecls, Decl** decls);
+
+public:
+ static DeclGroup* Create(ASTContext& C, unsigned numdecls, Decl** decls);
+ void Destroy(ASTContext& C);
+
+ unsigned size() const { return NumDecls; }
+ Decl*& operator[](unsigned i) {
+ assert (i < NumDecls && "Out-of-bounds access.");
+ return *((Decl**) (this+1));
+ }
+};
+
+class DeclGroupRef {
+protected:
+ enum Kind { DeclKind=0x0, DeclGroupKind=0x1, Mask=0x1 };
+ uintptr_t ThePtr;
+
+ Kind getKind() const { return (Kind) (ThePtr & Mask); }
+
+public:
+ DeclGroupRef() : ThePtr(0) {}
+
+ explicit DeclGroupRef(Decl* D)
+ : ThePtr(reinterpret_cast<uintptr_t>(D)) {}
+
+ explicit DeclGroupRef(DeclGroup* D)
+ : ThePtr(reinterpret_cast<uintptr_t>(D) | DeclGroupKind) {}
+
+ typedef Decl** iterator;
+
+ iterator begin() {
+ if (getKind() == DeclKind)
+ return ThePtr ? (Decl**) &ThePtr : 0;
+
+ DeclGroup* G = reinterpret_cast<DeclGroup*>(ThePtr & ~Mask);
+ return &(*G)[0];
+ }
+
+ iterator end() {
+ if (getKind() == DeclKind)
+ return ThePtr ? ((Decl**) &ThePtr) + 1 : 0;
+
+ DeclGroup* G = reinterpret_cast<DeclGroup*>(ThePtr & ~Mask);
+ return &(*G)[0] + G->size();
+ }
+};
+
+class DeclGroupOwningRef : public DeclGroupRef {
+public:
+ ~DeclGroupOwningRef();
+ void Destroy(ASTContext& C);
+
+ explicit DeclGroupOwningRef(DeclGroupOwningRef& R)
+ : DeclGroupRef(R) { R.ThePtr = 0; }
+
+ DeclGroupOwningRef& operator=(DeclGroupOwningRef& R) {
+ ThePtr = R.ThePtr;
+ R.ThePtr = 0;
+ return *this;
+ }
+};
+
+} // end clang namespace
+#endif
Added: cfe/trunk/lib/AST/DeclGroup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclGroup.cpp?rev=56611&view=auto
==============================================================================
--- cfe/trunk/lib/AST/DeclGroup.cpp (added)
+++ cfe/trunk/lib/AST/DeclGroup.cpp Thu Sep 25 12:13:40 2008
@@ -0,0 +1,59 @@
+//===--- DeclGroup.cpp - Classes for representing groups of Decls -*- C++ -*-==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the DeclGroup, DeclGroupRef, and OwningDeclGroup classes.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/AST/DeclGroup.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/ASTContext.h"
+#include "llvm/Support/Allocator.h"
+
+using namespace clang;
+
+DeclGroup* DeclGroup::Create(ASTContext& C, unsigned numdecls, Decl** decls) {
+ unsigned size = sizeof(DeclGroup) + sizeof(Decl*) * numdecls;
+ unsigned alignment = llvm::AlignOf<DeclGroup>::Alignment;
+ void* mem = C.getAllocator().Allocate(size, alignment);
+ new (mem) DeclGroup(numdecls, decls);
+ return static_cast<DeclGroup*>(mem);
+}
+
+DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) {
+ assert (numdecls > 0);
+ assert (decls);
+ memcpy(this+1, decls, numdecls * sizeof(*decls));
+}
+
+void DeclGroup::Destroy(ASTContext& C) {
+ Decl** Decls = (Decl**) this + 1;
+
+ for (unsigned i = 0; i < NumDecls; ++i)
+ Decls[i]->Destroy(C);
+
+ this->~DeclGroup();
+ C.getAllocator().Deallocate((void*) this);
+}
+
+DeclGroupOwningRef::~DeclGroupOwningRef() {
+ assert (ThePtr == 0 && "Destroy method not called.");
+}
+
+void DeclGroupOwningRef::Destroy(ASTContext& C) {
+ if (!ThePtr)
+ return;
+
+ if (getKind() == DeclKind)
+ reinterpret_cast<Decl*>(ThePtr)->Destroy(C);
+ else
+ reinterpret_cast<DeclGroup*>(ThePtr & ~Mask)->Destroy(C);
+
+ ThePtr = 0;
+}
More information about the cfe-commits
mailing list