#include "swift/ReST/AST.h" #include "swift/ReST/Parser.h" #include using namespace llvm; using namespace rest; using namespace llvm::rest::detail; void *ReSTASTNode::operator new(size_t Bytes, ReSTContext &C, unsigned Alignment) { return C.Allocator.Allocate(Bytes, Alignment); } Document::Document(ArrayRef Children) : ReSTASTNode(ASTNodeKind::Document), NumChildren(Children.size()) { std::uninitialized_copy(Children.begin(), Children.end(), getChildrenBuffer()); } Document *Document::create(ReSTContext &C, ArrayRef Children) { void *Mem = C.allocate(sizeof(Document) + Children.size() * sizeof(ReSTASTNode *), alignof(Document)); return new (Mem) Document(Children); } BulletList::BulletList(ArrayRef ItemInfos, ArrayRef ItemChildren) : ReSTASTNode(ASTNodeKind::BulletList), NumItems(ItemInfos.size()) { std::uninitialized_copy(ItemInfos.begin(), ItemInfos.end(), getItemInfoBuffer()); std::uninitialized_copy(ItemChildren.begin(), ItemChildren.end(), getItemChildrenBuffer()); #ifndef NDEBUG unsigned ExpectedNumChildren = 0; for (const auto &Info : ItemInfos) ExpectedNumChildren += Info.NumChildren; assert(ItemChildren.size() == ExpectedNumChildren); #endif } BulletList *BulletList::create(ReSTContext &C, ArrayRef ItemInfos, ArrayRef ItemChildren) { void *Mem = C.allocate(sizeof(BulletList) + ItemInfos.size() * sizeof(ListItemInfo) + ItemChildren.size() * sizeof(ReSTASTNode *), alignof(BulletList)); return new (Mem) BulletList(ItemInfos, ItemChildren); } EnumeratedList::EnumeratedList(ArrayRef ItemInfos, ArrayRef ItemChildren) : ReSTASTNode(ASTNodeKind::EnumeratedList), NumItems(ItemInfos.size()) { std::uninitialized_copy(ItemInfos.begin(), ItemInfos.end(), getItemInfoBuffer()); std::uninitialized_copy(ItemChildren.begin(), ItemChildren.end(), getItemChildrenBuffer()); #ifndef NDEBUG unsigned ExpectedNumChildren = 0; for (const auto &Info : ItemInfos) ExpectedNumChildren += Info.NumChildren; assert(ItemChildren.size() == ExpectedNumChildren); #endif } EnumeratedList *EnumeratedList::create(ReSTContext &C, ArrayRef ItemInfos, ArrayRef ItemChildren) { void *Mem = C.allocate(sizeof(EnumeratedList) + ItemInfos.size() * sizeof(ListItemInfo) + ItemChildren.size() * sizeof(ReSTASTNode *), alignof(EnumeratedList)); return new (Mem) EnumeratedList(ItemInfos, ItemChildren); } DefinitionListItem::DefinitionListItem( TextAndInline *Term, ArrayRef Classifiers, ArrayRef DefinitionChildren) : ReSTASTNode(ASTNodeKind::DefinitionListItem), Term(Term), NumClassifiers(Classifiers.size()), NumDefinitionChildren(DefinitionChildren.size()) { std::uninitialized_copy(Classifiers.begin(), Classifiers.end(), getClassifiersBuffer()); std::uninitialized_copy(DefinitionChildren.begin(), DefinitionChildren.end(), getDefinitionChildrenBuffer()); } DefinitionListItem * DefinitionListItem::create(ReSTContext &C, TextAndInline *Term, ArrayRef Classifiers, ArrayRef DefinitionChildren) { void *Mem = C.allocate(sizeof(DefinitionListItem) + Classifiers.size() * sizeof(TextAndInline *) + DefinitionChildren.size() * sizeof(ReSTASTNode *), alignof(DefinitionListItem)); return new (Mem) DefinitionListItem(Term, Classifiers, DefinitionChildren); } DefinitionList::DefinitionList(ArrayRef Children) : ReSTASTNode(ASTNodeKind::DefinitionList), NumChildren(Children.size()) { std::uninitialized_copy(Children.begin(), Children.end(), getChildrenBuffer()); } DefinitionList * DefinitionList::create(ReSTContext &C, ArrayRef Children) { void *Mem = C.allocate(sizeof(DefinitionList) + Children.size() * sizeof(DefinitionListItem *), alignof(DefinitionList)); return new (Mem) DefinitionList(Children); } Field::Field(TextAndInline *Name, ArrayRef BodyChildren) : ReSTASTNode(ASTNodeKind::Field), Name(Name), NumBodyChildren(BodyChildren.size()) { std::uninitialized_copy(BodyChildren.begin(), BodyChildren.end(), getBodyChildrenBuffer()); } Field *Field::create(ReSTContext &C, TextAndInline *Name, ArrayRef BodyChildren) { void *Mem = C.allocate(sizeof(Field) + BodyChildren.size() * sizeof(ReSTASTNode *), alignof(Field)); return new (Mem) Field(Name, BodyChildren); } FieldList::FieldList(ArrayRef Children) : ReSTASTNode(ASTNodeKind::FieldList), NumChildren(Children.size()) { std::uninitialized_copy(Children.begin(), Children.end(), getChildrenBuffer()); } FieldList *FieldList::create(ReSTContext &C, ArrayRef Children) { void *Mem = C.allocate(sizeof(FieldList) + Children.size() * sizeof(Field *), alignof(FieldList)); return new (Mem) FieldList(Children); } BlockQuote::BlockQuote(ArrayRef Children) : ReSTASTNode(ASTNodeKind::BlockQuote), NumChildren(Children.size()) { std::uninitialized_copy(Children.begin(), Children.end(), getChildrenBuffer()); } BlockQuote *BlockQuote::create(ReSTContext &C, ArrayRef Children) { void *Mem = C.allocate(sizeof(BlockQuote) + Children.size() * sizeof(ReSTASTNode *), alignof(BlockQuote)); return new (Mem) BlockQuote(Children); }