diff --git a/include/llvm/ADT/ArrayRef.h b/include/llvm/ADT/ArrayRef.h index e5562c36830..c95889a1874 100644 --- a/include/llvm/ADT/ArrayRef.h +++ b/include/llvm/ADT/ArrayRef.h @@ -12,6 +12,7 @@ #include "llvm/ADT/None.h" #include "llvm/ADT/SmallVector.h" +#include "llvm/Support/Allocator.h" #include namespace llvm { @@ -120,6 +121,13 @@ namespace llvm { return Data[Length-1]; } + // copy - Allocate copy in BumpPtrAllocator and return ArrayRef to it. + ArrayRef copy(BumpPtrAllocator &Allocator) { + T *Buff = Allocator.Allocate(Length); + std::copy(begin(), end(), Buff); + return ArrayRef(Buff, Length); + } + /// equals - Check for element-wise equality. bool equals(ArrayRef RHS) const { if (Length != RHS.Length) diff --git a/include/llvm/ADT/StringRef.h b/include/llvm/ADT/StringRef.h index 2128f37dd3d..a1d10c18d78 100644 --- a/include/llvm/ADT/StringRef.h +++ b/include/llvm/ADT/StringRef.h @@ -11,6 +11,7 @@ #define LLVM_ADT_STRINGREF_H #include "llvm/Support/type_traits.h" +#include "llvm/Support/Allocator.h" #include #include #include @@ -124,6 +125,13 @@ namespace llvm { return Data[Length-1]; } + // copy - Allocate copy in BumpPtrAllocator and return StringRef to it. + StringRef copy(BumpPtrAllocator &Allocator) { + char *S = Allocator.Allocate(Length); + std::copy(begin(), end(), S); + return StringRef(S, Length); + } + /// equals - Check for string equality, this is more efficient than /// compare() when the relative ordering of inequal strings isn't needed. bool equals(StringRef RHS) const { diff --git a/include/llvm/Support/Allocator.h b/include/llvm/Support/Allocator.h index 275086bffdf..397f50fbe36 100644 --- a/include/llvm/Support/Allocator.h +++ b/include/llvm/Support/Allocator.h @@ -14,8 +14,6 @@ #ifndef LLVM_SUPPORT_ALLOCATOR_H #define LLVM_SUPPORT_ALLOCATOR_H -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/StringRef.h" #include "llvm/Support/AlignOf.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/MathExtras.h" @@ -181,40 +179,6 @@ public: void PrintStats() const; - - /// Allocate space and copy content into it. - void *allocateCopy(const void *Src, size_t Size, size_t Alignment=1) { - void *P = Allocate(Size, Alignment); - memcpy(P, Src, Size); - return P; - } - - /// Allocate space for an array of type T, and use std::copy() - /// to copy the array contents. - template - typename enable_if, T*>::type - allocateCopy(const T Src[], size_t Num) { - T *P = Allocate(Num); - std::copy(Src, &Src[Num], P); - return P; - } - - /// Copy a StringRef by allocating copy in BumpPtrAllocator. - StringRef allocateCopy(StringRef Str) { - size_t Length = Str.size(); - char *P = allocateCopy(Str.data(), Length); - return StringRef(P, Length); - } - - /// Copy a ArrayRef by allocating copy in BumpPtrAllocator. - template - typename enable_if, ArrayRef >::type - allocateCopy(ArrayRef Src) { - size_t Length = Src.size(); - T *P = allocateCopy(Src.data(), Length); - return makeArrayRef(P, Length); - } - /// Compute the total physical memory allocated by this allocator. size_t getTotalMemory() const; }; diff --git a/unittests/ADT/ArrayRefTest.cpp b/unittests/ADT/ArrayRefTest.cpp new file mode 100644 index 00000000000..7133ca79c46 --- /dev/null +++ b/unittests/ADT/ArrayRefTest.cpp @@ -0,0 +1,33 @@ +//===- llvm/unittest/ADT/ArrayRefTest.cpp - ArrayRef unit tests -----------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/ADT/ArrayRef.h" +#include "llvm/Support/Allocator.h" +#include "llvm/Support/raw_ostream.h" +#include "gtest/gtest.h" +using namespace llvm; + +namespace llvm { + +TEST(ArrayRefTest, AllocatorCopy) { + BumpPtrAllocator Alloc; + static const uint16_t Words1[] = { 1, 4, 200, 37 }; + ArrayRef Array1 = makeArrayRef(Words1, 4); + static const uint16_t Words2[] = { 11, 4003, 67, 64000, 13 }; + ArrayRef Array2 = makeArrayRef(Words2, 5); + ArrayRef Array1c = Array1.copy(Alloc); + ArrayRef Array2c = Array2.copy(Alloc);; + EXPECT_TRUE(Array1.equals(Array1c)); + EXPECT_NE(Array1.data(), Array1c.data()); + EXPECT_TRUE(Array2.equals(Array2c)); + EXPECT_NE(Array2.data(), Array2c.data()); +} + + +} // end anonymous namespace diff --git a/unittests/ADT/CMakeLists.txt b/unittests/ADT/CMakeLists.txt index 8ad303a9e1b..183aa6aabf2 100644 --- a/unittests/ADT/CMakeLists.txt +++ b/unittests/ADT/CMakeLists.txt @@ -5,6 +5,7 @@ set(LLVM_LINK_COMPONENTS set(ADTSources APFloatTest.cpp APIntTest.cpp + ArrayRefTest.cpp BitVectorTest.cpp DAGDeltaAlgorithmTest.cpp DeltaAlgorithmTest.cpp diff --git a/unittests/ADT/StringRefTest.cpp b/unittests/ADT/StringRefTest.cpp index 0ab8fcf6f00..c7fd9d0f155 100644 --- a/unittests/ADT/StringRefTest.cpp +++ b/unittests/ADT/StringRefTest.cpp @@ -11,6 +11,7 @@ #include "llvm/ADT/Hashing.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/Support/Allocator.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" using namespace llvm; @@ -531,4 +532,18 @@ TEST(StringRefTest, joinStrings) { EXPECT_TRUE(v2_join3); } + +TEST(StringRefTest, AllocatorCopy) { + BumpPtrAllocator Alloc; + StringRef Str1 = "hello"; + StringRef Str2 = "bye"; + StringRef Str1c = Str1.copy(Alloc); + StringRef Str2c = Str2.copy(Alloc); + EXPECT_TRUE(Str1.equals(Str1c)); + EXPECT_NE(Str1.data(), Str1c.data()); + EXPECT_TRUE(Str2.equals(Str2c)); + EXPECT_NE(Str2.data(), Str2c.data()); +} + + } // end anonymous namespace diff --git a/unittests/Support/AllocatorTest.cpp b/unittests/Support/AllocatorTest.cpp index 43ce0c86bee..cb9fa430369 100644 --- a/unittests/Support/AllocatorTest.cpp +++ b/unittests/Support/AllocatorTest.cpp @@ -147,32 +147,4 @@ TEST(AllocatorTest, TestBigAlignment) { EXPECT_LE(Ptr + 3000, ((uintptr_t)Slab) + Slab->Size); } -TEST(AllocatorTest, CopyStringRef) { - BumpPtrAllocator Alloc; - StringRef Str1 = "hello"; - StringRef Str2 = "bye"; - StringRef Str1c = Alloc.allocateCopy(Str1); - StringRef Str2c = Alloc.allocateCopy(Str2); - EXPECT_TRUE(Str1.equals(Str1c)); - EXPECT_NE(Str1.data(), Str1c.data()); - EXPECT_TRUE(Str2.equals(Str2c)); - EXPECT_NE(Str2.data(), Str2c.data()); -} - -TEST(AllocatorTest, CopyArrayRef) { - BumpPtrAllocator Alloc; - static const uint16_t Words1[] = { 1, 4, 200, 37 }; - ArrayRef Array1 = makeArrayRef(Words1, 4); - static const uint16_t Words2[] = { 11, 4003, 67, 64000, 13 }; - ArrayRef Array2 = makeArrayRef(Words2, 5); - ArrayRef Array1c = Alloc.allocateCopy(Array1); - ArrayRef Array2c = Alloc.allocateCopy(Array2); - EXPECT_TRUE(Array1.equals(Array1c)); - EXPECT_NE(Array1.data(), Array1c.data()); - EXPECT_TRUE(Array2.equals(Array2c)); - EXPECT_NE(Array2.data(), Array2c.data()); -} - - - } // anonymous namespace