summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-08-25 23:11:24 +0000
committerJohn McCall <rjmccall@apple.com>2010-08-25 23:11:24 +0000
commit5b5f7260a0f0da9a2057245fd42a6b196ccec33d (patch)
tree1d0d0a7c2c31287159d177f827866fbb7163440e
parentcd11e9db35cf4817869ea46ba736f133a9700b28 (diff)
downloadllvm-5b5f7260a0f0da9a2057245fd42a6b196ccec33d.tar.gz
llvm-5b5f7260a0f0da9a2057245fd42a6b196ccec33d.tar.bz2
llvm-5b5f7260a0f0da9a2057245fd42a6b196ccec33d.tar.xz
Provide an explicit specialization of SmallVector at N=0 which does
not require its type argument to be complete if no members are actually used. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112106 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/ADT/SmallVector.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/include/llvm/ADT/SmallVector.h b/include/llvm/ADT/SmallVector.h
index fa61d207bd..3be1787bc3 100644
--- a/include/llvm/ADT/SmallVector.h
+++ b/include/llvm/ADT/SmallVector.h
@@ -707,6 +707,39 @@ public:
};
+/// Specialize SmallVector at N=0. This specialization guarantees
+/// that it can be instantiated at an incomplete T if none of its
+/// members are required.
+template <typename T>
+class SmallVector<T,0> : public SmallVectorImpl<T> {
+public:
+ SmallVector() : SmallVectorImpl<T>(0) {
+ }
+
+ explicit SmallVector(unsigned Size, const T &Value = T())
+ : SmallVectorImpl<T>(0) {
+ this->reserve(Size);
+ while (Size--)
+ this->push_back(Value);
+ }
+
+ template<typename ItTy>
+ SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(0) {
+ this->append(S, E);
+ }
+
+ SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(0) {
+ if (!RHS.empty())
+ SmallVectorImpl<T>::operator=(RHS);
+ }
+
+ const SmallVector &operator=(const SmallVector &RHS) {
+ SmallVectorImpl<T>::operator=(RHS);
+ return *this;
+ }
+
+};
+
} // End llvm namespace
namespace std {