From 9092c3e0fa01f3139b016d05d267a89e3b07747a Mon Sep 17 00:00:00 2001 From: rdivacky Date: Wed, 14 Oct 2009 18:03:49 +0000 Subject: Update clang to r84119. --- test/SemaTemplate/example-dynarray.cpp | 63 +++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 27 deletions(-) (limited to 'test/SemaTemplate/example-dynarray.cpp') diff --git a/test/SemaTemplate/example-dynarray.cpp b/test/SemaTemplate/example-dynarray.cpp index 680ee04..0b8d605 100644 --- a/test/SemaTemplate/example-dynarray.cpp +++ b/test/SemaTemplate/example-dynarray.cpp @@ -1,4 +1,4 @@ -// RUN: clang-cc -fsyntax-only -verify %s +// RUN: clang %s -o %t #include #include #include @@ -24,6 +24,9 @@ public: } ~dynarray() { + for (unsigned I = 0, N = size(); I != N; ++I) + Start[I].~T(); + free(Start); } @@ -33,7 +36,9 @@ public: for (unsigned I = 0, N = other.size(); I != N; ++I) new (NewStart + I) T(other[I]); - // FIXME: destroy everything in Start + for (unsigned I = 0, N = size(); I != N; ++I) + Start[I].~T(); + free(Start); Start = NewStart; Last = End = NewStart + other.size(); @@ -43,33 +48,11 @@ public: unsigned size() const { return Last - Start; } unsigned capacity() const { return End - Start; } - void push_back(const T& value) { - if (Last == End) { - unsigned NewCapacity = capacity() * 2; - if (NewCapacity == 0) - NewCapacity = 4; - - T* NewStart = (T*)malloc(sizeof(T) * NewCapacity); - - unsigned Size = size(); - for (unsigned I = 0; I != Size; ++I) - new (NewStart + I) T(Start[I]); - - // FIXME: destruct old values - free(Start); - - Start = NewStart; - Last = Start + Size; - End = Start + NewCapacity; - } - - new (Last) T(value); - ++Last; - } - + void push_back(const T& value); + void pop_back() { - // FIXME: destruct old value --Last; + Last->~T(); } T& operator[](unsigned Idx) { @@ -108,6 +91,32 @@ public: T* Start, *Last, *End; }; +template +void dynarray::push_back(const T& value) { + if (Last == End) { + unsigned NewCapacity = capacity() * 2; + if (NewCapacity == 0) + NewCapacity = 4; + + T* NewStart = (T*)malloc(sizeof(T) * NewCapacity); + + unsigned Size = size(); + for (unsigned I = 0; I != Size; ++I) + new (NewStart + I) T(Start[I]); + + for (unsigned I = 0, N = size(); I != N; ++I) + Start[I].~T(); + free(Start); + + Start = NewStart; + Last = Start + Size; + End = Start + NewCapacity; + } + + new (Last) T(value); + ++Last; +} + struct Point { Point() { x = y = z = 0.0; } Point(const Point& other) : x(other.x), y(other.y), z(other.z) { } -- cgit v1.1