From d9af29969ae313a9b570a89ccea0788d145476f3 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 13 Dec 2016 20:24:24 +0000 Subject: [PATCH] ADT: Add OwningArrayRef class. This is a MutableArrayRef that owns its array. I plan to use this in D22296. Differential Revision: https://reviews.llvm.org/D27723 llvm-svn: 289579 --- llvm/include/llvm/ADT/ArrayRef.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/llvm/include/llvm/ADT/ArrayRef.h b/llvm/include/llvm/ADT/ArrayRef.h index c12688e..a8480d6 100644 --- a/llvm/include/llvm/ADT/ArrayRef.h +++ b/llvm/include/llvm/ADT/ArrayRef.h @@ -413,6 +413,25 @@ namespace llvm { } }; + /// This is a MutableArrayRef that owns its array. + template class OwningArrayRef : public MutableArrayRef { + public: + OwningArrayRef() {} + OwningArrayRef(size_t Size) : MutableArrayRef(new T[Size], Size) {} + OwningArrayRef(ArrayRef Data) + : MutableArrayRef(new T[Data.size()], Data.size()) { + std::copy(Data.begin(), Data.end(), this->begin()); + } + OwningArrayRef(OwningArrayRef &&Other) { *this = Other; } + OwningArrayRef &operator=(OwningArrayRef &&Other) { + delete this->data(); + this->MutableArrayRef::operator=(Other); + Other.MutableArrayRef::operator=(MutableArrayRef()); + return *this; + } + ~OwningArrayRef() { delete this->data(); } + }; + /// @name ArrayRef Convenience constructors /// @{ -- 2.7.4